From a2b9cd73414cc0ff26254ae4c08b6ea402ca739f Mon Sep 17 00:00:00 2001 From: Blundir <100090741+Blundir@users.noreply.github.com> Date: Tue, 2 Jul 2024 10:07:44 +0300 Subject: [PATCH 01/23] Larva aesthetic update (#6439) # About the pull request Adds movement sprites to larva, tweaks some standing ones to fit better to the movement. Adds unique sound to larva talking. Sprites by mossymothling (discord tag) # Testing Photographs and Procedure
Screenshots & Videos https://github.com/cmss13-devs/cmss13/assets/100090741/af0b0e14-de82-4102-a669-a7c822101428 ![dreamseeker_ZdgaRTIPF2](https://github.com/cmss13-devs/cmss13/assets/100090741/6ddf2080-36e7-4823-8be3-1a4f0023120a)
# Changelog :cl: soundadd: larva talking sounds imageadd: larva moving sprites, tweak of standing ones /:cl: --- code/game/sound.dm | 2 ++ .../living/carbon/xenomorph/castes/Larva.dm | 1 + icons/mob/xenos/larva.dmi | Bin 4499 -> 17108 bytes sound/voice/larva_talk1.ogg | Bin 0 -> 38081 bytes sound/voice/larva_talk2.ogg | Bin 0 -> 31617 bytes sound/voice/larva_talk3.ogg | Bin 0 -> 44540 bytes sound/voice/larva_talk4.ogg | Bin 0 -> 49994 bytes 7 files changed, 3 insertions(+) create mode 100644 sound/voice/larva_talk1.ogg create mode 100644 sound/voice/larva_talk2.ogg create mode 100644 sound/voice/larva_talk3.ogg create mode 100644 sound/voice/larva_talk4.ogg diff --git a/code/game/sound.dm b/code/game/sound.dm index 29c471f06e9d..d63e4a1b0c18 100644 --- a/code/game/sound.dm +++ b/code/game/sound.dm @@ -324,6 +324,8 @@ S = pick('sound/effects/alien_resin_move1.ogg','sound/effects/alien_resin_move2.ogg') if("alien_talk") S = pick('sound/voice/alien_talk.ogg','sound/voice/alien_talk2.ogg','sound/voice/alien_talk3.ogg') + if("larva_talk") + S = pick('sound/voice/larva_talk1.ogg','sound/voice/larva_talk2.ogg','sound/voice/larva_talk3.ogg','sound/voice/larva_talk4.ogg') if("hiss_talk") S = pick('sound/voice/hiss2.ogg','sound/voice/hiss3.ogg','sound/voice/hiss4.ogg') if("alien_growl") diff --git a/code/modules/mob/living/carbon/xenomorph/castes/Larva.dm b/code/modules/mob/living/carbon/xenomorph/castes/Larva.dm index a3e856c7fc67..8dc427e2c55e 100644 --- a/code/modules/mob/living/carbon/xenomorph/castes/Larva.dm +++ b/code/modules/mob/living/carbon/xenomorph/castes/Larva.dm @@ -37,6 +37,7 @@ crit_health = -25 gib_chance = 25 mob_size = MOB_SIZE_SMALL + speaking_noise = "larva_talk" base_actions = list( /datum/action/xeno_action/onclick/xeno_resting, /datum/action/xeno_action/watch_xeno, diff --git a/icons/mob/xenos/larva.dmi b/icons/mob/xenos/larva.dmi index d07dad82ed297f620a485bd09f6559b1afc8f27f..72cfb7b4e318bc9d129e55ba7b228eea098d1ff3 100644 GIT binary patch literal 17108 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 IZ65yr0Lcuj`~Uy| literal 4499 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 A2><{9 literal 0 HcmV?d00001 diff --git a/sound/voice/larva_talk2.ogg b/sound/voice/larva_talk2.ogg new file mode 100644 index 0000000000000000000000000000000000000000..e59f0e693259a5b7c4e99f3c4e1ff24d9a698398 GIT binary patch literal 31617 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

_e%BzGa_g)`kfp8&KesqCL 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 literal 0 HcmV?d00001 diff --git a/sound/voice/larva_talk3.ogg b/sound/voice/larva_talk3.ogg new file mode 100644 index 0000000000000000000000000000000000000000..c784490fffa9a346f1b8f8f02b426f3d04f4156c GIT binary patch literal 44540 zcmce;dt6gjx-h(U62eXhapywZV5CX71q^M1z<|;=K)4!^K){G&Ckb94q63JOcBV5M z2q7c^0nv$w4%f)l5(V38+Y=zcyA=V8bUK5VR&8~TPVLN@na+E@g>7f%J>T#5zQ6CE zZ@aTtYwxwz-s@S<{du;Vckj*vB=E!WAn^OjS4SrzkwB#C=N0;r{VSJ9#QE>LXi{bnQs8Y- zEyvTQz6~wf=NNbF*>^oW1ohqO1(yxv>B4$$?nh@pmzaIaf^M``=VjTkbE=g4X z9as{&GQBz6VXuHweZMRLAmB1VS}Qlh$-Uy_Uz-iy{3nTu6EnL$B~P7|503-ew^Z%? zwCcd8Rqt%I*Kd3OovrWJZ(FS2{+D_kZu;T;uXq0NmzDFy(gg_U3W`5+FT6(-&~rDw zhio*Bkid==kO*jPqVTrf4970Rsgh%7i-*tdy>eP|~jOFO>5yln1Be24ARQ z&y}lw+=P{F2S6_4d&>EjAT)9#=PF{h?0@ys{aK$vP^>`Y|9sTEz!$g>;qhHZ3^WLvAM}c^|7!I2JOdQ>|p72|9fyR z!!IB8bRE6XvHyAoqoe=(+FR^n-lKyz;WhsUoy-}39qd|%IdU{iBy=3re;u76m6W$lZV3ji=;FR=K>;sq*ykHvj$ zmWa#ZGgqUoNLGrG>FXQ59-GFJ88V2)k{F1^O%q?9*ncWMeNX?yt-^Kv?YWuZ{ohj* z+*HAimPD%m3nDSuD=vqhgjDhG8}~H$6V}?*>U##gaJ;5i!=nYaGce0Bbos=Zr( zbKtZ0>bEZ*_`|2~{NdB4pRG3iPsI8sENuJl52m8-uzAUEGI=3ot5Xeeb(>59B*e{?Dn~sopbp+7pivNKD%?B zK{>^ilXlBVv*m%gS=@M}q_Jb@gPzjMr@lV-e?9+6IcXKa@Pw3;QW5-bl;e`|lOZ*o zmSlbN{Tg4Lg#fKgS^e)D0D!B7vFQaLQRPN1kC)UfTt_0}5MT{{D=_0v32ksd7FTFF;%E%~gp+b2)S{S+?(R6^ zcuNGE9bp!wDn{3F;^EQIxypRU;LuOE9ub~D5!Mkpr``^mJGLAVUV&sU*}OihW0xiR zT6AMi$y9XYHP{U8__6t_O1&~xnV0{;sjsIFygIAS@A+2~zFYcOm0bH z3k!-l*!=26bI2#(FF&v9sN?IXtWW!gPWjyS%UU@6L-X7zpDk4Q_Ad@%pyTw_=A!atK0%5CdR^2)y&HzzdKxzDapgj#MyLjV?cJZKcHNIpR4!#|}r+BN*H6(o?S1Hx0j(*4>uirMI_L-*6$9B-X? z0KqpDk+Fh;32^wFI{(Oyt#IC+;*O!Ab7L!)A>BcVRovld>=Ac3hR(elo%M}E#m&mg z-@f{Xo?o3i%}Ch%;?k!FR`iJf?SOol9|w6Jo*3qz&(rnNRtFM4A`~Gr%RF`+Ju^Hc z+L9O^(vBvj5B9ZZq(@HNiV}xIh85C3UQl?sukTjwo}=yag?mN;7$bYbpHKITbwSOg zt|fOxSx89_pTYMxi~6`lw)iwwu0{5sv$s9MgYUnt$~>&M#Xk`DXUb;m``dG&W^pw> zbFkee`;reC;)#z+J4+zcSKxT%=E@#GAUYnsfZ$i>)C()n&R_U9s32gO#sqS&*pcS4+-RPr z_+lmykO3j13U@G)F5<=&wZe$80gx_3ElHc?FOJ?30$S)mj`wnlu4iNnMx};75VYSc z+}V$gm8!OJPF}0`?B+e;VKMq&h28Y4r+4}qD3vII4 z2RkINv)<-}LV3?9T=M9(_y<4T6Mh!ov-f)Z$zPPpZfW*Fk^S3k*3lI(NZ%?0MCMqz z>2TkfsoCWhaQFZLHn{LFe-!N*{Sd?8i@n&m_RN(V-)~`(*dN~T{{DtBC-c!iZ@_oI z8UH}=!&WDS_phwyhkm)4Ki1$Z5IJ99!;1pS?H@-#Fyv;^ei(rziTm5xKlBTM4}xkm z9NWFpxqC(2L+Gs(7<>?%PyFJ>$^@{uiQmkEUqUc?(j))M1|90>QmMG8HY_59ibDIrRZgXPf=taG{|IcCo%PgX{K;#LPhM z;lYE9V-sfs_FRkk6e?{q=u1U#H-EQ(g{X}!vYCKA*FONn?@({x_6nj6o?)zOdjA=P z!AkEI4g&%Qgb*0@ry&#|;{!;+*t#?0hTiuF4}JKs&J|Ya-nHXmzxwKZ#f_ktd40%Y zx8LuUy|gPr4@3dr-g+(mLg%{seG`iYiC-=gvh}Kqf-izSg;6`Ox_SLq+$eLRVX%_n zPYIb(Z>VR~{j_LZcM-F2*xAqC0BsLK090#;X+e_DgpVnzYaJ4a4p zX1{-@@h1s)s9_Jehc`fD79J?5hPp*8VJ_bFW!#2@*W^ix)bvbcc22Gu3PE^a;57i+ z`~;$oqw&qmgR5GwR#qGP5T~6B)in7F6C7Z2Kq5hcfyas{C6T^2)d}Ahm%xgtzH)b3 zc!4fDM*`|>MhCoERCuCTbb40Zs5z2E(jguIw z{UR1uHiIxzoC-yoQJJnL`GG&|1v;%vM1&{Hy%umi@d`OwH?`%`9UFWC(J|n>c^k&TRpeSYr3b) z@Q0?XW7|FBmfAWmYYF+xcF83YPMGy$ebw@dIRSKeN%}K1vW1Mq zBpGw{tlZoH$cD61h3JHtO%uy=5_qXHsX$Iipf1yJ28&!4XHItq;gq@yE&xQ-si`Ahk^w8Q;OM4j!SS&DTom5GvK0#OvDA9R)U0JQgL8i5J|)m>SbVRT0xlVPhhm=Z-J|v4-e#B(;-WC{mZm zO0Z44Fb2o0kq5h~6HK5CrB2;>Cay8xl>r|{O?i^ZEVr38_`#566cX4nDyG9Z1bQLg z0w=>mu48c(N%!S$THNkVjv&osBg$v|)3Q4Wyjx1rQl^q|zRkmWW;2t8EV740 z=5ny?u0a8gVctpE3iHLr^>+zI4MKrzQ7*uJ68X4{q<4cj?9gQ2%@SN?uLNxwQP~&c zDuVC28d0Q?Q*j-|Xfzgtuxv-?TruTvVzLZC)}2i-5AswoIo5z7hc2SWVp(gxw#|2>Ab--ul`rTg>?SYr z#DMS>QfR12OX%vtsSYo4%>1p?-(wRR-~4=)lFZ3dCHoE+y0Lh@#k{C(SWxHrmSZu_ zt&C$EhI%6|ShSXfF;I}4@?>C;Y06g)uhk*;SVqivRJF1D{Xkq-6PgHP5w{e5LW|f3kPEI3RRUq8FI&5Ch_&1^tr% zs^$7scPV?_`c1YmD5B(A(_Ac_-Ky?dFuYie-XN5G=Cj1Tdp6 zAadP9c&TGJ$;DyeWR{le(IJ^GmR95<^Qm%*gtyr!t(K7P(4@u-0x?pL@TTr)`GKL! zC}9rLk0}_`O|B%A*&q~2Swc3jxd54rlcbD$G>SZ!Z5G>r-5ey)@Ld>+Cs;5ustDF& zqCj$yOwlQPaFO672Sd?XMi5vII;DL|5Yt66X(pkPu$HA5=_vt{F`E~ZvKZ@NN|~7H zg;E5dTSGBDixVjYf;hB6|FoJ<5=a8IWg5F#01ySb3}0R=i%SUfDXW(7yg5P%wF^up zfypU_+`SCw)71>yq@Je1$tw&r6(d>zp!ruAb&L~oBcN+ZOb-h|%$z8#*=9z{O`YZ- z*)pSUS%=rvJdI1RP2L$3GZP!}1Zo|CygW>RJ>bX5f}346<0g|Q= zHM?ud74o}s7rxsaUq%sZ;9%Mfhm&+stjR7Z8cx8N~I4j|;4#UD`Zv*0ElWQ!|g9KeI+Z z;ja%Ag&!(-#0EvExEZ~pBQeZ4ca_`);>&ipu()!_9WOSv_SQu9SKOL`rR7uF?W z!N;{XODbyf$@3Q}41gG#lrDgE{aK`9c|Df<#z=EV?AeS1 z7B8n+D6I9Iq88*SPm;3B%A(gs{`ptuuaCE-E7$eaAniCQHz7R6E6_Sg;!cvtcloRk zwovX)?j(CJ^AP}bT^RrYzQr!Ue#ot@u}6nCx$TKjD0`rCLlaewP>(ZPa&Q1{=7Zl| zO`wXsr9WAJ5V?#f8$G9b&Wf6uhJXTZ+MJWVrH zMZ|!q*M3)E&Kffpu1#VLFK~|)jyP(1GY2hNFYk4Rp}}2$zttCSpFbn7rHK(AK?1AJ z1IglvY^iV$q%h`CIl??h2KSD|B@-RA3xUXoYUNUW za{p_&zu7t)MFQVF{cfG_gYcJre(@jwtbLm_Al}i}UBFqhQL+Xv7#>(CP%>CoOpE54 zk{H$4uqJlWGUT^$-mTs=)Bu#Eo*kpob zxslP<$5FG(uQv)=(VxFDC$XJ)Bd25EyCuBT&98{9g-;B_dd=f8CvNK4Hd-*;sDp+^ zPr>kkJeIYosmY`7a^zna(@3a}1;a##qm4(N8!tMeDJ^9rUNI~cj*59!bIHWU4d;6s zMN#Ly@tG;ilFTBplB6KbIHutvo}wHQQj1D$4KiHB^0@;oK%5`wEu|y`9+X!n)CS2Z zNhX(B%V2JHCu>mabdQvI!ORgxT_;*tH&Ek4ilcrrGJgM!^Y&|+FLQmAoBlXqy=~k1 z@`NkeF=A_zs8dt@xAXk2h*Ol-1$|~?iAquh#r?wMVAklzcJt_3N2}k?;7nJ}G!)g= zn$NpOOd^NQQnz;a{#sz&?kg*89BDh<@@ld=B+_0mXP8*uS;$J8 zPKmyO+? z=aDz=9ep&vZ(^IQG&YuM=-Bni)w`D!65ceH?lm#=sCZ&-$f9f4lrnPi{6?A!)=Ofo z9t=2-)neKlt_d*iKs(gaiwRg2%?bvuhE`43Py#!6VH%K7Rt{Tr;|Aa*(NGqZ;_?r2 z-E}H(@+8WtmnlS40&>)(>oi4|EoV*Pj)y&j?qt(;U#rF9(8WCF zDNpi7cn~ExRaVbn-REP4N@q}&_wM&JFOlcB~0NBb&0=rpAB3VL`b}-_k&E|_WM35*9GX3j2qNZ8k z2af`b3#}Y09tAS|Yi(;z!pA-wKYqOLXNLM)`#$){`RJx6jj_I12cux6ujn@`VafoRLHNAE0DLX~dJd{z`B9x^OaVwBc*Ne1Vko~S6T zY&IapZBR|Q3>)GsLULYe zrtEBGy25O9;kE{rgy+ds1>s4BB1+z);6qb=7z?Fp!1`=Pi|oFQMeY(YDiu*R0F4`0 z0RHVa))VTh6netif7bQ}ojqGsm@kQ~(nxs81;eA;pNvmLm^?GgHCE?9Ng?D!BB+g* zc7$q5ACFDLt7uNa$r!WK%FELwR>y zNLFFaBfph>zC&D6^%B>&dEb$zH^f=L;u5Bs`+ix!c4Yx;RfrY^&_$C(zrtqFwq)H<_HjWvLV3fFx*QRX63*^4CHKe}`>|jM_#g}u zks=Vu%Yi9JUr|U&PHMiuL3qnLi2yp3L`geE)Ll{ONeU((rB8O)a>gi+0|mhxXB-XAsC|m_q5h6gg)ZDo>~^={6$v~9vn4i) z6>fcw+|`N~xm;@MrQmp^h|yYpJ+4ThyCJp$2rT)q-U$96>W%F zJ6e@7cPe5ic3NagnY^levv}=PW1TKpz5md7gF7`PD zAuc!MU^A_p@>G-&AEgj7m@}+r(V-lcnk}Xry56O#L2Gb!Q{NoxP@f=xN*5^p1|sC= zpzCt}{;3UHUklo^`u@P}_d?%Xxb!Fgt>*=4*FOGiA=;g7T^noCFX26}_MVnpR_5nD zi5?v(nBz{1c++|rqgAG$OsJ+)DJ*Nj_>^=Ek2Up6Vq;A;+Vu>^w6t?ksmu%cTe1jR z5=0PN+m4Q5ENjpO-C#-ixF$hCNGYNd@?aoAHn}i_>8hq!dlU(zAe;{^nz87JdJ?71 z(olv4*0Z38LZlJ31|cHZeOIe2`=soVIb-)(QYrH8K3+it(*Dx8*N5k}Y6dAezsmVU za@iK;9yjMlen~y6U%k#0ZW>)k-I+W#u$HP1ia2Zec>q!PICt+>){am|c=p;+@mZ7J zyw<8)0-?_xtB4kprPF-G0(^uNE{QPL0qFY;f|9{9y^Jxat58tqjT4ha0@TCSiDX{! zvLtyDVk9o&%|yLf3cU?3HVu;p*C(B9MG?+=u`)P6<*S9X)sknwoZQI!q^V&27w?Ch zc%}Nn-4A9B4*r8}Pb_Pz0(!O%NG#mXv_%us>X@wI@G5(usl=|=JdtOWS3*dwE__u^ zt1U4@MdaF7+5`GfJ+y|UBUFQNLBB<zbI!2E z7O9VMY80adF{RR9Bysbd&@(bhA2fFt3~L@s=MBS0PESLPFrcSuIBqd#3UQwTjKF%C zh7{=C3*CEZG7MQ&1V}omg4-qKCA*Tv%|w^j;^`q6n^RyWR%@>m*$hL&XnH3)#gT%B zWfnn(<}A6$O{*beQUc|FdurQ9=of#o^x;0zqyJF-=eY%I&dcwnTb$s~?N?%}mOAuy zQB|SRn*U42oc^Ro(VmjO?!K0;hfG&br>|A)^xODEzek({^b?xnc9P?oWWvt#Q>2WT z7JY9=1LKr}!9+02WG}@`giVQSYh-d`i(YE1mRRZq?ZhPOshFDV)`efXc!@>VC(wg5 zBwHBZrsyO`IIIV5#K>+$c~=Mm#|{Ux4qxh1fbXta>K?E9;4cQj?*BUK=Y9L7ivL`Y zUteAmdls^If!b($+&wa2?AC8tlRr&9Z`ZEdUwnXUE-BhF&78|I<_r&PSFdH9HxCxf z-P|1-y5Ei9X>y1Gu0An|f*!FSVF*J-y`c&%o@S(>h!0xLx7?K0XC?-l1YD~(O0B!V zW+m_dOPXrK%Vxl%;JS=l!URwy#!z%4j$GWH+MR1oh#Y4z#P+LDP>CQ_A&=_iygR&S4>yB_BnA4zkJ;Md1a5G z&^PSJ%ZHMm#O5tzS27qy(2nyF;zSLL!JI-+YyC5fq{Hm#L@SvUMvZRkx+#tZNldfL zKW({FHq%mWs!8gem3}GjET6%UN-C#rXrT6J%($iC;gz==Sz!J{OP@zTa13vx+|*+( z+RiP*O-l__(K&wS>)rr;UFxm1$k zDunEBT4WFf0X)DMu&GIpP^plbyW{Y>NnN=@LOm#`CK>M{#t`;XF)z*d%w0o%05v^{ z3z4v_lL&W`!}g|j5@e}SkE}%_nh*m1i)OFVA8du`9NO zm}Yy=OMkX|Z{cVx&l%&<7Zqj=&*GNhSFC-Kb+vq_OgT3;kTM#fKP4KX^3DgC3P%<{ z$baIB7$~9BV|NZL81nNO)5zT5_O&xZjv(sT9iVi(FnPI#PfAo|Ch=+UCUlho=bK2@ zkfb=Y#)%5pPL#LVjqsV?fZ5>Ts2E0Qjq8c?5OK4t-*;Thd{1a z?)+K@UtaC|?r*ohHm2b0U3mJp+h343MbGYATq@Bpw)r{d)YeJIqHfFZsBSXa38DRx z&sjr*@8O-i9d0`+itPzC>6VTf_KyuTE{yB79Y@&H*~4_LY^+FjHS`#1nZ>uTb(9nt zrVs!T>!20{`ml0P@-#(47eeJqd;`RX#|N&;kubWkz?tP|8h-Qsna2GhY)nBS1bjKL zP2XwVzuXyA4??Me;^@$v@Jh;ei@#s}x~$)@G0c$rcjrg1{7Rp>P?bI3cedo@=weAe zdBqZ1ke<)ktK#8~4%6sjX@@1;0i8?qVj5wuat`;H2G*-19d#v#ZlCrymBg$~j4|WQ zrrs>p5kgC=hB|?OZLSs}$tm?gK_^2!(=a^OgDK=@oFc%{RGEU5X?zMp0wM}nzQ}3~ z@(wtZ$fh`CRHBn}ysIceO9kv?(xn?|uh%-(kr%c)g8rS`_`#Ww>CEH)Gz8A zd}H-at>2tJ|9o?Re$ivtqYWrX`N^oGq%aHmC165r;f}b)Zjq&9cp=(vBA_5YZ?s_Z z6Ye(7&d|3xaf+AM*!0g(qe~$%PO@p$FnH3?SWU8!D4UIq6e8>{LdB3;Pd9Gw3JSO} zpibbKgzZq(NnqC1L)}0otsxLR0a|DFN^R~SgTi3I3}|_jY|8jD^pa70U*Gj|+P2vH z>|I{}s(wp4+`XgFYvV%FC*pNy(7dek9T8tTAZjlSfB=&8SW$b;&9C z!3Ky1wJ9{<(j?gGq;W7*6PJLvFp3nj)nN=KS%~tcdTnNc`~X@z-X9gxzzr_|l#fm^ zJ`LIXR`d-{aps#l-+#H}N^i{x`S99;>FhPbo(Kc9mYYUv^Cb=sH*X}i;7WnDu_Lr9 zrZgpSlNxNZYFKmn1E&{KQ>31V(9nYLVND9cIN;L9%p)dUo)6DB$5+Ix7C?;AQpP8bi$Ten^Y$v|3?O*0&?dgKMWfT$NoRD#7u z*6Jvby~wiN+d%LWOV75QFMmzUy>WPaon_zQ4@St@zgVc!cup0}8!U?*hSq#vS=PoZ zX!W0LT1Zbj)>~Jyzj7?V647P~5IO1=Zsn*{K~J(f3mL5cpzPPHQ zeVx9j_pDCl5)c7Txw%Fdh4zY_Hx!t=W zfWeU=$9wPgb^NCFpy}5~$3{DkcXT>NyASttac3_dlj^QU#ZSG#8vT&QnUNd{di>X_ z!YA0ov@~UBqVV*U(>?Et{4KgA%>h}YIsb7q=In?F5fMvqOA^gOX50YO2cX4}H7DA& zDzYIa^HU^Q(JmK=U|`leDOW^_Vn-Nq8AwcE-SSh7+?7n>8!w0m!W){&I)326Nsy4% zY+FxRcEx))cdnmlbjyVUYK4apN@}~*M?RDd7YUkj0Oipezx{ms<@EI8mOp-b`}2OA z(YUX{V<=kEEe7yP_l}0HG3>z|DavGzKHte?ZJS7r1kl%c<<^)cMIGx*%uiWJ-RpIG zY|g*}lwr-XfY0=h?CAnFi;!32DKe=sjLqURp%W<6EfBNn>aNgDqZD8HO>GQ$-Kobnem48FG?JWyaKAXU^}923k}G0i zuIi5+p4T^CJ8ff&z8$ei6sPr2@zv~{j-G$HDnHL1UFvnrNq6WbU_5P4R{&2XV>oX| zni?(Cf@EoAl{Zw;Tcs)dy%7VtxDBerHyvI%0foj+8^ed=Bp~KUl7f4HmE8yqHn4D? zdu39&6h%UppW@tBS!yTeK_|`*n(+acV1ut+4*iQd z-dkT3T~ZMH!O6?<*qYvLPxJ!|RBOj#$&zlTa!sD^x=_bjM^kZtDQm>=lSl{2VQTzb zk@zHg-eDMMDEM=Ms+{Y$JI~s<_V2<~SG%n=GG?w`iPTr)n*{;|im4LlMLHPJyN3}e z!4w#u(vo1xKsrU?_9xGPIQ@Pjr59fo~F3kA^hDad22S#vCsmrR)`d@>G`Z3m9V^TK%3 zyKuH6FD)(Yd@n3xvc?X3^fJmkSHe41Q{sGFg(u#BZG0^%T*sw&gZXb&s0tuoH4fST}M3q+QJchm%l?7P_Skg zH*mb?3QZ!S>GN^Be&Y5|Moe~tb`KG7miI{nZyUMtTypx~T&W}l9#tWt^9564WZ8_O z1J4xWJD?b;r)eZMFELc_gkjJtA4j53O5O1f81ecs3fDRS93Fzv$TB9JH;=`aFT5}->dlr%vPN`D%+%x}bp z7!Z1oo~M4isqDSZ3&P{SzxXEYk4L^)w4TN+m!q-alA@D$dQJJIDO|rTq4ToiD=7iY zY(`?KzOmDHVgpQ27<5DwSdSbZLd`m-j$`#gDhi`A^$`Jdk_85I1+KURY6I5Tt}wde zDsmYaPz}r0VdW-ZBe3{#`k};LEyIRKX&J1R{i))>E)CxX;|iH+)vIM?WD;c@ph$k4-R>l}@LXPGl)rF=dtJp#Y|#>bP$*!}IXbrcy3Y z>~)lg895@V)(HdCQi>!q7;^%jdn%C%am5J)_XyM$cNm1i$YZAv1hJtZyFQ2CicW&N zHuHWh*~g2+S!0mD9vS`iw-2vCIDNNF(VIdYg*f-gs%*ioV*OBk;%rq)M5e~$zE$g4 z&6pmy((|o8WkiaaAGYdIV?^y?Dc>=u=dfltYx3101YpI7m^w}EE#|u_)av0pL#aZ6 zG$x*vS?gJ5)sTZ+>WKQj9F&{p>Y@nY?_9L+`2yo~ zXsGMP>7u$?F^H4c>R2S+CIMSVkj1u|XB0lv^<70k4uW%NbU~4V61^c+sqB`*oEt*m zuMS8&sZ%8|XYT2?|6^hU{n5fg8YI8p{qDQeBdyiE=9a4c->li1dUtDFQsMB`%+t_% z>R@VGE`|4)^3Ds@X#yEvzhx|7uBb|pdb(&eB4xSm<J zU6HnM^q8Y$0&=4v=)2cQcA9lCBr!ed8n+C7Wnm59A%=z;uGTHA#2N;f$&zfwbn!%z z7}_19+K3)~kP9*+^xzaOX(oaMD4iorVAV^39F?2J2=wV<&B6-N4kfi7ejR9H_+uh3 zY?riz8+;$Ke+p%$CUsIB;iV%5Gdp3P#Qi=5iqre|U)#K;G9|?O&i;zuo?LgXr>*Yk z$2DsU)@(~&pW8iD9Gt7_Z*NUeeGt(F<64i$?L8)wj;@V4uC+Hac{g)dp0a3)a(cXd zL2m&LZ47_yJnHz`MF3qRAh%+(Z8@!TUGw+FUhyniW>Ru$MoLY$M<}LCtBvUb5k*en z11!Fblx>SEBVDgat`;@R-9ea(B;wVyv51Z{Aj7>E{-`H zX-jHRwl$VS!*qf5q8a>8miA85t1SPQj0MBPEvAlJA9Ez1UtSgV8U1(fwXc8qU)3tV zM1S4HK;!n(G3Gkn#PE_1lg+5;wr2t9KAR& z*jO%x**6O4n`OaVoSIw#dc-`bgTYHJ6h+=r1zHPCJ1}|C4H@|mS1ClWDP_QMxgv?# zDObA~^lF2iXUKg+{qU>PL#-A{@a^cG=hT7BaY{y8R-R+i7kA{FT1r=Ma|WCh>GS8t zW$q0-6^im0TGyYqzhv@+>p5$50Na>T(&}z-ZBoZ*C?9zt<@9X|#W%uk+CCOiud^cQ1QvY&M z)oVEL{7`LoeZf~c(sTann}7EE{>^`>*pT|kvu~b%vHfqAubeD;J|yZzoyhbIb7QPq zJ)Npld-RLCed|mE0ldfKoHfp+q;Xq%SJZqnYhvm666-+TrYE=tAORJmBsTmgmn7&? za2qaQG*F{6qGXb>i$bymu~}%!GYu3@6nZ_gazoEtOLts_A*xVulAPnOoWa>e3NlGX z3njPW-l=bc1plA?!noh|Tc&OE%%_2O`1ekd?^P|Co4O0gGR5O@>w#&-NL5FKMmaZg zt9jg?Y1prSb9`vAyCcHlVMU8c^c;@0hpDL94x@O z2kSxY^gSKu7TbtUJd9-X+;fT%6&iXdLqKR{Vp|%tMjxarY;jVpAkBIl=afA!A(10ZTXUG5Xi`K1zmw&A6TheJBtD)I2a<*#V(J_th#1g(kv1?~gPtvaP z5KC@{Mf;w9ovEu}eb)3YC_WvU5%U6S?M)eF4w+!~cT8mQ?PQ9m)jX|(x(^Q%poz}_ z^cbV@EDK2(>DAm>+tNu`OqL@ys<@=gCIq|DqG#0%dD+F*pdxfqBZnEPS{pe{d$Cn0 z@|D(I>Z&PN^_))n7TiZ)KPesAaCQF${+$P0Q+~r+e|&h%uqAI^beg`PHvK$6UpP{g zm?Ktv5vsRno~R|U=uPr~Tj3hBADRF9Q$^`34N3B9?u?ct7r65{T9v3!asu38p_@{( ziT+d?jE{%t$Ep*UqGgpNFs0Gy7AGlv6QvZ+7?AFgriUJGgqaA3`b1P}SCp8NkyEU0 z%M{Y6O-z>}SH~L#&zE02^X^a9e_LLzANT&t(RV&NI(X2^>HTb=Wc9WfcZB7*sW2^t zwMOnM(Olsv6%xlCbBA5Gp5jh?!lO6~JFiKBdU#X)Yde%aMDm!%m`=fXwK>qVfGOx< zT3TE?F$F^J>Toid!D>YW6{PEUnqEP;SuB)jNiAxV_lvH&(e(o`Pb+GW%V6ZjsJltr zJEyMw@v9v}-=-t)p>OW3+7gyGnnr*BV-IuN{7h=2errsuYTLHqwWb06o`KnQJ81>h zMcqJQ8ZtND5lYgBpC?G#p`ZxUnE_vq${8gBI0Lb=%d7Pa|D<%qCQ5P~n(V%-Lorku zcu*)52>SYiC!xIvGlCIn!}MJ(QDatcg-Oytt5%DqEZa~T5f?O53|*IgvWNCe0f@eI zdH0t8G^x&g!~ZOJ-EX&lv?le@_5CC7I*yx~I(R)-d+sI`wW+oWv7PGePk;)V69EGr z?t##0rXb?PafjGd$qC)+y-8CZt%AYy9u0xf=Bo_>5fKTp7#8C1kNEk8oUnBUY)Y+3 zLvcxzTLToV#R(8JE~fPBh?K zkZK|RPUuhcR7NF8vz_Goll z_FexA?xtEhxt6(3%Vq=Fx(SwGnd#qh-3EyDqjHa)8k=U~GNwPt#O^<))`qg}No z_YcA|st``2ClgQ*45_<-JYbl~)P_lYqm<5vK^2H|IshuEEtICDNqb@#>T*Yq&qu2@ z?Oi!wfI+W;`GgN2K3s*$u`^S_&j)I|4&P93B?Tjl+v1VDimcbR9_Vi<<=zVaAoRB* z=Wc%H(K`cT&pL3JP90-ACFfeEq>Sm*uEX_19-80WKF=;6>rly3R$eD+F&wg829Fee zF{R_ohlpG#hqO|QJwsVOlYP}mNref%GGmZlYX`)UPKMRn00aG<2+VQvuh_u={+Wu} zWpTOOLlGUN9440sGnE^94%tcSHX07T9)r%UpN9P7rs#{WKAHOD-L_wqv{rn(`_6-H zaPyvw$@a<=S=)w7Rq$J!TVty8ON|5VDW$%wVZSi=9mMS?^(Diml9a4ue~e9T^Z zfpa&P?&p^>zi+L(2VBH~J>3Pk@e zXI7dGd-<2|n~||0ALXm>+;|fC?4_GF-e2=Jzf}2)P2V*{_on=+=v)8#T%qW6SHwqg zeNn^jSx7AgbFaBXBoI~6I9%26Le7NFa)5N2MCizB^*FT4Tg+Uvq>)xqrZ%e8nuHT{ zL7apsTt-?ES+=54A!#MbX7C5@c)(`qFTor_hUtAZqf9?@#)Fxk6^n0Z0a%|ryX7}# z8c-&FBAutuL-NQ#n#2u~2eT68mmt&*i8fvJsH zbGgEFu@Uo6rc%UIbg(h*9=}xvmeUolY+&Mg{l3!K+J2EHi~>p%Q{1mq-1|fQhmkY3 z$N}?zrR@9ee9L;mOdo)zFwI$&s`444FRH*%jyM~%>ekV^qhv62OPN?(*u8|9?`OXcA$7&@5 z6);9h39A|=$-Vs-J{uyz|2k$9fLe#;LXmI>{N&I-GLk0r%gk;9>(Pi*IqG8N@B^tB z&ztDt8ev$|)g^^INt&2z@1v3GDi2gqB6@Jv_0@F)qe9zL!jfweo-6LU;J5ErRq7!`)QaF>)hsguDE zvnSgS|G>Irz!2CFskB%lV!=;N#Pn*uS70(lN(JC=M*=lpy&GglFxtc6cc%dOW&F{W zBNzYsyRb*^;;;Tkr!sxh{a^pDL(jL^PJDDau3tP*vgc&u;5AGo<_=ZT6bRI6kM*V? zcuvY=Loc-FxD$9Yy8N`A(x;Hqgi>RY#@@oK>!lQuB7F0RV3ab&R`HogQnryn*3p26 zC8SJ>Fv34d&#;?@1_vS%Rng~2eNn;5#bstt8uR9^cZ2V!?PohSp4rk?7NIOE+OyjE z|8Vs#a82F!|NlA3Ask|$=j4J11e=5qLWDNqVgtG@2>}8I8X%z&YnKGPkg5Yj>biA1 z2@ntABH*P#vEyb8Hwy~(yZY^xKtQz0M8KhKHv~J;+D*51-|t+z{XTsE-^c%!$0H9f zZAqG(^ZC5rulMWq{0NIvb%XJz6NT0i;N_XZfSqUBTzh}XJU(7BWvjj3@b$Zw?I4*! zmoMB+xm97U1XE7k*~eWqgG~sZ57lPF_(W-iDM3e8LQ_7hiGCEBR+|zW*)l~`u1JY# zd}c2p$7`>fTXjreff_})$6!Plz9Yb{K*M1>o(n&V^ zYL8V&a!FvY6hbFS5KdtEZihr#lh#tc%*)NcaW?M9j&7(d?bFUDKX_vx@O8?i&OQ0x zez3*3QWN=E`LS|fO7^&>rez7$z-i^3&OZRWgyn}ogD-RvLZK}wr%2Afz)UP8gUZC@SN*hVau*qN6=?*)UYbdk6XVr;IkmKXy(<`~Q7O zCCdNT)|yd#J}YlQ{jP`wVy#@8#ooR(-01fvW;;SPLic?Dm5@HTxpOvpoH-0 z)k=tN8Igry&}K&g*YOOqCnL@om_$RckOsLKqB+b-{fHfdp!-K|ierWtKNo!b=*x%U z)zO!)ql55|sXzZT?bkuCWpO>5t=eV^56341qDR` z-(9Iy1)RLP!Nn|H=Cy_(-qfLS(}A$C@OfEaB&`ydS$m@gua{C5!clHsS{i6>b~RJ? zg{H5$54}{PlP`4*^gA;%r&i2FaieAb*9UGs@Tp(>VgSryOL#C8_C2*Y5+Q8?sVs-Z z?YSR%_5s;DP&;);9(2}{deC{sSw8mz&HdXYKjm-r8!{G0T(@kzvk5`tk-&7ZIM&dM zQr>>j<+|lJ1e67XE}_j#>*?`)pO|?J8*O-)en3 zHF0Zrkj_5Zz&T<|opM;-$Zq8D8W*3K{fE2{76#7HMt2T%Z4I7O!fGZz9GbuAgUHAG zBN-5B1qOW(49>Luy>+;Fb5coI`2lKuZf8Skdp!&_J4s!VE2OclR^Ww*J$;(l7<)bo zccT?hW4262^2uNV71NMo^)g`RpUlv(;0>j61=486NHARH9-ojf8dU;rW5x`seRgzx zN5s_`4RIc^8QAz8F>1_V1#7baYe0zF6#=A2VzDG(OK1rY6~5l1+}gQN~7uAuM9U3T3G-k9yP^eK_o8L)GboU=>aLIK|=Ey=Ds%Mlv8$M775dI68k9ajGdmn z>?2|T8ch-w%SW61J`FO(fpFDxw2kt|$b2~eB+dpp%)S{SPDsOXA-=3XNnM*j5|C01 zja`A^30i{hfgEd!UBSp@O!xsAqbA7g1{0dC0a>za8qEq+dJbM?o`Dq^%bjTJ;TDaL z5JK!2E2Km^Q3z-h!YU2OrwgaC2BK1}J1=O@h0|eC?R6iwtB~xQ!?UWHps^v>C=Fo& z*Gk^o;Gx;q^%vw1Q=jvT1<_sD)7yj6;f5pf*C?YlSb}W(W+3-%>%m>;$oq*-9#&8w zPyE#O5$rM!F?uB7T&0rx7~D^(`mJIb|aVNv%zP}&sdF<+z4ai zqR?~8W#P#)^XTJ{_456v&hcJ~2VB2Jh`;*Yv0sbZTpJ9<7bGtBhH$xj5rfBqKFN_5 z(~Sj_DV5meFNYqVcW<5djonM^p-yeo6sWlJ1I7b}MGaPjs9F+*LO0*b6cftj-Mkf5B$dsi zWk4-WP=jBC_%z$=;=mHVIlD~LlpGd?rNxy2H=nwUK z*`j5L>TJb@!b)>pC!W;O$$=iB0o*P(HxW=}zS3V^x0V7)_4cxMZVK3fLojoQT!gCC zAeoOIVHupo(4TN$31^yoR#=R+IhVVw&8qoc?& zfD23Uc^PL<<^a(^2)TE$8 zjHZ}ML}Ug5;OREGGm1>s@SUuXv{Euaz^hFPcCh$V-w8uItZd~nLOJrR8IlfVFVBS7 z1(i@)lOh_E#f$Xbl=NwCh-_VX2x1u4IXz5x4#07f%NFtpDf#i+uz?e*Lkoe}JkL6277?o#PMieFM@=);Q2#^5wDE`kB$UnFAH2eQ_oDKJTz2uV_pU)U*0M-&Qg-{Fje@^_yeDF6W~4 zBR9Xa&>sI32{``g%S}W~7K_5!Rbc_UybS3)>;xlru`q(mw6^OQId@=?!IdkWK7~-; z0xm*9rO4U@Vu(I8t*`?$-ap7nQA6=QZgIaBNjuE`MlJ^Ovbkm`_Ur>Bn_vgP932(wpzLVmFf^*PcFI{{FM+h}aX}AOXRe%4WFymQGNeqwrB5ml;FkddW@sANH_bRjnK6h1 zLjuj6a?;DK!vyP}8@Rr)kKgV4Mad@vJ&V}_Bi%7DNzuGa34Dd0$UAuSo?pK_2DmGd?karKV)dsABH8{ zMIpmkgYe_QUtNUSieG*&^=1N9Uo7Z9euHVqG=B5@*LOgW((5ve0nCRs`V(eOKN$o@ zqR=_>oK0ni->zSi?nxsAZ$Gg^?rnjHC(H+sft8BH}DU~S@Z zxJ9f%3FB4U7VvLA9f@=f3v6ECr6|rgaL|zWlQ^r(Y*K}4baY;kEOb}KLe|v>%L}UL zgT)Co1%sBbWd}tOP9hv+kq#VypsGW!_uL4Ht2>EWiLGbty+xx$OGMk$q9Htq)cvF@ z%Z&9r#SjVwxh89AjBR&KW9@_e?~Lq>4h_CqK6KLhq-gj?MkH9EPH0+GBn)G29nHtwx7#vTfC$`y(9Cs zmS*W{b5D1H>YuWZw>lwM57su%P* zxqb13xt@xxzou;Zvy9Dp^Y5yxk3Lm4Y*6JBaMvafc^X<{kEIVWje`As1KrZX#a35q zWP3_V2s=S*6j31vJj)7KSss(s<)u(OFguKi8C&bx*ZYuPZoGSbxADWa`)>^<^(Jh%9^!dmma{sBYElziZ3XX< z@=NvMLY`59N+38{Qz;lwKP<@0q@gIh6b)nT1u+JNb^E?39E!-8ZBxXzbe?fKvFuFI zsjO^+S*Q~Nxg{|%l}BSmBtc499oZ}F67>0LVAtYLr}YVW(05VqteiOmzw}G`;>_=Ot?bpj3L!E-Cm`T|H<3Z~XjlFgaG&T}}z zNW!Fm#9*A;?%KaoLf1?;(0@C+I_-3&b}7>Lur6FZlKIAnDBfLv8_|!J3M?v&Pvgq% z*F@}&Ug~a9>=rBSc#bG38y~)qTWq^fK3=5Twt&y~*9uRRJl$#>)foEQ`Da^qj^DQL zxl%jRt2d-VG%0j|t0AFWrR*pJVG%LYP#Tozi0kX|)0ku&KTb5QW1eG(7?5MOYc41L zdiix6;$~IKn5Ci!lkOTx z@wUYl%hJ<0^*CK|z>Wjl={#nI zp=SnDQf}*%Ee}%a<1_agJe|(U{IOj6=52sTGJFG1e@M*A?lp*i6&6(%#cCNN1YJFiab|lrlsVx zA?T@w9Hle?W++FaB24plF!;Ow#(s6E@Zzqi(yl*$dF|MLSD&c*Lb{oL?7i5W@b`pw%01#BFR4#S1!=MvWnAHovC z{c01}45_m+Th3={y*Xl4cL5Ci{rZpR4Vk6iN|B`4{G8lZ%(EenJUul8BrLY-;3 zNkD@urb$j!KB9!OPz?*;&;*Kz3Ys}^zF0jsXXA>MK~P;Ibg4JlvC(P|R{U0arRPsi zT4vF=sG!Zu-wiAQSN<;G_W`goYi%TgPu<`$`~RA^Em1lUUNqWhmU=Q1Z6(7_l6ZH) zHa>b^;GOar0wanuQtQC2eh_E=<6SFh@3)n1G!9CZy1dQt12w+STo#H7vAS(QURsdJ zGmQt7fBpM=zfH`_49yN6w4^JnUe_0UOQLo1(9}fg)XyMt=!eE`#bqpL=Wnb;c*a5s zARI*3EP)^~Se={Em+|YiZ_27oQ$59J2fC?6arx+=DKIub2tEDHi>?e8L34ZhZKeZP z48dn_fixwqf>1d`3Y}kgWM;R}wv@RbTWsj1T;*nf*=ew}#M@L;+#p|y!T$;h@f|a0 zacdq-dc8~0ApCm=28vj3x78Gy%!VLhdKm>e?1T!TZT2CG?IE$e4(~ z^e4&K9zy7|J_pJ9Wfao{@Db=3U|1omAOyI1q8AOHR0#G(0llNrc?^W{-{qavPd6E2moNAg3*Mg(JIVM$x7f>gJFAq zl7z}-yIm3PEPcd201Y>(!L8-a0PFiQ) z9a_%k3Xq)lj(`W(VGw;KVfqSBVUdLq8Yb%C<-G8+-!&vACvQ+@4`%-eq)8Xo*7j?E z{NA^xq~HZ00}n!xOgc+hz~?67sx|E=>CEIUeV>ZD78lz=e;x`$Hn3Nt@Lslye_BfC zkCg4DAZYnEDQ0P0SR@k-1RT3me++pTsFuup`OBrg7cKHQPloE1e@}`R-)Y(t=Q&q% z-;@Y$odiY6KHrmAD3rm{>k3dX> zlN8nqWy&QJN@71q6$UYRbh{jodXC2`2?9CS#h0F9P`TM9pS;k%cO=D(di%Ts|9ZDR z>xty4Z$HnB+yAy3RE zyC90E8KP-N>gvkScvvoCXgaZ0+y}BcQ~1cyC=v(mC0e?EKetYzEG$RxjFmcIPJ8&~ z;9UD{L5PfF=vEK#LxsDCFZL`B#sT6Dl5ouXkKf1r`UB}(xXxEao%!W^?O*k;oNBh* zU$nUv{Uhd$jd;x{6D-?0?84To$EJ#T+Te8YL?r(TbP7*`!j20S$P|R(8GMMg5`_`_ zSaJ<1P|BPzS0`H&?WLW_ndAb5pCJOSGE=5HTSzu0l!5EUdJcHSB(ndb&K-ujan#s(udZxu6V-n4`UtU-vy zm^s=5W$Sdg&3bkWpDnBa_X5^vhH3PZ)Z`>^dxd}mBNL)=Fq$g}T<6K2_rDn#h)Mmp zq)12fZJ3cm2xK z*E`TXI6AcMv|tU5edj|^Tl4#`|EKnsW*Ra+{b}4=edlY8jpgH+p;zsBfi!8&b-W?Ic5{DixIwozmDWmf|LNrV<_`k4Sl6`TACkas9yQ>g_Nw{vx z2f;x6H0}Q0wY>Qn2$=;8p?ixpHIs3-znt zpm(+3yCLXlKoaS`@y0u%+^6qYxuLo*2e+|f|NhA(ey_H?WKkoJYFSw`u)dD*sJd-p z)`{Kx%X<0O2(bk!ItZ1pPo8e?bh^+<3ETy>9u`fni5k{K=a`bvkWhJ;MNcxSHGJ_o zSOo3>{J6ig0K`%u@o=&7!yo4DZ|+kKT|%mlq!fNgGU%Xx@SmLCVEpj2j2pcF`*#O{ z5BRDie2Zr>W%zW`kjK?LusdLbcO)|xbNNTUB5%UGcEOe)a*CmpA0=Mm3&YhIv}#r& zN4Mism7-;;4$wo7vzIZ|WC|O6CMuOqR}VQ!KWCKH3PqeK>3<`;APsa{JD=b~i*s|W z7k^R6bCofmZ+zd~>AZU1pWGGp8U1fN4*%H}{5vxJz^mRfH*~42p(|JJj=5?%apB{; zhFz9X(^IFrrpsyZEM98jEZ7dq?!Bo_P42OdMhH=vMBwPoY=DFyDi}K(fv=j79ll8f zJq}o7QOKGy39nV@<>&GN6fGkws-X+77ORAjn2vEO3@i*uvyp3P^qoEJ0~as;=HvDw z-^}$E{73LNpZ{l|D(~k%|4;wuXNUjB{xtRZ^XH6fe=fdCxohx1*p{WG_${{4aX#RU z0AKy;!k^9Wj6~KQOq)8CDo@z9E&N_E7`%_C$`d&`+9-x|6ohkEEZds|W(tGVd@lB! zK$oG-FO^2nXVWUvCsLR}s1V3T0)7s&7IEYTiFq}>>|A_Ue%|C5UGmukJvFh$ zH@3HILfk`Z@39RO#V21Ga5*d=fBxoHp-%wH4nGZ`oie~UI!%62OqX!GtkN92o)+Gy zCUn+z2P&;x(Xzb#6)D6n^w{72RG(o4{2spE-t*hy?1FE=`8ZG%-bjAi zsJZtd5K;tMtj`S?#G5l6|z{7uzcfn6t4 z7D`ttMXZ1`{s0%{h2n{^iKNVwpseiVU@?ZoU|Big1+`k&oe%`n10h(`WU1~#E7ivV zv!q8et|2dw*jwj2coC^@C$X6cA8eWkoNZ!6XWG6!G4ww+h?I2jxqiobCu!f`N#NZ% z{R`)|j^v*y8^4R+@mcwj8{8viV(ZeP4SaY2lJsDIkT1;YvK-sJAz(Y!<96Ii8OF|e zGe^C&HFppk8~rX#2+EWo)Ar2_kPT{Wg_AC}WQJ@H=POtU9K}${O@M(kOC-%=ggxQ( zr}gR%XGnW)>7587Ifrpw^52(wA1GTM*?%K#EAw5NoUi!uMsx7H2%r{#a)%r7>B$e@ zedTxjcOI6sjq3g}@aV6ss_csgFMv(lTmo3WizB9=Ylg(`dfN@H#kdX17#8*bi>KQr zKccL*nfxiy@YpMCp~aX@XVFkd>0=9MkVGlqP6#w^D%%@hzCUFDb@Uks9pIy;1Utos zSg3+7)BsVc1*0o69?rz?$r6SzPN=|T0y35xnD73fvtr@lniqkTANGS1jTPN^t|;^3 zpN;t0%*&T*+Fz|H*alD)CxhY#`i@AfZ>U)0Y4z!jMNi343sbA>^Litl zwb3=HT>5AdYy2}7LQ^xI7!sWEF)$qwP8?OLc4WE)G1({>-&bH>NZ+<1(auyT>%dIs zHpmmrqhUys9GJNf6|y~UT2VR^LLJUWPe71<8=s_^`S30%c@zwk7OMKZ0Fwrl$k;N7ktSKCdn}Xj4Xz zGIe4=XukGFfok;Rjoi#THyT`v2H2WlO~20r%rtlk;}eZo2rx%%kR#^K!)Rl$DXK0u zTZ<*|f&^p(LSxXB*`gD&9XEl7FXL!-mNLU}Ay&xGnz6^MqEQ_w;DU@?*N^Q$ zlloY4R@1aL74na?KUWuQZ6M|vIhQPNzhOvpTjimR!^6jy%9*yJH#;KQ?y>gFNYDFV zs@ArDoL}-$#>vH#!m;K$)1v;WWn%=4z69i;V}LdpzJWrx%lhp)5|zxLA!z@zJ`*>i zrZ&`ubi!#QqUmrys!HCv-VVSei8?ip2S$pE}10NDM`qQD$ z7T(O>QhC0owByLxGhgkGy*PHxQ+_`)Xx_G^c+mKBkUe)Ajd2-!Pr3m%`t8!o=2W}V zz#5#=1K6yxx&<&*%Y#QEsPd0W>|mON<_{&&6g1pPX`=AyZUqu_l%jgDupKUacgn)U zg`?cY2`oHTG^>ECR+>113N^97f@!V~UVz;5S)#v~{AoIVxS zC2n2z76)t&dw=m)BPB!DaXe@w&4^DP;;E^~}wX` zF<{(*aLau5!y`2--tPcgoKCxo+4O8J+oZ2m~d4yFo1ed>hvK^u3>6VG8a2KbFZK{J~C^ z{pHikMl9rWZ0FuRWvY|xh=`q00@uLFKiI5iYK-`HRCGzIrfYoca zTf75{LhF5(#q6?I#0lFdC7d1HB)l{ zfmC3Y$1`L;4d)m~`K9uq@Zfoyd7#`XhpxuhGL@Rt68CPDklMif@QW^U=|78qvUG9u zY?S6exGpupE$-TpSClC?APatL$*3uilIYnDFnjfHS9br0_maYRDs!rSg}J486OYBg zGG^or1!Kb6(`|Ft&xL<{GocLu^n79)hhsJ&ND#!>WUCzeEH8D0D!(kCrYa1ni(|Vq zCJ51tDP8TbK%HBQ;d(ue6%@_2w}FEN+RT9K!`}|(D~(eb3R+zdf(G}>7>*Ha^Rapm z-I;~}F8CP=Y3e9|gZcpFQ_6rq1{h)_<&Jz^7ithad|1Zq1J;palMsvH7}d~}G6jof zDR85}ffc3-A%cP8E#%Y8`?clT@_6`oZ>+d`0zfUyQLXgKGG(4)%CbM?nMs_@0>gvL$S8_bv4N|-n?syXS~bFHz#RgTOYR*ROw7qbbm?NZ&J3wClKrLGS4 zB0`A|VbrT+E1DU_z9v}CXEYH&y$MqyLQP;*5Vd)SrT`S{?JG0a_g8QOqK5&^QK=2A zyd$#H0K5!Fj_^6y-6h98{74#KtGiIDi_7sL_4&8mhR6vNuAlA$BhFU0raHa8K~|e@ zcFda1>3eUJq8y!yTZi5h0U;^Y-ly+Cn)woHHh?t9g66eu)IuHIzWF6H8ON4sv@>m$ z2-u(D2tE$pWSoPM!BN+H^oH(sMu>Lr-n|fX`@VF1;3D{;e9UL=HU>dIaBcp6{9VKM z-Ste~z~=Xk7~|`+-gxzLmfChCRo{(T<0Fu}yvQImhqc~)froO<5~YaAo!(x@qRD%JSKk9XrFjoyO4d#>LmBgf*E7d+KfqH`~lp zuT;6Yl-mO@8FRoBw6)60PGT39Ktuu~gXGgTzl4KC zq1PUnkw-rY!NS}?yXba&3Tp-?1hR)d81)+J2whW5mry(n%h}n}5w~-gr?U3Ra2BoG z#LC~`JYC)QRwDR6i2C~C^*_A&Gx3>UwN?MA_lwkf|J?IC&EJySXaDnl`P4-l;feGt z-p&6?>RPl>!%Ish!|<*IU_h+7Urqxx)e>vGrY*cN+G|1v6Q!P1gYsZFkXiB*3Zp!+ zy+H{u4ArVEb(9dp8HzeBbQIVmt&lGUWceP*6>f6*xr9Yu2K;~v0&{x`+mC`cGS?2{ z$KraB7SNAiRl@0rpt=2A%|6Va1br}>HTWw1e={Ow|MU6(k9M&>Nek*szQ?`L)9L9N zzqBq`K;Y>I&rgt`ALl)I_31yizL;1jBe*|Lt^e)FUp`ygP;}x!&3!irP|Ab+*tSgZ z7N?~ol-YgXX9_Zo7lFxEFaZveFnVNDhcYq?QV)dXCu}`i3!`;lq`XB9mBRS(V2rN@ zwN0j?Qj?|3sS`}BdS#HGj{xn5PY@~y!q)w@j&fpuim!=?1GRaSV%;}ZrFrO6u#=(p zs=tkeh9r@Z?GSYH;l;oFA$A+>dURjy-m2ff^OyE$`@^t1s!!4l*~k{D$Fj&R3LU&P z;+-0kI4*d*O*hA)dREo~b2InGmx@JRfHoPp<>zMLqN|A!fX)at#$;cw)X?w=Kbo-lg;ICzx_tQFyC;Cy8%q(Mh6vg)>Z47 ztoz)_Lj#;fRBDbA9fX?7=TG>El{4m4Z5lBS$) zgM(3|LdLYDpUOIaTauElR-R9asD!55axUENaEAdGQ)L(koG|@edM{UVd;I2$R%Ub0 zbx_VeyAkmrQ8oUfCvWCEB@=-nwYx{OV^rU2QL~jNdaJTsi#e4*8|2k$LOJM&L8BUWg1oc5y0flN>oUVg_T5 z&81o{zfJ!2K&de>jcv=j>h@5l&sdil zqOaI4J3@jSi&+N_uIx9Ri>&Dwa`syX^7iiO?(wF4dZu{Cp2%N9hqj47unj*3+B`6hSeLyFa)h+#CjC?ZI@T`lldGdVIp zB;^Ri=K>Hh2ju^Vb|ElWX+j&%@BAvnSY4NrMPkCwPkT863_!R&( z+%^O-XWk|K6(^6iY5vd4+-y42urO^~UD(STQa5-rr?L{m2NjAV)fM4qzu;aqhIRDb zahO6YZ73Kc;8FOoDXc*w1kvqh3Zb3622oVZ1mN6rAlhn!hJ~d~piLl%P)EvFe9w>s zyjCcS%hzZFtt7|l$jvseAg~9zspKrJFEtkQHJOI&SDyxD@xA|?=P){Zs3&XnpZHMZ z$S>cWAm_tbqoaTWd9IkA%DSvSS)e_YBiQo~0APX!%Qv#Ww>OgP48lHGp52ui&z!V+n|54YG6$(!VtgdGJjZxgM(ZQhb_j?9t9@j0yf6CO=KFyTOH{!KDi4(q5fWTY- ziam&|d97$j%m;Sqv51@xp=Q!IvQm-|&D>_)9}_a`rdG zYe}l^bUS;8GN@a^_hDfhR!0=b>mbHLG)}JaX^d<{0-^&f{)$Z2R12UuwK56lu(%nB zf-AOyhSFyq(SS8A#B`DZ6l<6N0iTQmCoruiHI3vdIx>Y68Go0JUctw{UAg+CxYv11d0m7I*^lUC6_u z2|+DLtXi(%)N+I zu9b=-4B}Htk(sIXl|c;{h)8KPpa;CBg#3MA64*7Th0JXUgYlG>ohdPS|R8y-p#8yT6$>v{a?hN6%_t| z{&Yt*C7ZfvB|N=Lf2!F3wdU;u;mW+x{)U0_sX4tSFHY?0**)a6$ny&3^%)0qw^UWN zfF_ZMs^g^QrRu)n982r*bUS$SO2dJtR5_1R0LW~4 z%)@Jm&TUb6+n4-=@)OiuTgOwnC!XoK#hv0x?e(GGfokV<+Oa#A zbsv4AJBD8^A3p;Q;W$h8q!U{&*eH+zrWP;O#e(t+PpfQEDm(dhyX>5+oZ@#FXc5^O zMj)*;V2^nOlyXD^%rX4csI*5-7&)s%&Rtis0)28>PBx$5YqrD3rYz4Tr@^UYtAPe0 zrUh6)S2_Vdi0o8jB4LOW6E(OIng*%O09>!ya>b#h8U=oc7EY3p>FJC6m###1zUHn$mVE>rQ#y z43We~fWuk|nk79fcZ0#W@_dXVD+bp`kQh{ZBcP*!)=nOcwg*Id2}-Y33)9sQrKTf@ z%x%!<-O6l)(VlaG4T-8~SxpMLlhu~H=gxj^leQ^dmtO0bVw-_aFhj(+_|m9Jl5Rs z7^!c;`N0o?6qnJ`({{>xeIFd`<+R;2;zYO7|6>T|994pyYq3ent# zbiNn{K%9&egi^Otei6Y%M5kN|8arDJ^s=~Rs8cSSMI%51G*SP@Abo=$qKmYaAFxh| z44({P5Wv~v>o;;AdHekcB=eV<$Fn4CzA*{<7dPq^v4B(8#rxvF>my=b_dfuQnF=kL zYyPoYp5!!dG^T0-hX`+Pd88B|woJperbxH7hY0f$Al+b1)eHe%?Hzf7qxOue0hmM| z+`e;Rql(4B8@-Vp`yw{g!yxNA&K}=bhdDXWU!Ll3Ai}ott`-$x8Qve1={AOamh0KXNj2&+DnK%0 zo{Q^>MokBti|Jy@4v1?di-ryP34lIYAeZaB4{n2UmGF6QKJ_f71J$|XXUex<>MGk} z9jA?r(RF<$Ua)*IATwrWhZ^a@gTQHX|D1w4Bes3yqB2kJ;RX4vON-DXSI&|zG6%eZ z-Jz+PDMQd%V<79d!hx^IR`>I#>=X6}^r{Kxi0>y8s!oM>=YGZ6n#;#e>w1j+<0gWw8RU^_(<)@2tkYn>oiD1Yqk zO9s%rRkRLlM;Hzmwt8Vx9RDcVh4BHfmJq^mW@LuM_mQ1+8n{aMvuV(yx~Nv*v98l< zd}ss=Ra#kC=p30F>!thwWs;1Joyggv&(Xx;wa7zchT`mtQpn1DkfM?w=ED_L%7-kH zSVc5-zE(mY4}i-)Ch`Q|4Vu_e7731o6^Pg8g?<#v@w)*J4A?8O^!)~hxm^dsMbp57 zYtUF3CnkKzDd=X`oXif(PF?RR&`Q-LOy_HYnZk~gbl%)!q&fe58ydrwnb}2f45*vT zzG}ACq1vZuLhZ>w)db7kz9xuD2Jzi86pd0~bR`6}04{R21_h!siv`%0tW^ksG(Iv$ zn2|-`I8#D%2p8;h^PgbjEQc9YX{$QgSJT^<0FuIKg9o}u$9Xa59|3Mkalq+Yxi#Ni@|gn zmOk*W7o4wn2xNZm+c)4lFN0$c{#P_Ox_(>#Uxo*u*g~sWywABnB=`(Gr@?a)Jg* zV9jfqleU;CdLUS7fPKZ8K@0i};5(5elw1xuyQL}NQ!F`g7`qi^)-Q0kc`RpyTMx4a z%Lj~!VGh%f^^DNjD+sfhG^7fgI~7`_3og=as$nfyH`3=1p;Dr~7^E>I;vk?_S;C`lQ%%D}RLYz&Cm|2)$!!k9r!iu1?lRHuv zG#Xk5LtZ3Wpac92yO$+)94knG1=y&Bk)_{Gp9ZaGYo$5RWo0yX-O;ji;O1qx?K$ac zQM0Q9Ij1_$LFIsfRm}{QuLFoXsNC}fA!3@QFrwNgYM$t8b^8p{t#}fsdI)(-AS4YF zK2rMHC^Jds$si)TO7q0m> z#&EO{O6XK>tlcG7Ss(y>bE|~n+AhAs8IrC7RMlGbh0><|)og;xB14$69J9=>o-(AL zbFJwh4Nz)(WFcaR*6sjgkgjA1&grGWF^F;&YZEYzTlw2tv}6bn1tw_76gCRL;c8+X z3>9N-iYcXhgg#y;J(UC1GD%dk1orK{;^9{y$6N7ZG^l##Tt|L>bf9fxozL+9|BHpN;o@KJ zzXgn^jwNGg>S%h)k|yt}-2_O&pm7D93YWyy6skMmvB(!k%o(~$E3RTSS}rqVY~z$w zJ{%t0>Fst+`Nq!Jcu$KjA3P9eWzFyP#`h@PHN3A(fdSx0wivfqc!sVhF&rO!JQgPZxcKelcV6l^CSSBJ=^6#$XDvL8HE87pVT%QR{p8pt=NCdx zv@yZmQxlvTTJV@zGu}@Kiw76YNk9AkS@^SHB1`2Pak!mRDWl%|3oVgCa7r_cvUXgVy?u)S)V$P8 zolm%gMYAEKIrn@K!Id`W-sv!~+u$UP6V!lgz7Wu3<+Bl0z!KI1?vIC^C=f^jY1z|l z^i`;d1I{K(Zc&1>LXk4yaArSZDM|wrsgCVnrPuZquDP>fwS1wH;cIBcA2q>jaG7^< zDi|P;wF3=u7WhNqeRUK_NMy|rF`6(X6;P~?u{luHLv0k^+J-a-3;`ecm}-G#JhaI^ zA;KCU)X}14GN7A%GJQvzPBP0q<6IQjLO?aAeP&2+&fa>9tvRygG(BLPU47+NaHhIgAFf>x99f7BbaYO)*K+tpWkR$_zd` zfQh~1W--+Usmu*2&$AzqGhj}{VBtBiFNN7tfFj&<2#nMz%?z2mA82G`pD;bgQn;2P zJ(t^yi#*UNQ3N^%4r#g}lJo02&^dUXsP>^n7-tO;$CJ3ansKhHP3NQhWios(rb~xf zMa{V?w5?ity^mJkS0JHUyj=0A0M(KsZqA9r0P{@3(#)U)Tej>Y=_k5MnLL?asf=s8 z-TUPAzHDa5_eRj@{o;iL@xDlQkD2><11)81HUu@_1wzOfDIMy|G8(#nlyi4(4uALC zf+IV%prbYvj?o6*Vr(!%P>!&5!0VDi&<__s)9duV_g9?XSe*Xmg?Bf(LY|}(7r&Xv zJ@yqiRV!@3HN_nnv|I+um(VsUb58x4THc=;8q^r=ljThU-hd(H7Wp) zH|Z8`7tH%?m(%dzd1?LuPx|=1(QR(e?h#^OnD@o3Z6`ND+_JKNe4D$c)NiFItI4=v zz~#oEdG5&4P~LBgHx>tJHCA#3u}@KKA^WLQYa%mWPfv(nSzt8ZyO^q8p< zIbuAaO4wSIhlC{YYG zlFHAtJG>>BuE-F*Fp%W1_#O8b!UlQ<%<{ZOZ#fk4&E>Sxw43k7({az^Zz2kP9;dy8 zCDVnuz~R-Az?zqtm><0;EM6EfX%3neJ*H5-5`qLt%Vbk!8Oj1DkAm$FRwU8XB6BC5 zkMk>>J|dVVY-s|nyv|A_477+@K5*xO^1CGpRnTIxnkYflY=rC~>v4)EX02M96C(#3 z8D1r1M75EJSL#^gVP$?mAp@;(8!#TD4GsILGFne-N*(IRrJ@>OHpY%KD?yFAeos~* z!iSx$L`6?gIV%$EF5<_O!;a%18*CTgw7C3EC@s5XrVW-YBX!_sVIg*$9b+a@A4VMp zx4Y2OPEGUe`Fq&a2t@Ur&_&V<;&lxEavk`gbpAt@Vjone2`GY{;FT%*qW~PDb->`r zB1}Z5*M^~5jjY@)>Zle+JEu9TiQ)jyGcaoj3g8_FwNCOQv2>}CzPQq6Mww-(uuz?|v zV5-Yb*!Te{azH7!*E^n*K!`g5DPrk~iZcmd3;`{v(w?dF5hS71Q7#DSrF5Ky*fV0s zo^fVu&lzVr_dcF=vs?>gK@4%f`+490^M8K-9#KdtrXZFh2c85ee6 ztYcqLZAM9&LShq&Bs%~zy#qMp+ez7BSO2pHN{mzxt`RnE16Ad}?cehQT84fP{mGUC z`FvRO!Ig?1bXq50pBmeC;#+%Vc3|80Plk4Dma}^U%Rm00;-KY)!SGm83^7}llU0e6 zGj(hb#kxCZrw(G7`!824Z*#x&aQBeL^2YY6J4gn_VLdpAMuN!*^12w=8hf|l+4_w? z{}NxEEK_v8_G)9+8;8bnf7c$tOe#;{FAtf|e^&T>3b^vp;z4^H2bT8gOH{$yqe4Q) zpLqk4*y-oPiCS%b=}Oz4wDkNiLG7Zgwh>{7Xuf;Jo-FS&^;yiBz{mIc+_!_oIq%+l z{;f!NmMshs&52@k#jdm%`mC|GwS!Y3r)71NC_xnFw7$kQR$oF@k)I>znr*uZMBJ6> zKA(Mqv>uVWt&dWJ0&ls`?_hRm6GXTE(nveIg@k#H5WOMqL z+Mgxe&12Xt+G-(7tNU(Y;`24WuQ->XNYtjqV)k%Cex!lEsyo8(x%2ku!Qj72{&pqD z?a8yYij2bVY=8SmIC?Ox&ocd`Fl9v0F!xjr=zBe-z>e*Z<$>tx+er( zeP2}k=A-h^eqFpahCWsle({TmxkDsA^LUjnZAj0Ix1L92L)1#=amnlPLi$FxK$v_(o|o;We=m$BB~0S7ErY|K;;_2 z1%+;xknB*Yz_NKCVtg15mjfpFH&~~S5v~QS3^^P-&25*$v(a<|a7-JBk`ximjZ{J% zLg1@SLZzrZ)irVqRN*pzGs;Mf2%VuSOKHxZ36Qu}x#+RA5 zbkgD7hnHj+0>p7R4^SX+C6C7DCDSQHt*khQntVw9kjJSNK!NBOjJBA;3SM0GPgKvJ{*&F^r6y5*? zJO1tRkKg^r(}!OtCZ`)-uxO_=!*zziD^!);JS_nqYN$Me$v+-A7|5=)glex1U0gjK z-jP|yBlORe*M*XM-ex+&jiD)VC7ptZu9Yu+n4EbTiB3(@?u0(k{Ht|qZ1UH6Z(En2 zd-{hDsT?Ent7~7PKhf+z(|qN>uGe{T^=o(9xR04{SC9UD^N+i;gS^Hp`^OVjQ{Ud& zsqVYQ`pdzVqUuPI9ZtU9Q282rj?o=RwX0L+1ZKq}x6{J5^o4VSa7{qApbl809H=akAUO)bGR@$VbA=Yj$iiG?kn?jGL zm(&`Qc9jC=7?F4bZfgo9y*_qr-KdXPQ{-y;3T`l|9vvgegvJ!(&7$n{Z9aazE|CWt zY|~qB#f8CtI?g~GYetG=aN85H_LgqXWvqb6|MSLYO4m1nhHYKy6d0H(+I!i!|5pJY z7+kyf|gwoH-_}rL*c$*oh}&f`%DM^VK5brP5v0Al<}%JoLNP|KJ-5=fWAz zsAP1zv*EkFkM4f-$>$PAL!XQcd2M5O84^wJfRSqXfqsFgy=Ej!q@|*ZN(m)PgJ|YG zT$}>hsrWwpK}G~g&*~mr;m85upjbW+YAP)z5l~$!S^pf-uH^k@{Ir0kzNGLKGlq8; zE-ImvmUX07F0p&7B>tiaX|P^q%;=eqsj|+J$dH<|Q=-{`OiAr4J5FX1;9@6r4g*u@ zVaweM=?0<_&_u9Ek0K~z0Z~4PIVsc*BATvsqiC;x&}^(zsOOBgq<&d+L+r=~`qk#N zBj!==)NLXddDCC$GpbZ$$c5cY?Ao(ZTi%6%XV)x33X%}SPq>K%V#&~kP&v)ff2mS;2z0pS{PjP6S}}1 zd8Q1s`E&&V8(4|~@n-?|ey9_+-{VUHgf;Y;e+cbCbQhZ#YEgF;1zx&J3TKdJL1lNc zfK7trPF9T(-Bfa%GJF8aeO15ASH&@B(7Bz-X}Ee!9zy$1ngn8q`PebLVS7a_;Vgry zS0!d6|2@1ex`tgq)22o>$qXw4FdObSv1k`ir9nv{VD?HtJ=OV*eewF^=g#TRDJHfeGH#Tt=Ff)oQmBtr=A*c@6DH~zFj$J z9N=B}_wA*^z55Rq{yetT`qHF6)_$$rT428#b|wHEJp<#k{>&1^v@JvlR{sV6@@>Uk zoICTS(Wqz5m6tt#*V~#so%0ic>(JR9h~A=uoQwNph#+mFR%1NR-Ljstv$USxK~Nk4 z^k_!jZvRE`9L~iDZwO%H%AVbjBlDX$WS%tIs7?n3-_aMRV7Qn>xE)H=5W}bO)Fhm> zqgy20;Y9eaNAE>2r-NXV4y{Pyn8qmYCPD6D9LWb;slx#b32Oi5G$88c#$;|x`wlhr zh8p6RaCCbuwR<*dg+3F^ZL|L*6LD&zP9>bmF{bl=t&qiTw?fZbOsZV9lGF{v^~@}f zX`{0^z`}4j%Ih&qzq2WH42r=ouS~KzqGejuq6Z1!>~5P%DzOT^G^Ictku%(l`8u#p z=I?mj!IpFzOag}dKH##rqWk@%dKNa-lwnUgsWRuBaw>*vvMInnbiw?H< z0gMGIB~@ZM(hKKMoV+;>6&7~e6>8K8D!~|GtUK#-v(MCwW!(}z1oOEE0cft;AZ5bj zD3;uF0})9@aAa{D6ME^;E2r>I(%zB0&jnIf$Go$MFf)K6q)3l~|5tj5qfqHYI=J1A zigJQY$@C(*<(U|&x>FSe>*73gl9r(n;6wz}b^=-O-20P! z$1JBEe9&~1nk;0V9xSTBq9BE9{v`mb5ofE1Z#`R{h(wL<4{U9J_E})}XSeEle|3EP zHBDk@DN)HlCbqw>H@z{ml+6#@5G2vqJ@`1c2fM{`kmH&1q_=B%Nte1JyS&G@_7xbe z`x>}HsrF8C)p#l;69po&#j0$tSQK1#F*dmnd0L`Uh53-80PafIO8Gs+|cBn4e7l1Fo+8Z*J!N-`6z%@o?gQ zetqXk>!1Ia_0>;*dhXKu7fS6-C%tKtdxaf?`1yF7_pUu{ZdTqJ`eJ5pjb2gE4b%EB zIyUq9C5i5Yn7OUnKRU`!&$J;Rm?}M`B9o;yjtRqh8y&qA1{9?&iwY$s#gS*!s$iBj^aku&(umAFY z4QK{byPR!%_L+9Y7|%xmdV20|;3~LfzwD(NBUmu)x;M1G3q>}zC?EN^PTHO`PKIya zsEE?Aidx>g;wY9(VyB_Q=5Gf@q%2C4ypPC7ilhhncT05gEs}DdH8?Ay^w}`X$z)Jb zN7Qkwu0-d(lDri%4tjaV{V$lme{vB1ds(-=qe|N8@1(nmU-WLWbn9nYe=ux%FB=k} znk-|NKD6s|yc1$SN;3&NM~#R$r&<jollo^XowL?+6owZ3co_4 z6cc7dxHK`lW1xxy{!Ns5!u7to&Xm>wF=4gY|M|}FLZWnaf zFaT#NPQ|bF?WeEE6Y|Ua@%&PP*lV06B41RWFVl^$Cb?5q+Gc0ld<+|3Fm_l_Dl|sf zn2h13s2X2kZ@2O0oBo6%Vr#xjOf*uvduL7%babAIi{C)s&1g{;v}!0kLsgMl1a5ErI{m>r4HGqBH-ypK|jTt&y1(yiadV zS(%>>f6y=sAT*EJ#7E7>>q=11%Aa?8#^PHI2En$FBXoj=2&?;Un|CEov)L@2j*a~& zwn4%?kM1$RF=ugGrRnG^Vmd_~(Y-PNMaGdjbQPq#AZR_W{)*1zN znN^RiY;LVi`-7J0FA5GRl`vPbo|Y8PdtX(s8Ill0(Wq{T(%Is zH*G~oZedOTAPK{I0ue_cl4|B16s-=3A1*SL$Dl87`Mk{JQ;P@W4_UT4MM~DtVl=}t zX@D)P{0RdRk(*Pyg$1U+on029WqU_I58u)R`dJF&h*ftJouRFu#>sVI;?XCIIs6jV zq)VTf;F*ANtk7BZ8&V?S+j(|Y7cCZ6;q1+p+QOsx>~`vW86l#&;7km9L&uO`4q0P@ z2P|jDyi!Cd)TkEIPpQZ1&Z>@9EKtgNE94KOHc^(XUkl5@yPknamt}8>Wt>*dsSo+x zlG*Rb6V?7DN$7z^pERWj_1w^?uk&+wqH7LG$#ISXkM?x+27JWM| zPRlOXp>;dqUav*oaW62DK{m)LRB8vRgU}vvd0JK;W4=rR@sy+j_6uw_lZu3*?;W>p zJJI=MH!^NWVqbW6U1irB^Z%J!JocVZ5&5s`FXArp{sVz z%uGl2n-1`YoD-qT!A7FKq&1k^ZL8X8Clsw#y~-uOOkB<7&on*vqWwu1_0{ofQpqKa zX9CYdPiEUhyp#8!z{BZq`#lPS0K$hTU&YQJAPobEY5~EOJ9Czt2#0c^;u43{5HTG} z=b}tiK$Mwz`3fJ!RT%*;lD}O1)<0Zd?m|D~RA2r5kN)kK+QBCpUf#CC%X$1h>t(QV z?@v*nj}Y-lc}dEM->OfjFFWJi5b^@N6{2L0*BT@Q-ig#^M_`RL)n(QjPhdR@EuMwS zDhfC<0iYH|)MB8k*rsLupF;XLOukp5U?~Jom4PY(@tUHbiUw3jWvpzcPNNe+NkB7K zDg%jSgX$)BYvHDU_q`Uh&QSDWVW{q%4Cm_dv+>Rd_j)J|#s@a{MdpZ-f^&g>$-#+0 zQ2bHD`JM^>Ohz^aQNYS`j69jx-1>FM{YBZeRBqDF(viJK_|?&Og#G%*FusdV%TnX_ zah@8Ji9R)*#_Jm~w$L>v#+@CDPVT2#WOkD&qly#^5W-cqAy&BuAfRU|mePx3PK;T` zEH=t<3znwoWn{sPp&4<#w(&b3`9nnp64?H4FXwC$Z#}1g+HIQ5%xjIzHdJd(T4P_L z-79E_EWGqnS;%^}q5qQ)53U*K@+3}=C9_)I>K547A9bZ^ah=qU+@K*`n*{7-O=8I1 zLl88_FLxI)gi4c7$`!zrkcxz|Fi0+{Kug;VXXD+6aV1N{K*9WQK_rlZq-i>5LS80dHUFW`RA=S*$6|^h~Pp56?P{nS&VJ>Jc3tJVQPdT z(CAVZPGcSn%TtRhZ5$4z-KJ7O5C1SSvf@M2R&u35ytBL~8a+@OLVK#_NX;DzZEsJL zgYpYRl`=qKJf9F#qiS+X=;70F}xif-#04+@s9rnHKxz9lLvzX|# zdPQawzm%7n8XAj#C^VK#*{!BI;$v%p$i5~@X1L`tLMaH=uY_SLmEE_WMVU-QJqdf} zb+Uz=2sbEVo%Tqmg?-)`2R@%OXS0p*3qwv&(K>YN*lWYZE z!n&U2w<|;5z48M0IvN>h3{UWr&=>h&4i5!_KE8r7@#y~;2g`;0V92AN%?pN|m_LV4 zr@?D42s5xQy}~$mi2Y(7L-q1yNHM0@TaJX6Xa0<*rtRMvyk(pxf%ipG>8BwDy935MeyojLyX zr~(G&c&r3pw-t5bypvgeR05$P0v;U|Ak^+pC5T(0bj;4d+;9(EcVeEJX;m?V=~-Vb zl(G5mX4yM`^7$ucIj1}3DP@v&MikQRGzUOQ z%vv1GYNrw|a-l3swXq=R*bt^4O|4uY9SZlzG26%>B4`qpH9^8G?JJ>UcU_eYN7Z*) zd>Zvg5d+5h#7S+~>5?Tb^A{@9X8*D)zl?tv@rX#CRb6|wVIZVb#Hthf5uc=XG){th5Kvin# zu=-Ol+l-w7M4r^)lsQ5wYFd4+^i;*g`Ym6PO;`qP2PY{`vI!9ntpgFMHo!yk0PP1U zQ3P|G>Fw@*!O>J`d{7J`-Qplkd=z~Bhhw;aI;IFYaF1MrQdz|=MP}12fIn+6l=OH! zy=HUfiEpXMxzC?Hu>W?ip@~yauHo@ayxRsJQA-IA1(nYCk7L{=?L)&DrSE6w9Xoda zFeAmYS*(PDW4RF5oJ5=RC~=_Yu1NXTFHb+2?-u-HPH!mo|RQC&+Q%d0O>!heJkq zW&FwIr)yhvM6$@cSD0yB*|Hw7Lyr)QWNX?VmSs+c8Z+{Of#B`fQrr3z7L4n7&WFa2 zS5A%cuRA5a((4q+w#oy4``)RKe*3WJS1-WtXVy=p!fvw|dUP{Zg;96vYvYH@-*i^} z_@hgIbk_Wke_dbQH{lM)pS@#rg+9)!Z8E1szBEVHAgUzTxc-RY<6E?WuJX<=Xn*f~ z(#T9g9D6*Z)a<-kccO{4*1SknSYLa2EmbZxDPLIo#VJE}t#9hBjUPo-4^gXS~liBu9s3}Xs#F;!th z5Er7Om#YJ|sUN14N4eQhoN9* z^v()6Nd$<2tkcRusRV%&yxdt8s0;C^Mb2@mVbe82fdwlch#?pS2ct#KtgcfuAuu%? zIYpvp#|gwCEMwny^mCII%Z9xZo!xNsfzT}-P;M|7$Zt;tV``xdS%3hloY5v-V7V%T zo|V@F);sXKiz+j!E)~jCittgfjfk=`nCP%3TaKLSJ}a#{$O01_vI&L)(aw2NVMEb= zt^qj8SqK225v2dw4M!~wMWsF-i`VUkULB*C$un|DuM9%x44rwlThdUcD4jK7^1S^d vPc!^<>%-R|b2c%yr*V38&kNswyYhPZ@lKEH%~z)^t~XC~rj@Fhbmad5qvI(} literal 0 HcmV?d00001 diff --git a/sound/voice/larva_talk4.ogg b/sound/voice/larva_talk4.ogg new file mode 100644 index 0000000000000000000000000000000000000000..cbb9b01d24185aeab29613aa8ef07b21db56dce8 GIT binary patch literal 49994 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

2h)Cy}k@lD-o_S3o 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 literal 0 HcmV?d00001 From e7161e37e1e7810506c67731e1fbe12bdbfb006f Mon Sep 17 00:00:00 2001 From: cm13-github <128137806+cm13-github@users.noreply.github.com> Date: Tue, 2 Jul 2024 08:13:30 +0100 Subject: [PATCH 02/23] Automatic changelog for PR #6439 [ci skip] --- html/changelogs/AutoChangeLog-pr-6439.yml | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-6439.yml diff --git a/html/changelogs/AutoChangeLog-pr-6439.yml b/html/changelogs/AutoChangeLog-pr-6439.yml new file mode 100644 index 000000000000..606fddc29b51 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-6439.yml @@ -0,0 +1,5 @@ +author: "Blundir" +delete-after: True +changes: + - soundadd: "larva talking sounds" + - imageadd: "larva moving sprites, tweak of standing ones" \ No newline at end of file From bbae238ce393fe70bec9023649b72951a145cbd1 Mon Sep 17 00:00:00 2001 From: Changelogs Date: Wed, 3 Jul 2024 01:17:00 +0000 Subject: [PATCH 03/23] Automatic changelog compile [ci skip] --- html/changelogs/AutoChangeLog-pr-6439.yml | 5 ----- html/changelogs/archive/2024-07.yml | 4 ++++ 2 files changed, 4 insertions(+), 5 deletions(-) delete mode 100644 html/changelogs/AutoChangeLog-pr-6439.yml create mode 100644 html/changelogs/archive/2024-07.yml diff --git a/html/changelogs/AutoChangeLog-pr-6439.yml b/html/changelogs/AutoChangeLog-pr-6439.yml deleted file mode 100644 index 606fddc29b51..000000000000 --- a/html/changelogs/AutoChangeLog-pr-6439.yml +++ /dev/null @@ -1,5 +0,0 @@ -author: "Blundir" -delete-after: True -changes: - - soundadd: "larva talking sounds" - - imageadd: "larva moving sprites, tweak of standing ones" \ No newline at end of file diff --git a/html/changelogs/archive/2024-07.yml b/html/changelogs/archive/2024-07.yml new file mode 100644 index 000000000000..cf474db8722d --- /dev/null +++ b/html/changelogs/archive/2024-07.yml @@ -0,0 +1,4 @@ +2024-07-03: + Blundir: + - soundadd: larva talking sounds + - imageadd: larva moving sprites, tweak of standing ones From 5d29bf4c4a89dcaa7789a96e6a5d2dbea2fe571c Mon Sep 17 00:00:00 2001 From: zzzmike <85382350+zzzmike@users.noreply.github.com> Date: Wed, 3 Jul 2024 10:20:10 -0700 Subject: [PATCH 04/23] Clarity for facehugger/drone text (#6577) # About the pull request A small change to make my other PR clear that the hive can support for example "3 total facehuggers" and not "3 more facehuggers" - and changed lesser drone text for parity # Explain why it's good for the game clarity # Testing Photographs and Procedure

Screenshots & Videos Put screenshots and videos here with an empty line between the screenshots and the `
` tags.
# Changelog :cl: spellcheck: more clarity for facehugger/lesser drone text /:cl: --------- Co-authored-by: harryob <55142896+harryob@users.noreply.github.com> --- code/modules/cm_aliens/structures/egg.dm | 2 +- code/modules/cm_aliens/structures/special/egg_morpher.dm | 2 +- code/modules/cm_aliens/structures/special/pylon_core.dm | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/code/modules/cm_aliens/structures/egg.dm b/code/modules/cm_aliens/structures/egg.dm index 4e22f1b5e6ba..9825389c8ac4 100644 --- a/code/modules/cm_aliens/structures/egg.dm +++ b/code/modules/cm_aliens/structures/egg.dm @@ -58,7 +58,7 @@ if(isobserver(user) && status == EGG_GROWN) var/datum/hive_status/hive = GLOB.hive_datum[hivenumber] var/current_hugger_count = hive.get_current_playable_facehugger_count(); - . += "There are currently [SPAN_NOTICE("[current_hugger_count]")] facehuggers in the hive. The hive can support [SPAN_NOTICE("[hive.playable_hugger_limit]")] facehuggers." + . += "There are currently [SPAN_NOTICE("[current_hugger_count]")] facehuggers in the hive. The hive can support a total of [SPAN_NOTICE("[hive.playable_hugger_limit]")] facehuggers at present." /obj/effect/alien/egg/attack_alien(mob/living/carbon/xenomorph/M) if(status == EGG_BURST || status == EGG_DESTROYED) diff --git a/code/modules/cm_aliens/structures/special/egg_morpher.dm b/code/modules/cm_aliens/structures/special/egg_morpher.dm index 32cf0ee591b5..c4fb5c0a900c 100644 --- a/code/modules/cm_aliens/structures/special/egg_morpher.dm +++ b/code/modules/cm_aliens/structures/special/egg_morpher.dm @@ -46,7 +46,7 @@ . += "It has [stored_huggers] facehuggers within, with [huggers_to_grow] more to grow (reserved: [huggers_reserved])." if(isobserver(user)) var/current_hugger_count = linked_hive.get_current_playable_facehugger_count(); - . += "There are currently [SPAN_NOTICE("[current_hugger_count]")] facehuggers in the hive. The hive can support [SPAN_NOTICE("[linked_hive.playable_hugger_limit]")] facehuggers." + . += "There are currently [SPAN_NOTICE("[current_hugger_count]")] facehuggers in the hive. The hive can support a total of [SPAN_NOTICE("[linked_hive.playable_hugger_limit]")] facehuggers at present." /obj/effect/alien/resin/special/eggmorph/attackby(obj/item/I, mob/user) if(istype(I, /obj/item/grab)) diff --git a/code/modules/cm_aliens/structures/special/pylon_core.dm b/code/modules/cm_aliens/structures/special/pylon_core.dm index ae3be4d55bef..71211d67e23c 100644 --- a/code/modules/cm_aliens/structures/special/pylon_core.dm +++ b/code/modules/cm_aliens/structures/special/pylon_core.dm @@ -70,7 +70,7 @@ lesser_count++ . += "Currently holding [SPAN_NOTICE("[floor(lesser_drone_spawns)]")]/[SPAN_NOTICE("[lesser_drone_spawn_limit]")] lesser drones." - . += "There are currently [SPAN_NOTICE("[lesser_count]")] lesser drones in the hive. The hive can support [SPAN_NOTICE("[linked_hive.lesser_drone_limit]")] lesser drones." + . += "There are currently [SPAN_NOTICE("[lesser_count]")] lesser drones in the hive. The hive can support a total of [SPAN_NOTICE("[linked_hive.lesser_drone_limit]")] lesser drones at present." /obj/effect/alien/resin/special/pylon/attack_ghost(mob/dead/observer/user) . = ..() From 524c9dbd18e9334cb5108feceb95c0b7aab57486 Mon Sep 17 00:00:00 2001 From: cm13-github <128137806+cm13-github@users.noreply.github.com> Date: Wed, 3 Jul 2024 18:27:07 +0100 Subject: [PATCH 05/23] Automatic changelog for PR #6577 [ci skip] --- html/changelogs/AutoChangeLog-pr-6577.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-6577.yml diff --git a/html/changelogs/AutoChangeLog-pr-6577.yml b/html/changelogs/AutoChangeLog-pr-6577.yml new file mode 100644 index 000000000000..0a632cde43b2 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-6577.yml @@ -0,0 +1,4 @@ +author: "zzzmike" +delete-after: True +changes: + - spellcheck: "more clarity for facehugger/lesser drone text" \ No newline at end of file From 41dcf116f6cc7d048a412784d7f2e6f19d84e17e Mon Sep 17 00:00:00 2001 From: Doubleumc Date: Wed, 3 Jul 2024 13:21:04 -0400 Subject: [PATCH 06/23] In-view verbs work for varying view ranges (#6591) # About the pull request Admin "InView" procs now take the user's current view range into account. If you zoom out as a ghost, it will use your current view size as you'd expect. Where possible, admin and observer procs use a global list check instead of a view check. This prevents an issue where a right-clicked subject moves out of view before you can click on the menu option, which causes the option to fail and fill your command bar with some useless text. Does *not* take view offsets into account, e.g. binoculars shifting `client.pixel_x` & `client.pixel_y` # Explain why it's good for the game Procs billed as "in-view" should work based on your current view range. Right-click actions without a specific range cap should work on anything in your view range. # Testing Photographs and Procedure Each proc continues to work as expected, just with more lenient ranging rules. # Changelog :cl: qol: ghost health scan & follow right-click actions work at any range admin: "InView" procs use your current view range (e.g. ghost zoom) /:cl: --- code/modules/admin/callproc.dm | 2 +- code/modules/admin/tabs/admin_tab.dm | 10 +++++----- code/modules/admin/verbs/freeforghosts.dm | 2 +- code/modules/admin/verbs/mob_verbs.dm | 8 ++++---- code/modules/admin/verbs/select_equipment.dm | 2 +- code/modules/mob/dead/observer/observer.dm | 4 ++-- code/modules/mob/mob_helpers.dm | 2 +- 7 files changed, 15 insertions(+), 15 deletions(-) diff --git a/code/modules/admin/callproc.dm b/code/modules/admin/callproc.dm index 1af1f5aa9fa3..36ed859a210f 100644 --- a/code/modules/admin/callproc.dm +++ b/code/modules/admin/callproc.dm @@ -230,7 +230,7 @@ GLOBAL_PROTECT(LastAdminCalledProc) to_chat(usr, SPAN_BOLDWARNING("Warning: Force attempt has been logged.")) message_admins("[key_name(usr)] has attempted to execute a restricted proc. ([procname])") -/client/proc/callproc_datum(datum/called_datum as null|area|mob|obj|turf) +/client/proc/callproc_datum(datum/called_datum as null|area|mob|obj|turf in view(src)) set category = "Debug" set name = "Datum ProcCall" set waitfor = FALSE diff --git a/code/modules/admin/tabs/admin_tab.dm b/code/modules/admin/tabs/admin_tab.dm index f29f99004625..5f3bc220876c 100644 --- a/code/modules/admin/tabs/admin_tab.dm +++ b/code/modules/admin/tabs/admin_tab.dm @@ -435,7 +435,7 @@ if(tgui_alert(src, "Do you want to strip yourself as well?", "Confirmation", list("Yes", "No")) == "Yes") strip_self = TRUE - for(var/mob/living/current_mob in view()) + for(var/mob/living/current_mob in view(src)) if(!strip_self && usr == current_mob) continue for (var/obj/item/current_item in current_mob) @@ -458,7 +458,7 @@ if(alert("This will rejuvenate ALL mobs within your view range. Are you sure?",,"Yes","Cancel") == "Cancel") return - for(var/mob/living/M in view()) + for(var/mob/living/M in view(src)) M.rejuvenate(FALSE) message_admins(WRAP_STAFF_LOG(usr, "ahealed everyone in [get_area(usr)] ([usr.x],[usr.y],[usr.z])."), usr.x, usr.y, usr.z) @@ -476,7 +476,7 @@ if(alert("This will rejuvenate ALL humans within your view range. Are you sure?",,"Yes","Cancel") == "Cancel") return - for(var/mob/living/carbon/human/M in view()) + for(var/mob/living/carbon/human/M in view(src)) M.rejuvenate(FALSE) message_admins(WRAP_STAFF_LOG(usr, "ahealed all humans in [get_area(usr)] ([usr.x],[usr.y],[usr.z])"), usr.x, usr.y, usr.z) @@ -493,7 +493,7 @@ if(alert("This will rejuvenate ALL revivable humans within your view range. Are you sure?",,"Yes","Cancel") == "Cancel") return - for(var/mob/living/carbon/human/M in view()) + for(var/mob/living/carbon/human/M in view(src)) if(!ishuman_strict(M) && !ishumansynth_strict(M)) continue @@ -519,7 +519,7 @@ if(alert("This will rejuvenate ALL xenos within your view range. Are you sure?",,"Yes","Cancel") == "Cancel") return - for(var/mob/living/carbon/xenomorph/X in view()) + for(var/mob/living/carbon/xenomorph/X in view(src)) X.rejuvenate(FALSE) message_admins(WRAP_STAFF_LOG(usr, "ahealed all xenos in [get_area(usr)] ([usr.x],[usr.y],[usr.z])"), usr.x, usr.y, usr.z) diff --git a/code/modules/admin/verbs/freeforghosts.dm b/code/modules/admin/verbs/freeforghosts.dm index 4bf5549f30f0..b5e43bbb8793 100644 --- a/code/modules/admin/verbs/freeforghosts.dm +++ b/code/modules/admin/verbs/freeforghosts.dm @@ -38,7 +38,7 @@ if(alert("This will free ALL mobs within your view range. Are you sure?",,"Yes","Cancel") == "Cancel") return - for(var/mob/living/M in view()) + for(var/mob/living/M in view(src)) free_for_ghosts(M, notify = FALSE) message_admins(WRAP_STAFF_LOG(usr, "freed all mobs in [get_area(usr)] ([usr.x],[usr.y],[usr.z])"), usr.x, usr.y, usr.z) diff --git a/code/modules/admin/verbs/mob_verbs.dm b/code/modules/admin/verbs/mob_verbs.dm index 3b4de192e78f..7a1dab7c7cf3 100644 --- a/code/modules/admin/verbs/mob_verbs.dm +++ b/code/modules/admin/verbs/mob_verbs.dm @@ -203,7 +203,7 @@ else return -/client/proc/cmd_admin_object_narrate(obj/selected) +/client/proc/cmd_admin_object_narrate(obj/selected in view(src)) set name = "Object Narrate" set category = null @@ -234,7 +234,7 @@ log_admin("[key_name(src)] sent an Object Narrate with message [message].") message_admins("[key_name(src)] sent an Object Narrate with message [message].") -/client/proc/cmd_admin_direct_narrate(mob/M) +/client/proc/cmd_admin_direct_narrate(mob/M in GLOB.mob_list) set name = "Narrate" set category = null @@ -330,7 +330,7 @@ message_admins("[key_name_admin(usr)] made [key_name_admin(M)] drop everything!") -/client/proc/cmd_admin_change_their_hivenumber(mob/living/carbon/H) +/client/proc/cmd_admin_change_their_hivenumber(mob/living/carbon/H in GLOB.living_mob_list) set name = "Change Hivenumber" set category = null @@ -370,7 +370,7 @@ message_admins("[key_name(src)] changed hivenumber of [H] to [H.hivenumber].") -/client/proc/cmd_admin_change_their_name(mob/living/carbon/carbon) +/client/proc/cmd_admin_change_their_name(mob/living/carbon/carbon in GLOB.living_mob_list) set name = "Change Name" set category = null diff --git a/code/modules/admin/verbs/select_equipment.dm b/code/modules/admin/verbs/select_equipment.dm index 90269f70c1aa..196079fe4739 100644 --- a/code/modules/admin/verbs/select_equipment.dm +++ b/code/modules/admin/verbs/select_equipment.dm @@ -98,7 +98,7 @@ var/datum/job/J = GLOB.RoleAuthority.roles_by_name[newskillset] H.set_skills(J.get_skills()) -/client/proc/cmd_admin_dress(mob/M) +/client/proc/cmd_admin_dress(mob/M in GLOB.mob_list) set category = null set name = "Select Equipment" diff --git a/code/modules/mob/dead/observer/observer.dm b/code/modules/mob/dead/observer/observer.dm index 0ea2b3856da1..1112247380dd 100644 --- a/code/modules/mob/dead/observer/observer.dm +++ b/code/modules/mob/dead/observer/observer.dm @@ -662,7 +662,7 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp usr.forceMove(pick(L)) following = null -/mob/dead/observer/proc/scan_health(mob/living/target in view(src.client)) +/mob/dead/observer/proc/scan_health(mob/living/target in GLOB.living_mob_list) set name = "Scan Health" if(!istype(target)) @@ -695,7 +695,7 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp last_health_display.target_mob = target last_health_display.look_at(src, DETAIL_LEVEL_FULL, bypass_checks = TRUE) -/mob/dead/observer/verb/follow_local(mob/target) +/mob/dead/observer/verb/follow_local(mob/target in GLOB.mob_list) set category = "Ghost.Follow" set name = "Follow Local Mob" set desc = "Follow on-screen mob" diff --git a/code/modules/mob/mob_helpers.dm b/code/modules/mob/mob_helpers.dm index 8c41e1149f35..76841c2097c9 100644 --- a/code/modules/mob/mob_helpers.dm +++ b/code/modules/mob/mob_helpers.dm @@ -484,7 +484,7 @@ GLOBAL_LIST_INIT(limb_types_by_name, list( * [this byond forum post](https://secure.byond.com/forum/?post=1326139&page=2#comment8198716) * for why this isn't atom/verb/examine() */ -/mob/verb/examinate(atom/examinify as mob|obj|turf in view()) +/mob/verb/examinate(atom/examinify as mob|obj|turf in view(client)) set name = "Examine" set category = "IC" From 39ac3938c17c975696d662176ad069bb51deca52 Mon Sep 17 00:00:00 2001 From: cm13-github <128137806+cm13-github@users.noreply.github.com> Date: Wed, 3 Jul 2024 18:34:16 +0100 Subject: [PATCH 07/23] Automatic changelog for PR #6591 [ci skip] --- html/changelogs/AutoChangeLog-pr-6591.yml | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-6591.yml diff --git a/html/changelogs/AutoChangeLog-pr-6591.yml b/html/changelogs/AutoChangeLog-pr-6591.yml new file mode 100644 index 000000000000..1cab75dbe648 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-6591.yml @@ -0,0 +1,5 @@ +author: "Doubleumc" +delete-after: True +changes: + - qol: "ghost health scan & follow right-click actions work at any range" + - admin: "\"InView\" procs use your current view range (e.g. ghost zoom)" \ No newline at end of file From a0e93b9a3eae4bc985b192f15563aa8ec3ddd3c2 Mon Sep 17 00:00:00 2001 From: Nomoresolvalou Date: Wed, 3 Jul 2024 12:23:39 -0500 Subject: [PATCH 08/23] Replaces Synth Vendor Headset (#6574) # About the pull request Replaces the senior command headset with the synthetic headset in the synth equipment vendor # Explain why it's good for the game The synth headset is very useful as it gives synthetics a tracker for the SLs, XO, and CO. This change will allow for survivor synthetics that ally with the Almayer to track just as a normal synth. It also allows shipside synths to keep the tracker if their spawn headset is lost/stolen/melted. Also makes sense that the synth vendor gives the synth headset # Testing Photographs and Procedure
Screenshots & Videos Put screenshots and videos here with an empty line between the screenshots and the `
` tags.
# Changelog :cl: Nomoresolvalou balance: The headset in the synthetic equipment vendor has been replaced with a synthetic headset as opposed to a senior command headset /:cl: Co-authored-by: harryob <55142896+harryob@users.noreply.github.com> --- code/game/machinery/vending/vendor_types/crew/synthetic.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/game/machinery/vending/vendor_types/crew/synthetic.dm b/code/game/machinery/vending/vendor_types/crew/synthetic.dm index 1ece8d353d4f..0146af139871 100644 --- a/code/game/machinery/vending/vendor_types/crew/synthetic.dm +++ b/code/game/machinery/vending/vendor_types/crew/synthetic.dm @@ -91,7 +91,7 @@ GLOBAL_LIST_INIT(cm_vending_clothing_synth, list( list("Experimental Tool Vendor Token", 0, /obj/item/coin/marine/synth, MARINE_CAN_BUY_ESSENTIALS, VENDOR_ITEM_MANDATORY), list("RADIO (TAKE ALL)", 0, null, null, null), - list("Headset", 0, /obj/item/device/radio/headset/almayer/mcom/cdrcom, MARINE_CAN_BUY_EAR, VENDOR_ITEM_MANDATORY), + list("Headset", 0, /obj/item/device/radio/headset/almayer/mcom/synth, MARINE_CAN_BUY_EAR, VENDOR_ITEM_MANDATORY), list("UNIFORM (CHOOSE 1)", 0, null, null, null), list("Uniform, Outdated Synth", 0, /obj/item/clothing/under/rank/synthetic/old, MARINE_CAN_BUY_UNIFORM, VENDOR_ITEM_REGULAR), From f6596a7e511d55df12355de19ef4ddd1034b8879 Mon Sep 17 00:00:00 2001 From: cm13-github <128137806+cm13-github@users.noreply.github.com> Date: Wed, 3 Jul 2024 18:42:12 +0100 Subject: [PATCH 09/23] Automatic changelog for PR #6574 [ci skip] --- html/changelogs/AutoChangeLog-pr-6574.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-6574.yml diff --git a/html/changelogs/AutoChangeLog-pr-6574.yml b/html/changelogs/AutoChangeLog-pr-6574.yml new file mode 100644 index 000000000000..e7a6ad8e069b --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-6574.yml @@ -0,0 +1,4 @@ +author: "Nomoresolvalou" +delete-after: True +changes: + - balance: "The headset in the synthetic equipment vendor has been replaced with a synthetic headset as opposed to a senior command headset" \ No newline at end of file From 72fa3851c2226ec32bdaf2b365f17d12fff5fb54 Mon Sep 17 00:00:00 2001 From: Doubleumc Date: Wed, 3 Jul 2024 13:32:01 -0400 Subject: [PATCH 10/23] length() over .len (#6546) # About the pull request Replaces `list.len` lookup with `length(list)`. The following replacements are broadly applied: - `list.len` -> `length(list)` : except where `len is being assigned or modified, such as `list.len--`, which is a valid use-case - `list && list.len`, `!isnull(list) && list.len`, `list?.len` -> `LAZYLEN(list)` : also the inverted form; `LAZYLEN` is just a define for `length` but is used here to more clearly communicate that originally the list was tested for existence - `if(list.len) list.Cut()` -> `LAZYCLEARLIST(list)` : identical to the define so instead of replacing `len` with `length` just used the define A few one-offs: - `(list?(list.len):(0))` -> `(LAZYLEN(list) || 0)` in `recipe.dm` : resulting value gets assigned to a variable that is used elsewhere, so ensured it returned 0 in the same circumstances - `if(!list || !list.len) { return FALSE } if(list?.len) { ...`-> `if(!LAZYLEN(list)) { return FALSE } ...` in `modify_variables.dm` : simplified two branching checks into one - `!list || list.len == 0` -> `!LAZYLEN(list)` in `teleporter.dm` : removed the `==` test to allow simplifying down to `LAZYLEN` while ensuring it has the same truthiness # Explain why it's good for the game `length(list)` is preferred over `list.len` since it inherently handles nulls and is allegedly slightly more performant. # Testing Photographs and Procedure Boots without issue. # Changelog No player-facing changes. --- code/__DEFINES/tgs.config.dm | 2 +- code/__HELPERS/_lists.dm | 10 +- code/__HELPERS/chat.dm | 2 +- code/__HELPERS/game.dm | 4 +- code/__HELPERS/guid.dm | 2 +- code/__HELPERS/icons.dm | 10 +- code/__HELPERS/lists.dm | 122 +++++++++--------- code/__HELPERS/mobs.dm | 4 +- code/__HELPERS/sanitize_values.dm | 2 +- code/__HELPERS/shell.dm | 2 +- code/__HELPERS/sorts/TimSort.dm | 10 +- code/__HELPERS/sorts/_Main.dm | 22 ++-- code/__HELPERS/unsorted.dm | 12 +- code/_globalvars/global_lists.dm | 2 +- code/_macros.dm | 2 +- code/_onclick/adjacent.dm | 4 +- code/_onclick/click.dm | 2 +- code/_onclick/click_hold.dm | 2 +- code/_onclick/hud/hud.dm | 32 ++--- code/_onclick/hud/human.dm | 2 +- code/_onclick/hud/radial.dm | 8 +- code/_onclick/hud/screen_objects.dm | 4 +- code/_onclick/item_attack.dm | 2 +- code/_onclick/ventcrawl.dm | 4 +- .../controllers/configuration/config_entry.dm | 2 +- .../configuration/configuration.dm | 2 +- code/controllers/mc/globals.dm | 10 +- code/controllers/mc/master.dm | 4 +- code/controllers/shuttle_controller.dm | 4 +- code/controllers/subsystem/acid_pillar.dm | 4 +- code/controllers/subsystem/atoms.dm | 8 +- code/controllers/subsystem/cellauto.dm | 6 +- code/controllers/subsystem/decorator.dm | 20 +-- code/controllers/subsystem/disease.dm | 6 +- code/controllers/subsystem/events.dm | 4 +- code/controllers/subsystem/fz_transitions.dm | 2 +- code/controllers/subsystem/garbage.dm | 2 +- code/controllers/subsystem/human.dm | 6 +- code/controllers/subsystem/init/landmarks.dm | 10 +- code/controllers/subsystem/input.dm | 2 +- code/controllers/subsystem/item_cleanup.dm | 10 +- code/controllers/subsystem/lighting.dm | 2 +- code/controllers/subsystem/machinery.dm | 6 +- code/controllers/subsystem/mapping.dm | 14 +- code/controllers/subsystem/mob.dm | 6 +- code/controllers/subsystem/nanoui.dm | 6 +- code/controllers/subsystem/perf_logging.dm | 4 +- code/controllers/subsystem/ping.dm | 6 +- code/controllers/subsystem/playtime.dm | 4 +- code/controllers/subsystem/police_clues.dm | 6 +- code/controllers/subsystem/power.dm | 10 +- .../subsystem/processing/obj_tab_items.dm | 4 +- .../subsystem/processing/processing.dm | 4 +- code/controllers/subsystem/projectiles.dm | 6 +- code/controllers/subsystem/quadtrees.dm | 8 +- code/controllers/subsystem/round_recording.dm | 4 +- code/controllers/subsystem/shuttles.dm | 12 +- code/controllers/subsystem/sound.dm | 4 +- code/controllers/subsystem/soundscape.dm | 4 +- code/controllers/subsystem/statpanel.dm | 2 +- code/controllers/subsystem/tgui.dm | 4 +- code/controllers/subsystem/tracking.dm | 2 +- code/controllers/subsystem/xeno.dm | 6 +- code/datums/_ndatabase/code/brsql_adapter.dm | 6 +- code/datums/_ndatabase/code/native_adapter.dm | 4 +- .../code/native_persistent_query.dm | 6 +- .../subsystems/database_query_manager.dm | 2 +- .../_ndatabase/subsystems/entity_manager.dm | 4 +- code/datums/_ndatabase/tests/test_entity.dm | 2 +- code/datums/ammo/ammo.dm | 2 +- code/datums/ammo/misc.dm | 6 +- code/datums/browser.dm | 4 +- code/datums/components/_component.dm | 8 +- code/datums/datum.dm | 2 +- code/datums/diseases/advance/advance.dm | 34 ++--- .../diseases/advance/symptoms/symptoms.dm | 2 +- code/datums/diseases/black_goo.dm | 6 +- code/datums/emergency_calls/custom.dm | 2 +- code/datums/emergency_calls/emergency_call.dm | 18 +-- code/datums/entities/player.dm | 6 +- code/datums/global_variables.dm | 4 +- code/datums/helper_datums/getrev.dm | 4 +- code/datums/helper_datums/teleport.dm | 4 +- code/datums/matrix_editor.dm | 6 +- code/datums/medal_awards.dm | 4 +- code/datums/quadtree.dm | 2 +- code/datums/recipe.dm | 12 +- code/datums/soundOutput.dm | 2 +- .../datums/statistics/entities/panel_stats.dm | 4 +- .../datums/statistics/entities/round_stats.dm | 4 +- code/datums/weather/weather_map_holder.dm | 2 +- code/defines/procs/AStar.dm | 34 ++--- code/game/atoms.dm | 2 +- .../cas_manager/datums/cas_fire_mission.dm | 6 +- code/game/gamemodes/cm_initialize.dm | 30 ++--- code/game/gamemodes/cm_process.dm | 14 +- .../colonialmarines/colonialmarines.dm | 14 +- .../gamemodes/colonialmarines/huntergames.dm | 8 +- .../colonialmarines/whiskey_outpost.dm | 12 +- .../whiskey_outpost/whiskey_output_waves.dm | 2 +- .../gamemodes/colonialmarines/xenovsxeno.dm | 6 +- code/game/gamemodes/extended/extended.dm | 2 +- code/game/gamemodes/extended/infection.dm | 8 +- code/game/jobs/access.dm | 10 +- .../jobs/job/civilians/other/survivors.dm | 2 +- code/game/jobs/job/job.dm | 2 +- code/game/jobs/job/marine/squad_info.dm | 6 +- code/game/jobs/job/marine/squads.dm | 2 +- code/game/jobs/role_authority.dm | 10 +- code/game/machinery/air_alarm.dm | 10 +- code/game/machinery/autolathe.dm | 16 +-- code/game/machinery/bots/cleanbot.dm | 12 +- code/game/machinery/bots/floorbot.dm | 10 +- code/game/machinery/bots/medbot.dm | 16 +-- code/game/machinery/bots/mulebot.dm | 12 +- code/game/machinery/camera/camera.dm | 4 +- code/game/machinery/camera/motion.dm | 2 +- .../machinery/computer/almayer_control.dm | 2 +- code/game/machinery/computer/arcade.dm | 2 +- code/game/machinery/computer/atmos_alert.dm | 8 +- .../game/machinery/computer/camera_console.dm | 2 +- .../game/machinery/computer/communications.dm | 6 +- .../machinery/computer/dropship_weapons.dm | 8 +- code/game/machinery/computer/guestpass.dm | 2 +- code/game/machinery/computer/security.dm | 10 +- code/game/machinery/computer/skills.dm | 10 +- code/game/machinery/computer/station_alert.dm | 6 +- code/game/machinery/constructable_frame.dm | 2 +- code/game/machinery/cryo.dm | 2 +- code/game/machinery/cryopod.dm | 4 +- .../machinery/door_display/door_display.dm | 2 +- code/game/machinery/doors/airlock.dm | 4 +- code/game/machinery/doors/firedoor.dm | 10 +- code/game/machinery/doors/windowdoor.dm | 10 +- code/game/machinery/iv_drip.dm | 2 +- code/game/machinery/kitchen/microwave.dm | 4 +- code/game/machinery/kitchen/processor.dm | 8 +- code/game/machinery/kitchen/smartfridge.dm | 4 +- code/game/machinery/medical_pod/autodoc.dm | 12 +- .../game/machinery/medical_pod/bodyscanner.dm | 2 +- code/game/machinery/nuclearbomb.dm | 8 +- code/game/machinery/rechargestation.dm | 2 +- code/game/machinery/scoreboard.dm | 3 +- code/game/machinery/status_display.dm | 6 +- .../telecomms/machine_interactions.dm | 4 +- .../machinery/telecomms/portable_comms.dm | 4 +- code/game/machinery/vending/cm_vending.dm | 14 +- code/game/machinery/vending/vending.dm | 4 +- .../machinery/vending/vendor_types/dress.dm | 4 +- .../vending/vendor_types/requisitions.dm | 4 +- code/game/machinery/washing_machine.dm | 2 +- .../effects/decals/cleanable/blood/blood.dm | 2 +- code/game/objects/effects/decals/posters.dm | 4 +- .../effects/effect_system/chemsmoke.dm | 8 +- code/game/objects/effects/glowshroom.dm | 2 +- .../objects/effects/spawners/gibspawner.dm | 8 +- .../effects/spawners/wo_spawners/supplies.dm | 2 +- code/game/objects/effects/spiders.dm | 4 +- code/game/objects/items.dm | 4 +- code/game/objects/items/ashtray.dm | 8 +- code/game/objects/items/bodybag.dm | 6 +- code/game/objects/items/cards_ids.dm | 10 +- .../objects/items/circuitboards/airlock.dm | 4 +- .../objects/items/circuitboards/computer.dm | 2 +- .../objects/items/devices/autopsy_scanner.dm | 6 +- .../objects/items/devices/clue_scanner.dm | 2 +- .../objects/items/devices/data_detector.dm | 2 +- .../game/objects/items/devices/radio/radio.dm | 2 +- code/game/objects/items/devices/scanners.dm | 4 +- .../objects/items/devices/taperecorder.dm | 12 +- .../objects/items/devices/teleportation.dm | 2 +- code/game/objects/items/devices/walkman.dm | 10 +- .../objects/items/explosives/explosive.dm | 14 +- code/game/objects/items/frames/camera.dm | 4 +- code/game/objects/items/frames/matrix.dm | 4 +- .../objects/items/implants/implantchair.dm | 4 +- code/game/objects/items/misc.dm | 4 +- .../items/reagent_containers/autoinjectors.dm | 2 +- .../reagent_containers/food/condiment.dm | 4 +- .../reagent_containers/food/drinks/bottle.dm | 2 +- .../food/drinks/drinkingglass.dm | 6 +- .../reagent_containers/food/drinks/jar.dm | 2 +- .../items/reagent_containers/food/sandwich.dm | 10 +- .../items/reagent_containers/food/snacks.dm | 24 ++-- .../reagent_containers/food/snacks/grown.dm | 2 +- .../reagent_containers/reagent_container.dm | 6 +- .../objects/items/reagent_containers/spray.dm | 2 +- code/game/objects/items/stacks/stack.dm | 2 +- code/game/objects/items/storage/belt.dm | 6 +- code/game/objects/items/storage/firstaid.dm | 6 +- .../objects/items/storage/large_holster.dm | 2 +- code/game/objects/items/storage/misc.dm | 6 +- code/game/objects/items/storage/pouch.dm | 16 +-- code/game/objects/items/storage/storage.dm | 18 +-- .../objects/items/storage/surgical_tray.dm | 2 +- .../objects/items/tools/experimental_tools.dm | 2 +- code/game/objects/items/tools/extinguisher.dm | 2 +- code/game/objects/items/weapons/weaponry.dm | 2 +- code/game/objects/structures/bedsheet_bin.dm | 4 +- code/game/objects/structures/bookcase.dm | 6 +- .../crates_lockers/largecrate_supplies.dm | 4 +- code/game/objects/structures/morgue.dm | 4 +- .../objects/structures/reagent_dispensers.dm | 2 +- code/game/objects/structures/safe.dm | 2 +- .../game/objects/structures/tank_dispenser.dm | 4 +- code/game/sound.dm | 2 +- code/game/supplyshuttle.dm | 22 ++-- code/game/turfs/turf.dm | 22 ++-- code/game/turfs/walls/wall_icon.dm | 12 +- code/game/verbs/who.dm | 2 +- code/game/world.dm | 2 +- code/modules/admin/IsBanned.dm | 2 +- code/modules/admin/STUI.dm | 32 ++--- code/modules/admin/admin.dm | 6 +- code/modules/admin/admin_ranks.dm | 10 +- code/modules/admin/callproc.dm | 14 +- .../admin/medal_panel/medals_panel_tgui.dm | 4 +- code/modules/admin/player_notes.dm | 2 +- .../admin/player_panel/player_panel.dm | 6 +- code/modules/admin/tabs/debug_tab.dm | 4 +- code/modules/admin/tabs/event_tab.dm | 2 +- code/modules/admin/topic/topic.dm | 14 +- code/modules/admin/topic/topic_chems.dm | 2 +- code/modules/admin/topic/topic_events.dm | 4 +- code/modules/admin/topic/topic_teleports.dm | 34 ++--- code/modules/admin/verbs/SDQL2/SDQL_2.dm | 8 +- .../admin/verbs/SDQL2/SDQL_2_parser.dm | 8 +- .../admin/verbs/SDQL2/SDQL_2_wrappers.dm | 4 +- code/modules/admin/verbs/adminhelp.dm | 14 +- code/modules/admin/verbs/adminpanelweapons.dm | 4 +- code/modules/admin/verbs/autoreplace.dm | 2 +- code/modules/admin/verbs/debug.dm | 2 +- .../admin/view_variables/debug_variables.dm | 8 +- .../admin/view_variables/get_variables.dm | 2 +- .../view_variables/mass_edit_variables.dm | 10 +- .../admin/view_variables/modify_variables.dm | 21 ++- .../view_variables/reference_tracking.dm | 4 +- .../admin/view_variables/topic_list.dm | 8 +- .../admin/view_variables/view_variables.dm | 2 +- code/modules/almayer/machinery.dm | 4 +- code/modules/asset_cache/asset_list.dm | 4 +- .../asset_cache/transports/asset_transport.dm | 4 +- code/modules/clans/client.dm | 8 +- code/modules/client/client_procs.dm | 2 +- code/modules/client/player_details.dm | 2 +- code/modules/client/preferences.dm | 8 +- code/modules/client/preferences_savefile.dm | 7 +- code/modules/clothing/clothing.dm | 6 +- code/modules/clothing/clothing_accessories.dm | 2 +- code/modules/clothing/head/helmet.dm | 2 +- code/modules/clothing/spacesuits/breaches.dm | 8 +- .../modules/clothing/spacesuits/spacesuits.dm | 2 +- .../structures/special/recovery_node.dm | 2 +- code/modules/cm_aliens/structures/tunnel.dm | 10 +- code/modules/cm_marines/dropship_equipment.dm | 2 +- code/modules/cm_marines/equipment/gear.dm | 2 +- .../modules/cm_marines/equipment/kit_boxes.dm | 2 +- code/modules/cm_marines/equipment/weapons.dm | 15 +-- code/modules/cm_marines/marines_consoles.dm | 4 +- code/modules/cm_marines/shuttle_backend.dm | 2 +- code/modules/cm_preds/yaut_items.dm | 2 +- code/modules/customitems/item_spawning.dm | 4 +- code/modules/decorators/cassette_decorator.dm | 2 +- code/modules/defenses/sentry.dm | 12 +- code/modules/droppod/droppod_ui.dm | 2 +- .../dropships/cas/fire_mission_record.dm | 2 +- code/modules/economy/economy_misc.dm | 4 +- code/modules/flufftext/Hallucination.dm | 12 +- code/modules/flufftext/TextFilters.dm | 4 +- code/modules/hydroponics/grown_inedible.dm | 2 +- code/modules/hydroponics/hydro_tools.dm | 8 +- code/modules/hydroponics/hydro_tray.dm | 4 +- code/modules/hydroponics/seed_datums.dm | 26 ++-- .../hydroponics/seed_machines/seed_editor.dm | 2 +- .../seed_machines/seed_machines.dm | 4 +- code/modules/hydroponics/vines.dm | 10 +- code/modules/mapping/preloader.dm | 2 +- code/modules/mapping/reader.dm | 10 +- .../mapping/space_management/traits.dm | 8 +- .../space_management/zlevel_manager.dm | 14 +- code/modules/mapping/verify.dm | 12 +- code/modules/mob/dead/observer/observer.dm | 6 +- code/modules/mob/hear_say.dm | 4 +- code/modules/mob/holder.dm | 2 +- code/modules/mob/inventory.dm | 12 +- code/modules/mob/language/language.dm | 6 +- .../modules/mob/language/language_handling.dm | 2 +- code/modules/mob/living/blood.dm | 6 +- code/modules/mob/living/carbon/carbon.dm | 2 +- .../mob/living/carbon/human/examine.dm | 18 +-- .../mob/living/carbon/human/exercise.dm | 2 +- code/modules/mob/living/carbon/human/human.dm | 8 +- .../mob/living/carbon/human/human_damage.dm | 8 +- .../mob/living/carbon/human/human_defense.dm | 2 +- .../mob/living/carbon/human/human_helpers.dm | 2 +- .../mob/living/carbon/human/human_movement.dm | 2 +- .../human/life/handle_regular_hud_updates.dm | 4 +- code/modules/mob/living/carbon/human/say.dm | 2 +- .../mob/living/carbon/human/species/monkey.dm | 2 +- .../living/carbon/human/species/species.dm | 2 +- .../mob/living/carbon/human/update_icons.dm | 4 +- .../mob/living/carbon/human/whisper.dm | 4 +- .../mob/living/carbon/xenomorph/XenoProcs.dm | 10 +- .../abilities/ability_helper_procs.dm | 2 +- .../xenomorph/abilities/general_powers.dm | 8 +- .../abilities/praetorian/praetorian_powers.dm | 4 +- .../xenomorph/abilities/queen/queen_powers.dm | 8 +- .../living/carbon/xenomorph/castes/Crusher.dm | 2 +- .../living/carbon/xenomorph/castes/Queen.dm | 4 +- .../living/carbon/xenomorph/damage_procs.dm | 4 +- .../living/carbon/xenomorph/hive_status.dm | 30 ++--- .../mob/living/carbon/xenomorph/life.dm | 4 +- .../mob/living/carbon/xenomorph/say.dm | 4 +- .../xenomorph/strains/castes/runner/acid.dm | 2 +- .../living/carbon/xenomorph/xeno_helpers.dm | 2 +- code/modules/mob/living/living.dm | 4 +- code/modules/mob/living/living_healthscan.dm | 8 +- code/modules/mob/living/login.dm | 2 +- .../simple_animal/friendly/farm_animals.dm | 4 +- .../hostile/retaliate/retaliate.dm | 2 +- .../mob/living/simple_animal/parrot.dm | 12 +- .../mob/living/simple_animal/simple_animal.dm | 32 ++--- code/modules/mob/mob.dm | 2 +- code/modules/mob/mob_defines.dm | 2 +- code/modules/mob/mob_grab.dm | 6 +- code/modules/mob/mob_helpers.dm | 6 +- code/modules/mob/mob_movement.dm | 2 +- code/modules/mob/new_player/new_player.dm | 4 +- code/modules/nano/nanomanager.dm | 12 +- code/modules/nano/nanoui.dm | 2 +- .../modules/nightmare/nmtasks/mapscheduler.dm | 2 +- code/modules/organs/limbs.dm | 14 +- code/modules/organs/wound.dm | 4 +- code/modules/paperwork/filingcabinet.dm | 2 +- code/modules/paperwork/folders.dm | 2 +- code/modules/paperwork/notepad.dm | 6 +- code/modules/paperwork/paper.dm | 23 ++-- code/modules/paperwork/paper_bundle.dm | 10 +- code/modules/paperwork/paperbin.dm | 6 +- code/modules/paperwork/photocopier.dm | 2 +- code/modules/power/apc.dm | 4 +- code/modules/power/power_monitor.dm | 2 +- code/modules/power/powernet.dm | 4 +- .../projectiles/ammo_boxes/ammo_boxes.dm | 4 +- .../projectiles/ammo_boxes/box_structures.dm | 16 +-- .../projectiles/ammo_boxes/misc_boxes.dm | 2 +- code/modules/projectiles/gun.dm | 2 +- code/modules/projectiles/gun_attachables.dm | 2 +- code/modules/projectiles/gun_helpers.dm | 4 +- .../modules/projectiles/guns/flamer/flamer.dm | 10 +- code/modules/projectiles/guns/shotguns.dm | 2 +- code/modules/projectiles/guns/smartgun.dm | 6 +- .../projectiles/guns/specialist/sniper.dm | 2 +- code/modules/projectiles/magazines/flamer.dm | 4 +- code/modules/projectiles/projectile.dm | 6 +- code/modules/reagents/Chemistry-Holder.dm | 18 +-- code/modules/reagents/Chemistry-Reagents.dm | 2 +- .../chemistry_machinery/autodispenser.dm | 18 +-- .../chemistry_machinery/centrifuge.dm | 10 +- .../chemistry_machinery/chem_dispenser.dm | 2 +- .../chemistry_machinery/chem_master.dm | 12 +- .../chemistry_machinery/chem_simulator.dm | 2 +- .../reagents/chemistry_machinery/pandemic.dm | 10 +- .../chemistry_machinery/reagent_analyzer.dm | 6 +- .../chemistry_machinery/reagent_grinder.dm | 10 +- .../chemistry_properties/prop_positive.dm | 2 +- code/modules/recycling/disposal.dm | 12 +- code/modules/recycling/sortingmachinery.dm | 2 +- code/modules/shuttle/docking.dm | 16 +-- code/modules/shuttle/on_move.dm | 4 +- code/modules/shuttle/shuttle.dm | 14 +- code/modules/shuttles/marine_ferry.dm | 6 +- code/modules/shuttles/shuttle_console.dm | 2 +- code/modules/teleporters/teleporter.dm | 4 +- .../modules/teleporters/teleporter_console.dm | 2 +- code/modules/tgs/core/tgs_version.dm | 6 +- code/modules/tgs/v3210/api.dm | 12 +- code/modules/tgui_panel/telemetry.dm | 2 +- code/modules/unit_tests/unit_test.dm | 2 +- .../vehicles/hardpoints/primary/minigun.dm | 2 +- .../vehicles/multitile/multitile_verbs.dm | 2 +- 381 files changed, 1252 insertions(+), 1261 deletions(-) diff --git a/code/__DEFINES/tgs.config.dm b/code/__DEFINES/tgs.config.dm index e0d5f1baac92..bd30a6707966 100644 --- a/code/__DEFINES/tgs.config.dm +++ b/code/__DEFINES/tgs.config.dm @@ -8,5 +8,5 @@ #define TGS_WARNING_LOG(message) log_world("TGS Warn: [##message]") #define TGS_ERROR_LOG(message) log_world("TGS Error: [##message]") #define TGS_NOTIFY_ADMINS(event) message_admins(##event) -#define TGS_CLIENT_COUNT GLOB.clients.len +#define TGS_CLIENT_COUNT length(GLOB.clients) #define TGS_PROTECT_DATUM(Path) GENERAL_PROTECT_DATUM(##Path) diff --git a/code/__HELPERS/_lists.dm b/code/__HELPERS/_lists.dm index dd92b9be1295..e46c92df543a 100644 --- a/code/__HELPERS/_lists.dm +++ b/code/__HELPERS/_lists.dm @@ -103,7 +103,7 @@ /proc/bitfield_to_list(bitfield = 0, list/wordlist) var/list/return_list = list() if(islist(wordlist)) - var/max = min(wordlist.len, 24) + var/max = min(length(wordlist), 24) var/bit = 1 for(var/i in 1 to max) if(bitfield & bit) @@ -148,10 +148,10 @@ * Returns TRUE if the list had nulls, FALSE otherwise **/ /proc/list_clear_nulls(list/list_to_clear) - var/start_len = list_to_clear.len + var/start_len = length(list_to_clear) var/list/new_list = new(start_len) list_to_clear -= new_list - return list_to_clear.len < start_len + return length(list_to_clear) < start_len ///Return a list with no duplicate entries /proc/unique_list(list/inserted_list) @@ -174,6 +174,6 @@ if(!inserted_list) return - for(var/i in 1 to inserted_list.len - 1) - inserted_list.Swap(i, rand(i, inserted_list.len)) + for(var/i in 1 to length(inserted_list) - 1) + inserted_list.Swap(i, rand(i, length(inserted_list))) diff --git a/code/__HELPERS/chat.dm b/code/__HELPERS/chat.dm index 20d1a45b31cc..4629c699636a 100644 --- a/code/__HELPERS/chat.dm +++ b/code/__HELPERS/chat.dm @@ -22,7 +22,7 @@ if((!admin_only || channel.is_admin_channel) && (channel_tag in applicable_tags)) channels_to_use += channel - if(channels_to_use.len) + if(length(channels_to_use)) world.TgsChatBroadcast(message, channels_to_use) /** diff --git a/code/__HELPERS/game.dm b/code/__HELPERS/game.dm index 721c179b9cef..5bf36f785746 100644 --- a/code/__HELPERS/game.dm +++ b/code/__HELPERS/game.dm @@ -58,7 +58,7 @@ /proc/recursive_mob_check(atom/O, list/L = list(), recursion_limit = 3, client_check = 1, sight_check = 1, include_radio = 1) - //debug_mob += O.contents.len + //debug_mob += length(O.contents) if(!recursion_limit) return L for(var/atom/A in O.contents) @@ -294,7 +294,7 @@ * * cache_only - Whether to not actually send a to_chat message and instead only update larva_queue_cached_message */ /proc/message_alien_candidates(list/candidates, dequeued, cache_only = FALSE) - for(var/i in (1 + dequeued) to candidates.len) + for(var/i in (1 + dequeued) to length(candidates)) var/mob/dead/observer/cur_obs = candidates[i] // Generate the messages diff --git a/code/__HELPERS/guid.dm b/code/__HELPERS/guid.dm index 49903cceb3c3..e763aaf73b69 100644 --- a/code/__HELPERS/guid.dm +++ b/code/__HELPERS/guid.dm @@ -6,7 +6,7 @@ /proc/GUID() var/const/GUID_VERSION = "b" var/const/GUID_VARIANT = "d" - var/node_id = copytext_char(md5("[rand()*rand(1,9999999)][world.name][world.hub][world.hub_password][world.internet_address][world.address][world.contents.len][world.status][world.port][rand()*rand(1,9999999)]"), 1, 13) + var/node_id = copytext_char(md5("[rand()*rand(1,9999999)][world.name][world.hub][world.hub_password][world.internet_address][world.address][length(world.contents)][world.status][world.port][rand()*rand(1,9999999)]"), 1, 13) var/time_high = "[num2hex(text2num(time2text(world.realtime,"YYYY")), 2)][num2hex(world.realtime, 6)]" diff --git a/code/__HELPERS/icons.dm b/code/__HELPERS/icons.dm index 081fcec5a137..fcfb512e0c12 100644 --- a/code/__HELPERS/icons.dm +++ b/code/__HELPERS/icons.dm @@ -332,7 +332,7 @@ world /proc/getFlatIcon(image/appearance, defdir, deficon, defstate, defblend, start = TRUE, no_anim = FALSE, appearance_flags = FALSE) // Loop through the underlays, then overlays, sorting them into the layers list #define PROCESS_OVERLAYS_OR_UNDERLAYS(flat, process, base_layer) \ - for (var/i in 1 to process.len) { \ + for (var/i in 1 to length(process)) { \ var/image/current = process[i]; \ if (!current) { \ continue; \ @@ -347,7 +347,7 @@ world } \ current_layer = base_layer + appearance.layer + current_layer / 1000; \ } \ - for (var/index_to_compare_to in 1 to layers.len) { \ + for (var/index_to_compare_to in 1 to length(layers)) { \ var/compare_to = layers[index_to_compare_to]; \ if (current_layer < layers[compare_to]) { \ layers.Insert(index_to_compare_to, current); \ @@ -403,7 +403,7 @@ world var/curblend = appearance.blend_mode || defblend - if(appearance.overlays.len || appearance.underlays.len) + if(length(appearance.overlays) || length(appearance.underlays)) var/icon/flat = icon(flat_template) // Layers will be a sorted list of icons/overlays, based on the order in which they are displayed var/list/layers = list() @@ -556,7 +556,7 @@ world /proc/sort_atoms_by_layer(list/atoms) // Comb sort icons based on levels var/list/result = atoms.Copy() - var/gap = result.len + var/gap = length(result) var/swapped = 1 while (gap > 1 || swapped) swapped = 0 @@ -564,7 +564,7 @@ world gap = floor(gap / 1.3) // 1.3 is the emperic comb sort coefficient if(gap < 1) gap = 1 - for(var/i = 1; gap + i <= result.len; i++) + for(var/i = 1; gap + i <= length(result); i++) var/atom/l = result[i] //Fucking hate var/atom/r = result[gap+i] //how lists work here if(l.layer > r.layer) //no "result[i].layer" for me diff --git a/code/__HELPERS/lists.dm b/code/__HELPERS/lists.dm index 856a0a492cbb..d5212611a04b 100644 --- a/code/__HELPERS/lists.dm +++ b/code/__HELPERS/lists.dm @@ -12,7 +12,7 @@ //Returns a list in plain english as a string /proc/english_list(list/input, nothing_text = "nothing", and_text = " and ", comma_text = ", ", final_comma_text = "" ) - var/total = input.len + var/total = length(input) if (!total) return "[nothing_text]" else if (total == 1) @@ -33,9 +33,9 @@ //Returns list element or null. Should prevent "index out of bounds" error. /proc/listgetindex(list/list,index) - if(istype(list) && list.len) + if(istype(list) && length(list)) if(isnum(index)) - if(ISINRANGE(index,1,list.len)) + if(ISINRANGE(index,1,length(list))) return list[index] else if(list[index]) return list[index] @@ -106,35 +106,35 @@ /// Pick a random element from the list and remove it from the list. /proc/pick_n_take(list/L) RETURN_TYPE(L[_].type) - if(L.len) - var/picked = rand(1,L.len) + if(length(L)) + var/picked = rand(1,length(L)) . = L[picked] L.Cut(picked,picked+1) //Cut is far more efficient that Remove() //Returns the top(last) element from the list and removes it from the list (typical stack function) /proc/pop(list/L) - if(L.len) - . = L[L.len] + if(length(L)) + . = L[length(L)] L.len-- /proc/popleft(list/L) - if(L.len) + if(length(L)) . = L[1] L.Cut(1,2) //Returns the next element in parameter list after first appearance of parameter element. If it is the last element of the list or not present in list, returns first element. /proc/next_in_list(element, list/L) - for(var/i=1, i1, i--) + for(var/i=length(L), i>1, i--) if(L[i] == element) return L[i-1] - return L[L.len] + return L[length(L)] /* * Sorting @@ -144,7 +144,7 @@ /proc/reverselist(list/L) var/list/output = list() if(L) - for(var/i = L.len; i >= 1; i--) + for(var/i = length(L); i >= 1; i--) output += L[i] return output @@ -155,7 +155,7 @@ . = L_n var/L_o[] = L.Copy() var/i - while(L_o.len) + while(length(L_o)) i = pick(L_o) if(!ref) L_n += i else L_n[i] = L_o[i] @@ -171,9 +171,9 @@ //Mergesort: divides up the list into halves to begin the sort /proc/sortKey(list/client/L, order = 1) - if(isnull(L) || L.len < 2) + if(isnull(L) || length(L) < 2) return L - var/middle = L.len / 2 + 1 + var/middle = length(L) / 2 + 1 return mergeKey(sortKey(L.Copy(0,middle)), sortKey(L.Copy(middle)), order) //Mergsort: does the actual sorting and returns the results back to sortAtom @@ -181,7 +181,7 @@ var/Li=1 var/Ri=1 var/list/result = new() - while(Li <= L.len && Ri <= R.len) + while(Li <= length(L) && Ri <= length(R)) var/client/rL = L[Li] var/client/rR = R[Ri] if(sorttext(rL.ckey, rR.ckey) == order) @@ -189,20 +189,20 @@ else result += R[Ri++] - if(Li <= L.len) + if(Li <= length(L)) return (result + L.Copy(Li, 0)) return (result + R.Copy(Ri, 0)) // Quicksort implementation /proc/sortAtom(list/atom/L, order = 1) - if(isnull(L) || L.len < 2) + if(isnull(L) || length(L) < 2) return L var/startIndex = 1 var/list/atom/M = new/list() for(var/atom/mob in L) if(istype(mob)) M.Add(mob) - var/endIndex = M.len - 1 + var/endIndex = length(M) - 1 var/top = 0 var/list/stack[endIndex*2] stack[++top] = startIndex @@ -241,9 +241,9 @@ /proc/sortRecord(list/datum/data/record/L, field = "name", order = 1) if(isnull(L)) return list() - if(L.len < 2) + if(length(L) < 2) return L - var/middle = L.len / 2 + 1 + var/middle = length(L) / 2 + 1 return mergeRecordLists(sortRecord(L.Copy(0, middle), field, order), sortRecord(L.Copy(middle), field, order), field, order) //Mergsort: does the actual sorting and returns the results back to sortRecord @@ -252,7 +252,7 @@ var/Ri=1 var/list/result = new() if(!isnull(L) && !isnull(R)) - while(Li <= L.len && Ri <= R.len) + while(Li <= length(L) && Ri <= length(R)) var/datum/data/record/rL = L[Li] if(isnull(rL)) L -= rL @@ -266,7 +266,7 @@ else result += R[Ri++] - if(Li <= L.len) + if(Li <= length(L)) return (result + L.Copy(Li, 0)) return (result + R.Copy(Ri, 0)) @@ -285,9 +285,9 @@ RETURN_TYPE(/list) if(!istype(L)) return - if(L.len < 2) + if(length(L) < 2) return L - var/middle = L.len / 2 + 1 // Copy is first,second-1 + var/middle = length(L) / 2 + 1 // Copy is first,second-1 return mergeLists(sortList(L.Copy(0,middle)), sortList(L.Copy(middle))) //second parameter null = to end of list //Mergsorge: uses sortList() but uses the var's name specifically. This should probably be using mergeAtom() instead @@ -301,13 +301,13 @@ var/Li=1 var/Ri=1 var/list/result = new() - while(Li <= L.len && Ri <= R.len) + while(Li <= length(L) && Ri <= length(R)) if(sorttext(L[Li], R[Ri]) < 1) result += R[Ri++] else result += L[Li++] - if(Li <= L.len) + if(Li <= length(L)) return (result + L.Copy(Li, 0)) return (result + R.Copy(Ri, 0)) @@ -322,68 +322,68 @@ // List of lists, sorts by element[key] - for things like crew monitoring computer sorting records by name. /proc/sortByKey(list/L, key) - if(L.len < 2) + if(length(L) < 2) return L - var/middle = L.len / 2 + 1 + var/middle = length(L) / 2 + 1 return mergeKeyedLists(sortByKey(L.Copy(0, middle), key), sortByKey(L.Copy(middle), key), key) /proc/mergeKeyedLists(list/L, list/R, key) var/Li=1 var/Ri=1 var/list/result = new() - while(Li <= L.len && Ri <= R.len) + while(Li <= length(L) && Ri <= length(R)) if(sorttext(L[Li][key], R[Ri][key]) < 1) // Works around list += list2 merging lists; it's not pretty but it works result += "temp item" - result[result.len] = R[Ri++] + result[length(result)] = R[Ri++] else result += "temp item" - result[result.len] = L[Li++] + result[length(result)] = L[Li++] - if(Li <= L.len) + if(Li <= length(L)) return (result + L.Copy(Li, 0)) return (result + R.Copy(Ri, 0)) //Mergesort: any value in a list, preserves key=value structure /proc/sortAssoc(list/L) - if(L.len < 2) + if(length(L) < 2) return L - var/middle = L.len / 2 + 1 // Copy is first,second-1 + var/middle = length(L) / 2 + 1 // Copy is first,second-1 return mergeAssoc(sortAssoc(L.Copy(0,middle)), sortAssoc(L.Copy(middle))) //second parameter null = to end of list /proc/mergeAssoc(list/L, list/R) var/Li=1 var/Ri=1 var/list/result = new() - while(Li <= L.len && Ri <= R.len) + while(Li <= length(L) && Ri <= length(R)) if(sorttext(L[Li], R[Ri]) < 1) result += R&R[Ri++] else result += L&L[Li++] - if(Li <= L.len) + if(Li <= length(L)) return (result + L.Copy(Li, 0)) return (result + R.Copy(Ri, 0)) // Same as sortAssoc but rather than creating a whole new list keeps the original list ref and just returns that list modified /proc/sortAssocKeepList(list/L) - if(L.len < 2) + if(length(L) < 2) return L - var/middle = L.len / 2 + 1 // Copy is first,second-1 + var/middle = length(L) / 2 + 1 // Copy is first,second-1 return mergeAssocKeepList(sortAssoc(L.Copy(0,middle)), sortAssoc(L.Copy(middle)), L) //second parameter null = to end of list /proc/mergeAssocKeepList(list/L, list/R, list/original) var/Li=1 var/Ri=1 var/list/result = new() - while(Li <= L.len && Ri <= R.len) + while(Li <= length(L) && Ri <= length(R)) if(sorttext(L[Li], R[Ri]) < 1) result += R&R[Ri++] else result += L&L[Li++] - if(Li <= L.len) + if(Li <= length(L)) result += L.Copy(Li, 0) else result += R.Copy(Ri, 0) @@ -408,7 +408,7 @@ /proc/bitfield2list(bitfield = 0, list/wordlist) var/list/r = list() if(islist(wordlist)) - var/max = min(wordlist.len,16) + var/max = min(length(wordlist),16) var/bit = 1 for(var/i=1, i<=max, i++) if(bitfield & bit) @@ -430,9 +430,9 @@ //Move a single element from position fromIndex within a list, to position toIndex //All elements in the range [1,toIndex) before the move will be before the pivot afterwards -//All elements in the range [toIndex, L.len+1) before the move will be after the pivot afterwards +//All elements in the range [toIndex, length(L)+1) before the move will be after the pivot afterwards //In other words, it's as if the range [fromIndex,toIndex) have been rotated using a <<< operation common to other languages. -//fromIndex and toIndex must be in the range [1,L.len+1] +//fromIndex and toIndex must be in the range [1,length(L)+1] //This will preserve associations ~Carnie /proc/moveElement(list/L, fromIndex, toIndex) if(fromIndex == toIndex || fromIndex+1 == toIndex) //no need to move @@ -493,13 +493,13 @@ //replaces reverseList ~Carnie /proc/reverseRange(list/L, start=1, end=0) - if(L.len) - start = start % L.len - end = end % (L.len+1) + if(length(L)) + start = start % length(L) + end = end % (length(L)+1) if(start <= 0) - start += L.len + start += length(L) if(end <= 0) - end += L.len + 1 + end += length(L) + 1 --end while(start < end) @@ -518,13 +518,13 @@ ///replaces reverseList ~Carnie /proc/reverse_range(list/inserted_list, start = 1, end = 0) - if(inserted_list.len) - start = start % inserted_list.len - end = end % (inserted_list.len + 1) + if(length(inserted_list)) + start = start % length(inserted_list) + end = end % (length(inserted_list) + 1) if(start <= 0) - start += inserted_list.len + start += length(inserted_list) if(end <= 0) - end += inserted_list.len + 1 + end += length(inserted_list) + 1 --end while(start < end) @@ -574,7 +574,7 @@ var/list/found = list() for(var/atom/A in contents) found += A - if(A.contents.len) + if(length(A.contents)) found += A.contents_recursive() return found @@ -582,7 +582,7 @@ var/list/found = list() for(var/atom/A in contents) found += A - if(A.contents.len) + if(length(A.contents)) found += A.contents return found @@ -594,15 +594,15 @@ if(!sort) return L - if(L.len <= 1) + if(length(L) <= 1) return L - var/middle = floor(L.len / 2) + var/middle = floor(length(L) / 2) var/list/left = custom_mergesort(L.Copy(1, middle + 1)) var/list/right = custom_mergesort(L.Copy(middle + 1)) var/list/result = list() - while(left.len > 0 && right.len > 0) + while(length(left) > 0 && length(right) > 0) var/a = left[1] var/b = right[1] @@ -613,11 +613,11 @@ result += b right.Cut(1,2) - while(left.len > 0) + while(length(left) > 0) result += left[1] left.Cut(1,2) - while(right.len > 0) + while(length(right) > 0) result += right[1] right.Cut(1,2) diff --git a/code/__HELPERS/mobs.dm b/code/__HELPERS/mobs.dm index b5bf7a02d026..1d123b3a8e00 100644 --- a/code/__HELPERS/mobs.dm +++ b/code/__HELPERS/mobs.dm @@ -26,7 +26,7 @@ continue valid_hairstyles[hairstyle] = GLOB.hair_styles_list[hairstyle] - if(valid_hairstyles.len) + if(length(valid_hairstyles)) h_style = pick(valid_hairstyles) return h_style @@ -48,7 +48,7 @@ continue valid_facialhairstyles[facialhairstyle] = GLOB.facial_hair_styles_list[facialhairstyle] - if(valid_facialhairstyles.len) + if(length(valid_facialhairstyles)) f_style = pick(valid_facialhairstyles) return f_style diff --git a/code/__HELPERS/sanitize_values.dm b/code/__HELPERS/sanitize_values.dm index eddb326568c0..291246e621a0 100644 --- a/code/__HELPERS/sanitize_values.dm +++ b/code/__HELPERS/sanitize_values.dm @@ -20,7 +20,7 @@ /proc/sanitize_inlist(value, list/List, default) if(value in List) return value if(default) return default - if(List && List.len)return List[1] + if(LAZYLEN(List))return List[1] /proc/sanitize_list(list/List, list/filter = list(null), default = list()) if(!islist(List)) diff --git a/code/__HELPERS/shell.dm b/code/__HELPERS/shell.dm index 35a8e4635b41..a165a7981fe8 100644 --- a/code/__HELPERS/shell.dm +++ b/code/__HELPERS/shell.dm @@ -20,7 +20,7 @@ shelleo_id = "[seo_id]" break if(!shelleo_id) - shelleo_id = "[shelleo_ids.len + 1]" + shelleo_id = "[length(shelleo_ids) + 1]" shelleo_ids += shelleo_id shelleo_ids[shelleo_id] = TRUE out_file = "[SHELLEO_NAME][shelleo_id][SHELLEO_OUT]" diff --git a/code/__HELPERS/sorts/TimSort.dm b/code/__HELPERS/sorts/TimSort.dm index ae83bd9b0682..89a93802edee 100644 --- a/code/__HELPERS/sorts/TimSort.dm +++ b/code/__HELPERS/sorts/TimSort.dm @@ -1,12 +1,12 @@ //TimSort interface /proc/sortTim(list/L, cmp=/proc/cmp_numeric_asc, associative, fromIndex=1, toIndex=0) - if(L && L.len >= 2) - fromIndex = fromIndex % L.len - toIndex = toIndex % (L.len+1) + if(length(L) >= 2) + fromIndex = fromIndex % length(L) + toIndex = toIndex % (length(L)+1) if(fromIndex <= 0) - fromIndex += L.len + fromIndex += length(L) if(toIndex <= 0) - toIndex += L.len + 1 + toIndex += length(L) + 1 var/datum/sortInstance/sort_instance = GLOB.sortInstance if(!sort_instance) diff --git a/code/__HELPERS/sorts/_Main.dm b/code/__HELPERS/sorts/_Main.dm index 7fe3adf02870..4caf2c4c068e 100644 --- a/code/__HELPERS/sorts/_Main.dm +++ b/code/__HELPERS/sorts/_Main.dm @@ -76,7 +76,7 @@ GLOBAL_DATUM_INIT(sortInstance, /datum/sortInstance, new()) //Merge all remaining runs to complete sort //ASSERT(start == end) mergeForceCollapse(); - //ASSERT(runBases.len == 1) + //ASSERT(length(runBases) == 1) //reset minGallop, for successive calls minGallop = MIN_GALLOP @@ -178,8 +178,8 @@ GLOBAL_DATUM_INIT(sortInstance, /datum/sortInstance, new()) //This method is called each time a new run is pushed onto the stack. //So the invariants are guaranteed to hold for i= 2) - var/n = runBases.len - 1 + while(length(runBases) >= 2) + var/n = length(runBases) - 1 if(n > 1 && runLens[n-1] <= runLens[n] + runLens[n+1]) if(runLens[n-1] < runLens[n+1]) --n @@ -193,8 +193,8 @@ GLOBAL_DATUM_INIT(sortInstance, /datum/sortInstance, new()) //Merges all runs on the stack until only one remains. //Called only once, to finalise the sort /datum/sortInstance/proc/mergeForceCollapse() - while(runBases.len >= 2) - var/n = runBases.len - 1 + while(length(runBases) >= 2) + var/n = length(runBases) - 1 if(n > 1 && runLens[n-1] < runLens[n+1]) --n mergeAt(n) @@ -204,9 +204,9 @@ GLOBAL_DATUM_INIT(sortInstance, /datum/sortInstance, new()) //Run i must be the penultimate or antepenultimate run on the stack //In other words, i must be equal to stackSize-2 or stackSize-3 /datum/sortInstance/proc/mergeAt(i) - //ASSERT(runBases.len >= 2) + //ASSERT(length(runBases) >= 2) //ASSERT(i >= 1) - //ASSERT(i == runBases.len - 1 || i == runBases.len - 2) + //ASSERT(i == length(runBases) - 1 || i == length(runBases) - 2) var/base1 = runBases[i] var/base2 = runBases[i+1] @@ -596,8 +596,8 @@ GLOBAL_DATUM_INIT(sortInstance, /datum/sortInstance, new()) while(remaining > 0) - while(runBases.len >= 2) - var/n = runBases.len - 1 + while(length(runBases) >= 2) + var/n = length(runBases) - 1 if(n > 1 && runLens[n-1] <= runLens[n] + runLens[n+1]) if(runLens[n-1] < runLens[n+1]) --n @@ -607,8 +607,8 @@ GLOBAL_DATUM_INIT(sortInstance, /datum/sortInstance, new()) else break //Invariant is established - while(runBases.len >= 2) - var/n = runBases.len - 1 + while(length(runBases) >= 2) + var/n = length(runBases) - 1 if(n > 1 && runLens[n-1] < runLens[n+1]) --n mergeAt2(n) diff --git a/code/__HELPERS/unsorted.dm b/code/__HELPERS/unsorted.dm index 5b9154eac655..d8eebf79bca6 100644 --- a/code/__HELPERS/unsorted.dm +++ b/code/__HELPERS/unsorted.dm @@ -534,7 +534,7 @@ /atom/proc/GetAllContents(searchDepth = 5, list/toReturn = list()) for(var/atom/part as anything in contents) toReturn += part - if(part.contents.len && searchDepth) + if(length(part.contents) && searchDepth) part.GetAllContents(searchDepth - 1, toReturn) return toReturn @@ -555,7 +555,7 @@ if(part.loc != src) // That's a multitile atom, and it's not actually here stricto sensu continue toReturn += part - if(part.contents.len && searchDepth) + if(length(part.contents) && searchDepth) part.GetAllContents(searchDepth - 1, toReturn) return toReturn @@ -1082,7 +1082,7 @@ GLOBAL_DATUM(action_purple_power_up, /image) var/list/doors = new/list() - if(toupdate.len) + if(length(toupdate)) for(var/turf/T1 in toupdate) for(var/obj/structure/machinery/door/D2 in T1) doors += D2 @@ -1091,7 +1091,7 @@ GLOBAL_DATUM(action_purple_power_up, /image) else air_master.tiles_to_update += T1*/ - if(fromupdate.len) + if(length(fromupdate)) for(var/turf/T2 in fromupdate) for(var/obj/structure/machinery/door/D2 in T2) doors += D2 @@ -1287,7 +1287,7 @@ GLOBAL_LIST_INIT(WALLITEMS, list( for(var/turf/T in orange(origin, outer_range)) if(!inner_range || get_dist(origin, T) >= inner_range) turfs += T - if(turfs.len) + if(length(turfs)) return pick(turfs) // Returns true if arming a given explosive might be considered grief @@ -1531,7 +1531,7 @@ GLOBAL_DATUM_INIT(dview_mob, /mob/dview, new) return GetAllContents() var/list/processing = list(src) var/list/assembled = list() - while(processing.len) + while(length(processing)) var/atom/A = processing[1] processing.Cut(1,2) if(!ignore_typecache[A.type]) diff --git a/code/_globalvars/global_lists.dm b/code/_globalvars/global_lists.dm index e663bc287946..c054b9a4bf1f 100644 --- a/code/_globalvars/global_lists.dm +++ b/code/_globalvars/global_lists.dm @@ -303,7 +303,7 @@ GLOBAL_LIST_INIT(hj_emotes, setup_hazard_joe_emotes()) /proc/number_list_decode(number_list_data) var/list/L = params2list(number_list_data) - for(var/i in 1 to L.len) + for(var/i in 1 to length(L)) L[i] = text2num(L[i]) return L diff --git a/code/_macros.dm b/code/_macros.dm index 075d098e3d50..abfa83df7d36 100644 --- a/code/_macros.dm +++ b/code/_macros.dm @@ -74,7 +74,7 @@ lazy_list[key] |= value; // Insert an object A into a sorted list using cmp_proc (/code/_helpers/cmp.dm) for comparison. -#define ADD_SORTED(list, A, cmp_proc) if(!list.len) {list.Add(A)} else {list.Insert(FindElementIndex(A, list, cmp_proc), A)} +#define ADD_SORTED(list, A, cmp_proc) if(!length(list)) {list.Add(A)} else {list.Insert(FindElementIndex(A, list, cmp_proc), A)} //Currently used in SDQL2 stuff #define send_output(target, msg, control) target << output(msg, control) diff --git a/code/_onclick/adjacent.dm b/code/_onclick/adjacent.dm index 678c5373fe67..af0882d6a9df 100644 --- a/code/_onclick/adjacent.dm +++ b/code/_onclick/adjacent.dm @@ -262,10 +262,10 @@ Quick adjacency (to turf): // Make sure pass flags are removed A.remove_temp_pass_flags(pass_flags) - if ((fd1 && !blockers["fd1"].len) || (fd2 && !blockers["fd2"].len)) // This means that for a given direction it did not have a blocker + if ((fd1 && !length(blockers["fd1"])) || (fd2 && !length(blockers["fd2"]))) // This means that for a given direction it did not have a blocker return src - if (blockers["fd1"].len || blockers["fd2"].len) + if (length(blockers["fd1"]) || length(blockers["fd2"])) var/guaranteed_hit = 0 // indicates whether there is a guaranteed hit (aka there is not chance to bypass blocker). 0 = nothing var/list/cur_dense_blockers = list() for (var/atom/blocker in blockers["fd1"]) diff --git a/code/_onclick/click.dm b/code/_onclick/click.dm index 57c529c7a156..a5d07ec060cb 100644 --- a/code/_onclick/click.dm +++ b/code/_onclick/click.dm @@ -199,7 +199,7 @@ if (mods["alt"]) var/turf/T = get_turf(src) - if(T && user.TurfAdjacent(T) && T.contents.len) + if(T && user.TurfAdjacent(T) && length(T.contents)) user.set_listed_turf(T) return TRUE diff --git a/code/_onclick/click_hold.dm b/code/_onclick/click_hold.dm index 41e2be147d85..1d6c25619e5e 100644 --- a/code/_onclick/click_hold.dm +++ b/code/_onclick/click_hold.dm @@ -88,7 +88,7 @@ if(mods["left"]) SEND_SIGNAL(src, COMSIG_CLIENT_LMB_DRAG, src_obj, over_obj, params) - var/atom/last_atom = LAZYACCESS(mouse_trace_history, mouse_trace_history.len) + var/atom/last_atom = LAZYACCESS(mouse_trace_history, length(mouse_trace_history)) if(over_obj == last_atom) return diff --git a/code/_onclick/hud/hud.dm b/code/_onclick/hud/hud.dm index 7277c74b2fd3..2d49abb52012 100644 --- a/code/_onclick/hud/hud.dm +++ b/code/_onclick/hud/hud.dm @@ -91,19 +91,19 @@ /datum/hud/Destroy() if(mymob.hud_used == src) mymob.hud_used = null - if(static_inventory.len) + if(length(static_inventory)) for(var/thing in static_inventory) qdel(thing) static_inventory.Cut() - if(toggleable_inventory.len) + if(length(toggleable_inventory)) for(var/thing in toggleable_inventory) qdel(thing) toggleable_inventory.Cut() - if(hotkeybuttons.len) + if(length(hotkeybuttons)) for(var/thing in hotkeybuttons) qdel(thing) hotkeybuttons.Cut() - if(infodisplay.len) + if(length(infodisplay)) for(var/thing in infodisplay) qdel(thing) infodisplay.Cut() @@ -188,24 +188,24 @@ switch(display_hud_version) if(HUD_STYLE_STANDARD) //Default HUD hud_shown = 1 //Governs behavior of other procs - if(static_inventory.len) + if(length(static_inventory)) screenmob.client.add_to_screen(static_inventory) - if(toggleable_inventory.len && inventory_shown) + if(length(toggleable_inventory) && inventory_shown) screenmob.client.add_to_screen(toggleable_inventory) - if(hotkeybuttons.len && !hotkey_ui_hidden) + if(length(hotkeybuttons) && !hotkey_ui_hidden) screenmob.client.add_to_screen(hotkeybuttons) - if(infodisplay.len) + if(length(infodisplay)) screenmob.client.add_to_screen(infodisplay) if(HUD_STYLE_REDUCED) //Reduced HUD hud_shown = 0 //Governs behavior of other procs - if(static_inventory.len) + if(length(static_inventory)) screenmob.client.remove_from_screen(static_inventory) - if(toggleable_inventory.len) + if(length(toggleable_inventory)) screenmob.client.remove_from_screen(toggleable_inventory) - if(hotkeybuttons.len) + if(length(hotkeybuttons)) screenmob.client.remove_from_screen(hotkeybuttons) - if(infodisplay.len) + if(length(infodisplay)) screenmob.client.add_to_screen(infodisplay) //These ones are a part of 'static_inventory', 'toggleable_inventory' or 'hotkeybuttons' but we want them to stay @@ -218,13 +218,13 @@ if(HUD_STYLE_NOHUD) //No HUD hud_shown = 0 //Governs behavior of other procs - if(static_inventory.len) + if(length(static_inventory)) screenmob.client.remove_from_screen(static_inventory) - if(toggleable_inventory.len) + if(length(toggleable_inventory)) screenmob.client.remove_from_screen(toggleable_inventory) - if(hotkeybuttons.len) + if(length(hotkeybuttons)) screenmob.client.remove_from_screen(hotkeybuttons) - if(infodisplay.len) + if(length(infodisplay)) screenmob.client.remove_from_screen(infodisplay) hud_version = display_hud_version diff --git a/code/_onclick/hud/human.dm b/code/_onclick/hud/human.dm index b8b55b42c028..bbdfaa25b92f 100644 --- a/code/_onclick/hud/human.dm +++ b/code/_onclick/hud/human.dm @@ -120,7 +120,7 @@ if(!screenmob?.client) return - if(!gear.len) + if(!length(gear)) inventory_shown = FALSE return //species without inv slots don't show items. diff --git a/code/_onclick/hud/radial.dm b/code/_onclick/hud/radial.dm index 2886b2edb0ee..244e79e583f6 100644 --- a/code/_onclick/hud/radial.dm +++ b/code/_onclick/hud/radial.dm @@ -143,9 +143,9 @@ GLOBAL_LIST_EMPTY(radial_menus) zone = 360 - starting_angle + ending_angle max_elements = floor(zone / min_angle) - var/paged = max_elements < choices.len - if(elements.len < max_elements) - var/elements_to_add = max_elements - elements.len + var/paged = max_elements < length(choices) + if(length(elements) < max_elements) + var/elements_to_add = max_elements - length(elements) for(var/i in 1 to elements_to_add) //Create all elements var/atom/movable/screen/radial/slice/new_element = new /atom/movable/screen/radial/slice new_element.tooltips = use_tooltips @@ -246,7 +246,7 @@ GLOBAL_LIST_EMPTY(radial_menus) selected_choice = choices_values[choice_id] /datum/radial_menu/proc/get_next_id() - return "c_[choices.len]" + return "c_[length(choices)]" /datum/radial_menu/proc/set_choices(list/new_choices, use_tooltips, use_labels) if(length(choices)) diff --git a/code/_onclick/hud/screen_objects.dm b/code/_onclick/hud/screen_objects.dm index 8508352bb338..a8162911804b 100644 --- a/code/_onclick/hud/screen_objects.dm +++ b/code/_onclick/hud/screen_objects.dm @@ -119,7 +119,7 @@ layer = HUD_LAYER /atom/movable/screen/storage/proc/update_fullness(obj/item/storage/master_storage) - if(!master_storage.contents.len) + if(!length(master_storage.contents)) color = null else var/total_w = 0 @@ -131,7 +131,7 @@ if (master_storage.storage_slots == null) fullness = floor(10*total_w/master_storage.max_storage_space) else - fullness = floor(10*master_storage.contents.len/master_storage.storage_slots) + fullness = floor(10*length(master_storage.contents)/master_storage.storage_slots) switch(fullness) if(10) color = "#ff0000" diff --git a/code/_onclick/item_attack.dm b/code/_onclick/item_attack.dm index ffcab30234ae..1a3c279db8b3 100644 --- a/code/_onclick/item_attack.dm +++ b/code/_onclick/item_attack.dm @@ -90,7 +90,7 @@ power = floor(power * (1 + 0.25 * user.skills.get_skill_level(SKILL_MELEE_WEAPONS))) //25% bonus per melee level if(!ishuman(M)) var/used_verb = "attacked" - if(attack_verb && attack_verb.len) + if(LAZYLEN(attack_verb)) used_verb = pick(attack_verb) user.visible_message(SPAN_DANGER("[M] has been [used_verb] with [src][showname]."), \ SPAN_DANGER("You [used_verb] [M == user ? "yourself":M] with [src]."), null, 5, CHAT_TYPE_MELEE_HIT) diff --git a/code/_onclick/ventcrawl.dm b/code/_onclick/ventcrawl.dm index e1877dcbd0a7..72fe31f35cdc 100644 --- a/code/_onclick/ventcrawl.dm +++ b/code/_onclick/ventcrawl.dm @@ -24,10 +24,10 @@ for(var/obj/structure/pipes/vents/V in range(1)) if(Adjacent(V) && !V.welded) pipes |= V - if(!pipes || !pipes.len) + if(!LAZYLEN(pipes)) to_chat(src, SPAN_WARNING("There are no pipes that we can ventcrawl into within range!")) return - if(pipes.len == 1) + if(length(pipes) == 1) pipe = pipes[1] else pipe = tgui_input_list(usr, "Crawl Through Vent", "Pick a pipe", pipes) diff --git a/code/controllers/configuration/config_entry.dm b/code/controllers/configuration/config_entry.dm index 657e7470fc54..49dae4c2ff38 100644 --- a/code/controllers/configuration/config_entry.dm +++ b/code/controllers/configuration/config_entry.dm @@ -125,7 +125,7 @@ if(isnull(temp)) return FALSE new_list += temp - if(!new_list.len) + if(!length(new_list)) return FALSE config_entry_value = new_list return TRUE diff --git a/code/controllers/configuration/configuration.dm b/code/controllers/configuration/configuration.dm index 147f57fcb1aa..7207f878614a 100644 --- a/code/controllers/configuration/configuration.dm +++ b/code/controllers/configuration/configuration.dm @@ -329,7 +329,7 @@ continue in_character_filter += REGEX_QUOTE(line) - ic_filter_regex = in_character_filter.len ? regex("\\b([jointext(in_character_filter, "|")])\\b", "i") : null + ic_filter_regex = length(in_character_filter) ? regex("\\b([jointext(in_character_filter, "|")])\\b", "i") : null //Message admins when you can. /datum/controller/configuration/proc/DelayedMessageAdmins(text) diff --git a/code/controllers/mc/globals.dm b/code/controllers/mc/globals.dm index 724f58010699..59b96c017d10 100644 --- a/code/controllers/mc/globals.dm +++ b/code/controllers/mc/globals.dm @@ -20,7 +20,7 @@ GLOBAL_REAL(GLOB, /datum/controller/global_vars) QDEL_IN(exclude_these, 0) //signal logging isn't ready - log_world("[vars.len - gvars_datum_in_built_vars.len] global variables") + log_world("[length(vars) - length(gvars_datum_in_built_vars)] global variables") Initialize() @@ -42,10 +42,10 @@ GLOBAL_REAL(GLOB, /datum/controller/global_vars) gvars_datum_init_order = list() gvars_datum_protected_varlist = list(NAMEOF(src, gvars_datum_protected_varlist) = TRUE) var/list/global_procs = typesof(/datum/controller/global_vars/proc) - var/expected_len = vars.len - gvars_datum_in_built_vars.len - if(global_procs.len != expected_len) - warning("Unable to detect all global initialization procs! Expected [expected_len] got [global_procs.len]!") - if(global_procs.len) + var/expected_len = length(vars) - length(gvars_datum_in_built_vars) + if(length(global_procs) != expected_len) + warning("Unable to detect all global initialization procs! Expected [expected_len] got [length(global_procs)]!") + if(length(global_procs)) var/list/expected_global_procs = vars - gvars_datum_in_built_vars for(var/I in global_procs) expected_global_procs -= replacetext("[I]", "InitGlobal", "") diff --git a/code/controllers/mc/master.dm b/code/controllers/mc/master.dm index edfda35a1e75..31460bf4e9c5 100644 --- a/code/controllers/mc/master.dm +++ b/code/controllers/mc/master.dm @@ -415,9 +415,9 @@ GLOBAL_REAL(Master, /datum/controller/master) = new var/ss_runlevels = SS.runlevels var/added_to_any = FALSE - for(var/I in 1 to GLOB.bitflags.len) + for(var/I in 1 to length(GLOB.bitflags)) if(ss_runlevels & GLOB.bitflags[I]) - while(runlevel_sorted_subsystems.len < I) + while(length(runlevel_sorted_subsystems) < I) runlevel_sorted_subsystems += list(list()) runlevel_sorted_subsystems[I] += SS added_to_any = TRUE diff --git a/code/controllers/shuttle_controller.dm b/code/controllers/shuttle_controller.dm index 35031cf7334f..fb0cb1ff7637 100644 --- a/code/controllers/shuttle_controller.dm +++ b/code/controllers/shuttle_controller.dm @@ -215,7 +215,7 @@ dock_controller_map[shuttle.docking_controller_tag] = shuttle //search for the controllers, if we have one. - if(dock_controller_map.len) + if(length(dock_controller_map)) for(var/obj/structure/machinery/embedded_controller/radio/C in GLOB.machines) //only radio controllers are supported at the moment if (istype(C.program, /datum/computer/file/embedded_program/docking)) if(dock_controller_map[C.id_tag]) @@ -226,7 +226,7 @@ //sanity check //NO SANITY -// if (dock_controller_map.len || dock_controller_map_station.len || dock_controller_map_offsite.len) +// if (length(dock_controller_map) || length(dock_controller_map_station) || length(dock_controller_map_offsite)) // var/dat = "" // for (var/dock_tag in dock_controller_map + dock_controller_map_station + dock_controller_map_offsite) // dat += "\"[dock_tag]\", " diff --git a/code/controllers/subsystem/acid_pillar.dm b/code/controllers/subsystem/acid_pillar.dm index aaa38834667f..70994e641503 100644 --- a/code/controllers/subsystem/acid_pillar.dm +++ b/code/controllers/subsystem/acid_pillar.dm @@ -11,8 +11,8 @@ SUBSYSTEM_DEF(acid_pillar) if (!resumed) currentrun = queuedrun.Copy() - while (currentrun.len) - var/hash = currentrun[currentrun.len] + while (length(currentrun)) + var/hash = currentrun[length(currentrun)] var/datum/acid_spray_info/data = currentrun[hash] currentrun.len-- diff --git a/code/controllers/subsystem/atoms.dm b/code/controllers/subsystem/atoms.dm index f0d5ee14363e..dbe2f1a39c6b 100644 --- a/code/controllers/subsystem/atoms.dm +++ b/code/controllers/subsystem/atoms.dm @@ -62,7 +62,7 @@ SUBSYSTEM_DEF(atoms) processing_late_loaders = TRUE - for(var/I = 1; I <= late_loaders.len; I++) + for(var/I = 1; I <= length(late_loaders); I++) var/atom/A = late_loaders[I] //I hate that we need this if(QDELETED(A)) @@ -70,7 +70,7 @@ SUBSYSTEM_DEF(atoms) A.LateInitialize() #ifdef TESTING - testing("Late initialized [late_loaders.len] atoms") + testing("Late initialized [length(late_loaders)] atoms") #endif late_loaders.Cut() processing_late_loaders = FALSE @@ -87,10 +87,10 @@ SUBSYSTEM_DEF(atoms) var/list/mapload_arg = list(TRUE) if(atoms) #ifdef TESTING - count = atoms.len + count = length(atoms) #endif - for(var/I in 1 to atoms.len) + for(var/I in 1 to length(atoms)) var/atom/A = atoms[I] if(!(A.flags_atom & INITIALIZED)) CHECK_TICK diff --git a/code/controllers/subsystem/cellauto.dm b/code/controllers/subsystem/cellauto.dm index b543ddd43c26..983d168d61a1 100644 --- a/code/controllers/subsystem/cellauto.dm +++ b/code/controllers/subsystem/cellauto.dm @@ -9,15 +9,15 @@ SUBSYSTEM_DEF(cellauto) var/list/currentrun = list() /datum/controller/subsystem/cellauto/stat_entry(msg) - msg = "C: [GLOB.cellauto_cells.len]" + msg = "C: [length(GLOB.cellauto_cells)]" return ..() /datum/controller/subsystem/cellauto/fire(resumed = FALSE) if (!resumed) currentrun = GLOB.cellauto_cells.Copy() - while(currentrun.len) - var/datum/automata_cell/C = currentrun[currentrun.len] + while(length(currentrun)) + var/datum/automata_cell/C = currentrun[length(currentrun)] currentrun.len-- if (!C || QDELETED(C)) diff --git a/code/controllers/subsystem/decorator.dm b/code/controllers/subsystem/decorator.dm index 6194b05d561b..ac63fca47ac5 100644 --- a/code/controllers/subsystem/decorator.dm +++ b/code/controllers/subsystem/decorator.dm @@ -35,7 +35,7 @@ SUBSYSTEM_DEF(decorator) if(!decor.is_active_decor()) continue var/list/applicable_types = decor.get_decor_types() - if(!applicable_types || !applicable_types.len) + if(!LAZYLEN(applicable_types)) continue active_decorators |= decor for(var/app_type in applicable_types) @@ -64,7 +64,7 @@ SUBSYSTEM_DEF(decorator) currentrun = swap while(length(currentrun)) - var/datum/weakref/ref = currentrun[currentrun.len] + var/datum/weakref/ref = currentrun[length(currentrun)] currentrun.len-- var/atom/A = ref?.resolve() if(A) A.Decorate(deferable = FALSE) @@ -80,7 +80,7 @@ SUBSYSTEM_DEF(decorator) // DECORATOR IS ENABLED FORCEFULLY var/list/applicable_types = decor.get_decor_types() - if(!applicable_types || !applicable_types.len) + if(!LAZYLEN(applicable_types)) return active_decorators |= decor for(var/app_type in applicable_types) @@ -100,7 +100,7 @@ SUBSYSTEM_DEF(decorator) /datum/controller/subsystem/decorator/stat_entry(msg) if(registered_decorators && decoratable) - msg = "D:[registered_decorators.len],P:[decoratable.len]" + msg = "D:[length(registered_decorators)],P:[length(decoratable)]" return ..() /datum/controller/subsystem/decorator/proc/decorate(atom/o) @@ -118,25 +118,25 @@ SUBSYSTEM_DEF(decorator) /datum/controller/subsystem/decorator/proc/sortDecorators(list/datum/decorator/L) if(!istype(L)) return null - if(L.len < 2) + if(length(L) < 2) return L - var/middle = L.len / 2 + 1 + var/middle = length(L) / 2 + 1 return mergeDecoratorLists(sortDecorators(L.Copy(0, middle)), sortDecorators(L.Copy(middle))) /datum/controller/subsystem/decorator/proc/mergeDecoratorLists(list/datum/decorator/L, list/datum/decorator/R) var/Li=1 var/Ri=1 var/list/result = new() - while(Li <= L.len && Ri <= R.len) + while(Li <= length(L) && Ri <= length(R)) if(sorttext(L[Li].priority, R[Ri].priority) < 1) // Works around list += list2 merging lists; it's not pretty but it works result += "temp item" - result[result.len] = R[Ri++] + result[length(result)] = R[Ri++] else result += "temp item" - result[result.len] = L[Li++] + result[length(result)] = L[Li++] - if(Li <= L.len) + if(Li <= length(L)) return (result + L.Copy(Li, 0)) return (result + R.Copy(Ri, 0)) diff --git a/code/controllers/subsystem/disease.dm b/code/controllers/subsystem/disease.dm index b98187ca252c..342a6b28906b 100644 --- a/code/controllers/subsystem/disease.dm +++ b/code/controllers/subsystem/disease.dm @@ -8,15 +8,15 @@ SUBSYSTEM_DEF(disease) var/list/datum/disease/currentrun = list() /datum/controller/subsystem/disease/stat_entry(msg) - msg = "P:[all_diseases.len]" + msg = "P:[length(all_diseases)]" return ..() /datum/controller/subsystem/disease/fire(resumed = FALSE) if (!resumed) currentrun = all_diseases.Copy() - while (currentrun.len) - var/datum/disease/D = currentrun[currentrun.len] + while (length(currentrun)) + var/datum/disease/D = currentrun[length(currentrun)] currentrun.len-- if (!D || QDELETED(D)) diff --git a/code/controllers/subsystem/events.dm b/code/controllers/subsystem/events.dm index f4dd544784f0..db1b07475489 100644 --- a/code/controllers/subsystem/events.dm +++ b/code/controllers/subsystem/events.dm @@ -35,8 +35,8 @@ SUBSYSTEM_DEF(events) //cache for sanic speed (lists are references anyways) var/list/currentrun = src.currentrun - while(currentrun.len) - var/datum/thing = currentrun[currentrun.len] + while(length(currentrun)) + var/datum/thing = currentrun[length(currentrun)] currentrun.len-- if(thing) thing.process() diff --git a/code/controllers/subsystem/fz_transitions.dm b/code/controllers/subsystem/fz_transitions.dm index d12ab1358535..5a6db625145c 100644 --- a/code/controllers/subsystem/fz_transitions.dm +++ b/code/controllers/subsystem/fz_transitions.dm @@ -10,7 +10,7 @@ SUBSYSTEM_DEF(fz_transitions) flags = SS_KEEP_TIMING /datum/controller/subsystem/fz_transitions/stat_entry(msg) - msg = "P:[GLOB.projectors.len]|C:[GLOB.clones.len]|T:[GLOB.clones_t.len]" + msg = "P:[length(GLOB.projectors)]|C:[length(GLOB.clones)]|T:[length(GLOB.clones_t)]" return ..() /datum/controller/subsystem/fz_transitions/Initialize() diff --git a/code/controllers/subsystem/garbage.dm b/code/controllers/subsystem/garbage.dm index 37c305d59cde..072419df2cbd 100644 --- a/code/controllers/subsystem/garbage.dm +++ b/code/controllers/subsystem/garbage.dm @@ -297,7 +297,7 @@ SUBSYSTEM_DEF(garbage) /datum/controller/subsystem/garbage/Recover() InitQueues() //We first need to create the queues before recovering data if (istype(SSgarbage.queues)) - for (var/i in 1 to SSgarbage.queues.len) + for (var/i in 1 to length(SSgarbage.queues)) queues[i] |= SSgarbage.queues[i] /// Qdel Item: Holds statistics on each type that passes thru qdel diff --git a/code/controllers/subsystem/human.dm b/code/controllers/subsystem/human.dm index ffbbb7aa9240..3bc67c48a2be 100644 --- a/code/controllers/subsystem/human.dm +++ b/code/controllers/subsystem/human.dm @@ -10,15 +10,15 @@ SUBSYSTEM_DEF(human) /datum/controller/subsystem/human/stat_entry(msg) - msg = "P:[processable_human_list.len]" + msg = "P:[length(processable_human_list)]" return ..() /datum/controller/subsystem/human/fire(resumed = FALSE) if (!resumed) currentrun = processable_human_list.Copy() - while (currentrun.len) - var/mob/living/carbon/human/M = currentrun[currentrun.len] + while (length(currentrun)) + var/mob/living/carbon/human/M = currentrun[length(currentrun)] currentrun.len-- if (!M || QDELETED(M)) diff --git a/code/controllers/subsystem/init/landmarks.dm b/code/controllers/subsystem/init/landmarks.dm index 31b71c074a5d..1fdf83083833 100644 --- a/code/controllers/subsystem/init/landmarks.dm +++ b/code/controllers/subsystem/init/landmarks.dm @@ -47,14 +47,14 @@ SUBSYSTEM_DEF(landmark_init) message_admins("Item pool [pool.pool_name] has no master landmark, aborting item spawns. Tell the devs. Code: ITEM_POOL_3") continue - if (pool.quota > pool.turfs.len) - log_debug("Item pool [pool.pool_name] wants to spawn more items than it has landmarks for. Spawning [pool.turfs.len] instances of [pool.type_to_spawn] instead. Code: ITEM_POOL_4") - message_admins("Item pool [pool.pool_name] wants to spawn more items than it has landmarks for. Spawning [pool.turfs.len] instances of [pool.type_to_spawn] instead. Tell the devs. Code: ITEM_POOL_4") - pool.quota = pool.turfs.len + if (pool.quota > length(pool.turfs)) + log_debug("Item pool [pool.pool_name] wants to spawn more items than it has landmarks for. Spawning [length(pool.turfs)] instances of [pool.type_to_spawn] instead. Code: ITEM_POOL_4") + message_admins("Item pool [pool.pool_name] wants to spawn more items than it has landmarks for. Spawning [length(pool.turfs)] instances of [pool.type_to_spawn] instead. Tell the devs. Code: ITEM_POOL_4") + pool.quota = length(pool.turfs) // Quota times, pick a random turf, spawn an item there, then remove that turf from the list. for (var/i in 1 to pool.quota) - var/turf/T = pool.turfs[rand(1, pool.turfs.len)] + var/turf/T = pool.turfs[rand(1, length(pool.turfs))] var/atom/movable/newly_spawned = new pool.type_to_spawn() newly_spawned.forceMove(T) diff --git a/code/controllers/subsystem/input.dm b/code/controllers/subsystem/input.dm index 26d393d197b7..5dfd7bc5bbac 100644 --- a/code/controllers/subsystem/input.dm +++ b/code/controllers/subsystem/input.dm @@ -33,7 +33,7 @@ SUBSYSTEM_DEF(input) // Badmins just wanna have fun ♪ /datum/controller/subsystem/input/proc/refresh_client_macro_sets() var/list/clients = GLOB.clients - for(var/i in 1 to clients.len) + for(var/i in 1 to length(clients)) var/client/user = clients[i] INVOKE_ASYNC(user, /client/proc/set_macros) diff --git a/code/controllers/subsystem/item_cleanup.dm b/code/controllers/subsystem/item_cleanup.dm index 26958eb8742b..85c25e4712d3 100644 --- a/code/controllers/subsystem/item_cleanup.dm +++ b/code/controllers/subsystem/item_cleanup.dm @@ -18,9 +18,9 @@ SUBSYSTEM_DEF(item_cleanup) //Do nothing for the first 35 minutes to preserve the colony look for the first drop return - var/to_delete = items_to_clean_up.len * percentage_of_garbage_to_delete + var/to_delete = length(items_to_clean_up) * percentage_of_garbage_to_delete var/deleted = 0 - var/total_items = items_to_clean_up.len //save total before we start deleting stuff + var/total_items = length(items_to_clean_up) //save total before we start deleting stuff for (var/atom/o in items_to_clean_up) if(QDELETED(o)) items_to_clean_up -= o @@ -34,9 +34,9 @@ SUBSYSTEM_DEF(item_cleanup) break //We transfer items from the global garbage list onto the next iteration list - while(!isnull(GLOB.item_cleanup_list) && GLOB.item_cleanup_list.len > 0) - addToListNoDupe(items_to_clean_up, GLOB.item_cleanup_list[GLOB.item_cleanup_list.len]) - GLOB.item_cleanup_list -= GLOB.item_cleanup_list[GLOB.item_cleanup_list.len] + while(!isnull(GLOB.item_cleanup_list) && length(GLOB.item_cleanup_list) > 0) + addToListNoDupe(items_to_clean_up, GLOB.item_cleanup_list[length(GLOB.item_cleanup_list)]) + GLOB.item_cleanup_list -= GLOB.item_cleanup_list[length(GLOB.item_cleanup_list)] log_debug("item_cleanup deleted [deleted] garbage out of total [total_items]") diff --git a/code/controllers/subsystem/lighting.dm b/code/controllers/subsystem/lighting.dm index 3c3d14468bc2..f8c6b14e6bf7 100644 --- a/code/controllers/subsystem/lighting.dm +++ b/code/controllers/subsystem/lighting.dm @@ -27,7 +27,7 @@ SUBSYSTEM_DEF(lighting) /datum/controller/subsystem/lighting/stat_entry() - . = ..("ShCalcs:[total_shadow_calculations]|SourcQ:[static_sources_queue.len]|CcornQ:[corners_queue.len]|ObjQ:[objects_queue.len]|HybrQ:[mask_queue.len]") + . = ..("ShCalcs:[total_shadow_calculations]|SourcQ:[length(static_sources_queue)]|CcornQ:[length(corners_queue)]|ObjQ:[length(objects_queue)]|HybrQ:[length(mask_queue)]") /datum/controller/subsystem/lighting/fire(resumed, init_tick_checks) MC_SPLIT_TICK_INIT(3) diff --git a/code/controllers/subsystem/machinery.dm b/code/controllers/subsystem/machinery.dm index 6a0f938475a1..a2860615274f 100644 --- a/code/controllers/subsystem/machinery.dm +++ b/code/controllers/subsystem/machinery.dm @@ -19,15 +19,15 @@ SUBSYSTEM_DEF(machinery) return SS_INIT_SUCCESS /datum/controller/subsystem/machinery/stat_entry(msg) - msg = "M:[GLOB.processing_machines.len]" + msg = "M:[length(GLOB.processing_machines)]" return ..() /datum/controller/subsystem/machinery/fire(resumed = FALSE) if (!resumed) currentrunmachines = GLOB.processing_machines.Copy() - while (currentrunmachines.len) - var/obj/structure/machinery/M = currentrunmachines[currentrunmachines.len] + while (length(currentrunmachines)) + var/obj/structure/machinery/M = currentrunmachines[length(currentrunmachines)] currentrunmachines.len-- if (!M || QDELETED(M)) diff --git a/code/controllers/subsystem/mapping.dm b/code/controllers/subsystem/mapping.dm index f6c45453950d..0d8848217d4f 100644 --- a/code/controllers/subsystem/mapping.dm +++ b/code/controllers/subsystem/mapping.dm @@ -161,11 +161,11 @@ SUBSYSTEM_DEF(mapping) if (!length(traits)) // null or empty - default for (var/i in 1 to total_z) traits += list(default_traits) - else if (total_z != traits.len) // mismatch - INIT_ANNOUNCE("WARNING: [traits.len] trait sets specified for [total_z] z-levels in [path]!") - if (total_z < traits.len) // ignore extra traits + else if (total_z != length(traits)) // mismatch + INIT_ANNOUNCE("WARNING: [length(traits)] trait sets specified for [total_z] z-levels in [path]!") + if (total_z < length(traits)) // ignore extra traits traits.Cut(total_z + 1) - while (total_z > traits.len) // fall back to defaults on extra levels + while (total_z > length(traits)) // fall back to defaults on extra levels traits += list(default_traits) // preload the relevant space_level datums @@ -236,8 +236,8 @@ SUBSYSTEM_DEF(mapping) if(LAZYLEN(FailedZs)) //but seriously, unless the server's filesystem is messed up this will never happen var/msg = "RED ALERT! The following map files failed to load: [FailedZs[1]]" - if(FailedZs.len > 1) - for(var/I in 2 to FailedZs.len) + if(length(FailedZs) > 1) + for(var/I in 2 to length(FailedZs)) msg += ", [FailedZs[I]]" msg += ". Yell at your server host!" INIT_ANNOUNCE(msg) @@ -276,7 +276,7 @@ SUBSYSTEM_DEF(mapping) . = list() var/list/Lines = file2list(filename) - if(!Lines.len) + if(!length(Lines)) return for (var/t in Lines) if (!t) diff --git a/code/controllers/subsystem/mob.dm b/code/controllers/subsystem/mob.dm index 60e7476da89b..3596b17e5d16 100644 --- a/code/controllers/subsystem/mob.dm +++ b/code/controllers/subsystem/mob.dm @@ -8,7 +8,7 @@ SUBSYSTEM_DEF(mob) var/list/living_misc_mobs = list() /datum/controller/subsystem/mob/stat_entry(msg) - msg = "P:[living_misc_mobs.len]" + msg = "P:[length(living_misc_mobs)]" return ..() @@ -16,8 +16,8 @@ SUBSYSTEM_DEF(mob) if (!resumed) currentrun = living_misc_mobs.Copy() - while (currentrun.len) - var/mob/living/M = currentrun[currentrun.len] + while (length(currentrun)) + var/mob/living/M = currentrun[length(currentrun)] currentrun.len-- if (!M || QDELETED(M)) diff --git a/code/controllers/subsystem/nanoui.dm b/code/controllers/subsystem/nanoui.dm index 85ad0d32aaf4..b0117016e38b 100644 --- a/code/controllers/subsystem/nanoui.dm +++ b/code/controllers/subsystem/nanoui.dm @@ -13,15 +13,15 @@ SUBSYSTEM_DEF(nano) nanomanager = new() /datum/controller/subsystem/nano/stat_entry(msg) - msg = "P:[nanomanager.processing_uis.len]" + msg = "P:[length(nanomanager.processing_uis)]" return ..() /datum/controller/subsystem/nano/fire(resumed = FALSE) if (!resumed) currentrun = nanomanager.processing_uis.Copy() - while (currentrun.len) - var/datum/nanoui/UI = currentrun[currentrun.len] + while (length(currentrun)) + var/datum/nanoui/UI = currentrun[length(currentrun)] currentrun.len-- if (!UI || QDELETED(UI)) diff --git a/code/controllers/subsystem/perf_logging.dm b/code/controllers/subsystem/perf_logging.dm index 5ca98ad10dd0..4a3066b758ba 100644 --- a/code/controllers/subsystem/perf_logging.dm +++ b/code/controllers/subsystem/perf_logging.dm @@ -26,8 +26,8 @@ SUBSYSTEM_DEF(perf_logging) if(SS?.cost > 0.1) currentrun += SS - while(currentrun.len) - var/datum/controller/subsystem/SS = currentrun[currentrun.len] + while(length(currentrun)) + var/datum/controller/subsystem/SS = currentrun[length(currentrun)] currentrun.len-- var/datum/entity/mc_controller/C = controller_assoc[SS.type] new_record(SS, C) diff --git a/code/controllers/subsystem/ping.dm b/code/controllers/subsystem/ping.dm index c813081ed526..5d413c128684 100644 --- a/code/controllers/subsystem/ping.dm +++ b/code/controllers/subsystem/ping.dm @@ -14,7 +14,7 @@ SUBSYSTEM_DEF(ping) var/list/currentrun = list() /datum/controller/subsystem/ping/stat_entry() - ..("P:[GLOB.clients.len]") + ..("P:[length(GLOB.clients)]") /datum/controller/subsystem/ping/fire(resumed = FALSE) // Prepare the new batch of clients @@ -24,8 +24,8 @@ SUBSYSTEM_DEF(ping) // De-reference the list for sanic speeds var/list/currentrun = src.currentrun - while (currentrun.len) - var/client/client = currentrun[currentrun.len] + while (length(currentrun)) + var/client/client = currentrun[length(currentrun)] currentrun.len-- if (client?.tgui_panel?.is_ready()) diff --git a/code/controllers/subsystem/playtime.dm b/code/controllers/subsystem/playtime.dm index 7a6d3b97a036..6813c4fabd78 100644 --- a/code/controllers/subsystem/playtime.dm +++ b/code/controllers/subsystem/playtime.dm @@ -12,8 +12,8 @@ SUBSYSTEM_DEF(playtime) var/list/currentrun = src.currentrun - while (currentrun.len) - var/client/C = currentrun[currentrun.len] + while (length(currentrun)) + var/client/C = currentrun[length(currentrun)] currentrun.len-- var/mob/M = C.mob diff --git a/code/controllers/subsystem/police_clues.dm b/code/controllers/subsystem/police_clues.dm index 134eae9bca9e..0d39c72c874d 100644 --- a/code/controllers/subsystem/police_clues.dm +++ b/code/controllers/subsystem/police_clues.dm @@ -8,15 +8,15 @@ SUBSYSTEM_DEF(clues) var/list/prints_list = list() /datum/controller/subsystem/clues/stat_entry(msg) - msg = "P:[prints_list.len]" + msg = "P:[length(prints_list)]" return ..() /datum/controller/subsystem/clues/fire(resumed = FALSE) if(!resumed && length(prints_list)) currentrun = prints_list.Copy() - while(currentrun.len) - var/obj/effect/decal/prints/P = currentrun[currentrun.len] + while(length(currentrun)) + var/obj/effect/decal/prints/P = currentrun[length(currentrun)] currentrun.len-- if(!P || QDELETED(P)) diff --git a/code/controllers/subsystem/power.dm b/code/controllers/subsystem/power.dm index 9908a60420b2..08668e5fc564 100644 --- a/code/controllers/subsystem/power.dm +++ b/code/controllers/subsystem/power.dm @@ -12,7 +12,7 @@ SUBSYSTEM_DEF(power) var/list/currentrun_areas = list() /datum/controller/subsystem/power/stat_entry(msg) - msg = "PN:[GLOB.powernets.len]|PM:[GLOB.power_machines.len]|A:[GLOB.active_areas.len]" + msg = "PN:[length(GLOB.powernets)]|PM:[length(GLOB.power_machines)]|A:[length(GLOB.active_areas)]" return ..() @@ -29,8 +29,8 @@ SUBSYSTEM_DEF(power) // First we reset the powernets. // This is done first because we want the power machinery to have acted last on the powernet between intervals. - while(currentrun_powerents.len) - var/datum/powernet/Powernet = currentrun_powerents[currentrun_powerents.len] + while(length(currentrun_powerents)) + var/datum/powernet/Powernet = currentrun_powerents[length(currentrun_powerents)] currentrun_powerents.len-- if(Powernet) Powernet.process() @@ -39,8 +39,8 @@ SUBSYSTEM_DEF(power) // Next we let the power machines operate, this way until the next tick it will be as if they have all done their work. - while (currentrun_power_machines.len) - var/datum/X = currentrun_power_machines[currentrun_power_machines.len] + while (length(currentrun_power_machines)) + var/datum/X = currentrun_power_machines[length(currentrun_power_machines)] currentrun_power_machines.len-- if (!X || QDELETED(X)) continue diff --git a/code/controllers/subsystem/processing/obj_tab_items.dm b/code/controllers/subsystem/processing/obj_tab_items.dm index 53786daf0117..6be6bceab1eb 100644 --- a/code/controllers/subsystem/processing/obj_tab_items.dm +++ b/code/controllers/subsystem/processing/obj_tab_items.dm @@ -12,8 +12,8 @@ PROCESSING_SUBSYSTEM_DEF(obj_tab_items) //cache for sanic speed (lists are references anyways) var/list/current_run = currentrun - while(current_run.len) - var/datum/thing = current_run[current_run.len] + while(length(current_run)) + var/datum/thing = current_run[length(current_run)] if(QDELETED(thing)) processing -= thing else if(thing.process(wait * 0.1) == PROCESS_KILL) diff --git a/code/controllers/subsystem/processing/processing.dm b/code/controllers/subsystem/processing/processing.dm index 73a5db433dc8..c2736528df86 100644 --- a/code/controllers/subsystem/processing/processing.dm +++ b/code/controllers/subsystem/processing/processing.dm @@ -20,8 +20,8 @@ SUBSYSTEM_DEF(processing) //cache for sanic speed (lists are references anyways) var/list/current_run = currentrun - while(current_run.len) - var/datum/thing = current_run[current_run.len] + while(length(current_run)) + var/datum/thing = current_run[length(current_run)] current_run.len-- if(QDELETED(thing)) processing -= thing diff --git a/code/controllers/subsystem/projectiles.dm b/code/controllers/subsystem/projectiles.dm index a23303ea282d..da3b5a7b9c71 100644 --- a/code/controllers/subsystem/projectiles.dm +++ b/code/controllers/subsystem/projectiles.dm @@ -28,7 +28,7 @@ SUBSYSTEM_DEF(projectiles) */ /datum/controller/subsystem/projectiles/stat_entry(msg) - msg = " | #Proj: [projectiles.len]" + msg = " | #Proj: [length(projectiles)]" return ..() /datum/controller/subsystem/projectiles/Initialize(start_timeofday) @@ -41,8 +41,8 @@ SUBSYSTEM_DEF(projectiles) if(!resumed) flying = projectiles.Copy() flying -= sleepers - while(flying.len) - var/obj/projectile/projectile = flying[flying.len] + while(length(flying)) + var/obj/projectile/projectile = flying[length(flying)] flying.len-- var/delta_time = wait * world.tick_lag * (1 SECONDS) handle_projectile_flight(projectile, delta_time) diff --git a/code/controllers/subsystem/quadtrees.dm b/code/controllers/subsystem/quadtrees.dm index da217cb58cee..8c55cb8f1c50 100644 --- a/code/controllers/subsystem/quadtrees.dm +++ b/code/controllers/subsystem/quadtrees.dm @@ -24,17 +24,17 @@ SUBSYSTEM_DEF(quadtree) if(!resumed) player_feed = GLOB.clients.Copy() cur_quadtrees = new_quadtrees.Copy() - if(new_quadtrees.len < world.maxz) + if(length(new_quadtrees) < world.maxz) new_quadtrees.len = world.maxz for(var/i in 1 to world.maxz) new_quadtrees[i] = QTREE(RECT(world.maxx/2,world.maxy/2, world.maxx, world.maxy), i) while(length(player_feed)) - var/client/C = player_feed[player_feed.len] + var/client/C = player_feed[length(player_feed)] player_feed.len-- if(!C) continue var/turf/T = get_turf(C.mob) - if(!T?.z || new_quadtrees.len < T.z) + if(!T?.z || length(new_quadtrees) < T.z) continue var/datum/coords/qtplayer/p_coords = new p_coords.player = C @@ -52,7 +52,7 @@ SUBSYSTEM_DEF(quadtree) var/list/players = list() if(!cur_quadtrees) return players - if(z_level && cur_quadtrees.len >= z_level) + if(z_level && length(cur_quadtrees) >= z_level) var/datum/quadtree/Q = cur_quadtrees[z_level] if(!Q) return players diff --git a/code/controllers/subsystem/round_recording.dm b/code/controllers/subsystem/round_recording.dm index f1244d386d10..e45854ac5730 100644 --- a/code/controllers/subsystem/round_recording.dm +++ b/code/controllers/subsystem/round_recording.dm @@ -35,8 +35,8 @@ SUBSYSTEM_DEF(round_recording) return currentrun = recorder.tracked_players.Copy() - while(currentrun.len) - var/mob/M = currentrun[currentrun.len] + while(length(currentrun)) + var/mob/M = currentrun[length(currentrun)] currentrun.len-- // Try to stop the tracking diff --git a/code/controllers/subsystem/shuttles.dm b/code/controllers/subsystem/shuttles.dm index 0348eddd9900..d400e02f3bae 100644 --- a/code/controllers/subsystem/shuttles.dm +++ b/code/controllers/subsystem/shuttles.dm @@ -94,7 +94,7 @@ SUBSYSTEM_DEF(shuttle) qdel(T, force=TRUE) if(!SSmapping.clearing_reserved_turfs) - while(transit_requesters.len) + while(length(transit_requesters)) var/requester = popleft(transit_requesters) var/success = null // Do not try and generate any transit if we're using more then our max already @@ -311,7 +311,7 @@ SUBSYSTEM_DEF(shuttle) /datum/controller/subsystem/shuttle/proc/get_containing_shuttle(atom/A) var/list/mobile_cache = mobile - for(var/i in 1 to mobile_cache.len) + for(var/i in 1 to length(mobile_cache)) var/obj/docking_port/port = mobile_cache[i] if(port.is_in_shuttle_bounds(A)) return port @@ -319,7 +319,7 @@ SUBSYSTEM_DEF(shuttle) /datum/controller/subsystem/shuttle/proc/get_containing_dock(atom/A) . = list() var/list/stationary_cache = stationary - for(var/i in 1 to stationary_cache.len) + for(var/i in 1 to length(stationary_cache)) var/obj/docking_port/port = stationary_cache[i] if(port.is_in_shuttle_bounds(A)) . += port @@ -327,7 +327,7 @@ SUBSYSTEM_DEF(shuttle) /datum/controller/subsystem/shuttle/proc/get_dock_overlap(x0, y0, x1, y1, z) . = list() var/list/stationary_cache = stationary - for(var/i in 1 to stationary_cache.len) + for(var/i in 1 to length(stationary_cache)) var/obj/docking_port/port = stationary_cache[i] if(!port || port.z != z) continue @@ -335,7 +335,7 @@ SUBSYSTEM_DEF(shuttle) var/list/overlap = get_overlap(x0, y0, x1, y1, bounds[1], bounds[2], bounds[3], bounds[4]) var/list/xs = overlap[1] var/list/ys = overlap[2] - if(xs.len && ys.len) + if(length(xs) && length(ys)) .[port] = overlap /datum/controller/subsystem/shuttle/proc/update_hidden_docking_ports(list/remove_turfs, list/add_turfs) @@ -353,7 +353,7 @@ SUBSYSTEM_DEF(shuttle) for(var/V in add_turfs) var/turf/T = V var/image/I - if(remove_images.len) + if(length(remove_images)) //we can just reuse any images we are about to delete instead of making new ones I = remove_images[1] remove_images.Cut(1, 2) diff --git a/code/controllers/subsystem/sound.dm b/code/controllers/subsystem/sound.dm index 4fdfd7935349..024df7cc45ad 100644 --- a/code/controllers/subsystem/sound.dm +++ b/code/controllers/subsystem/sound.dm @@ -24,7 +24,7 @@ SUBSYSTEM_DEF(sound) if(MC_TICK_CHECK) return while(length(run_hearers)) // Output sound to hearers - var/client/C = run_hearers[run_hearers.len] + var/client/C = run_hearers[length(run_hearers)] run_hearers.len-- if(C && C.soundOutput) C.soundOutput.process_sound(run_template) @@ -40,6 +40,6 @@ SUBSYSTEM_DEF(sound) for(var/datum/interior/VI in extra_interiors) if(VI?.ready) var/list/bounds = VI.get_middle_coords() - if(bounds.len >= 2) + if(length(bounds) >= 2) hearers |= SSquadtree.players_in_range(RECT(bounds[1], bounds[2], VI.map_template.width, VI.map_template.height), bounds[3]) template_queue[template] = hearers diff --git a/code/controllers/subsystem/soundscape.dm b/code/controllers/subsystem/soundscape.dm index 2219a0b35c86..432166e06be9 100644 --- a/code/controllers/subsystem/soundscape.dm +++ b/code/controllers/subsystem/soundscape.dm @@ -15,8 +15,8 @@ SUBSYSTEM_DEF(soundscape) if(!resumed) currentrun = GLOB.clients.Copy() - while(currentrun.len) - var/client/C = currentrun[currentrun.len] + while(length(currentrun)) + var/client/C = currentrun[length(currentrun)] currentrun.len-- if(!C || !C.soundOutput) diff --git a/code/controllers/subsystem/statpanel.dm b/code/controllers/subsystem/statpanel.dm index 030043d12d3a..613c8df5850f 100644 --- a/code/controllers/subsystem/statpanel.dm +++ b/code/controllers/subsystem/statpanel.dm @@ -197,7 +197,7 @@ SUBSYSTEM_DEF(statpanels) /datum/controller/subsystem/statpanels/proc/generate_mc_data() mc_data = list( list("CPU:", world.cpu), - list("Instances:", "[num2text(world.contents.len, 10)]"), + list("Instances:", "[num2text(length(world.contents), 10)]"), list("World Time:", "[world.time]"), list("Globals:", GLOB.stat_entry(), "\ref[GLOB]"), list("[config]:", config.stat_entry(), "\ref[config]"), diff --git a/code/controllers/subsystem/tgui.dm b/code/controllers/subsystem/tgui.dm index 0bd0c29e450a..a3ef03f3e397 100644 --- a/code/controllers/subsystem/tgui.dm +++ b/code/controllers/subsystem/tgui.dm @@ -45,8 +45,8 @@ SUBSYSTEM_DEF(tgui) src.current_run = open_uis.Copy() // Cache for sanic speed (lists are references anyways) var/list/current_run = src.current_run - while(current_run.len) - var/datum/tgui/ui = current_run[current_run.len] + while(length(current_run)) + var/datum/tgui/ui = current_run[length(current_run)] current_run.len-- // TODO: Move user/src_object check to process() if(ui?.user && ui.src_object) diff --git a/code/controllers/subsystem/tracking.dm b/code/controllers/subsystem/tracking.dm index 3955ace8da09..4dcc5d5c4e29 100644 --- a/code/controllers/subsystem/tracking.dm +++ b/code/controllers/subsystem/tracking.dm @@ -98,7 +98,7 @@ SUBSYSTEM_DEF(tracking) /datum/controller/subsystem/tracking/proc/setup_trackers(mob/mob, tracked_group) if(!tracked_group) - tracked_group = "tracked_[tracked_mobs.len]" + tracked_group = "tracked_[length(tracked_mobs)]" tracked_mobs[tracked_group] = list() leaders[tracked_group] = mob diff --git a/code/controllers/subsystem/xeno.dm b/code/controllers/subsystem/xeno.dm index 0623da804254..df711fd90366 100644 --- a/code/controllers/subsystem/xeno.dm +++ b/code/controllers/subsystem/xeno.dm @@ -7,7 +7,7 @@ SUBSYSTEM_DEF(xeno) var/list/currentrun = list() /datum/controller/subsystem/xeno/stat_entry(msg) - msg = "P:[GLOB.xeno_mob_list.len]" + msg = "P:[length(GLOB.xeno_mob_list)]" return ..() @@ -15,8 +15,8 @@ SUBSYSTEM_DEF(xeno) if (!resumed) currentrun = GLOB.xeno_mob_list.Copy() - while (currentrun.len) - var/mob/living/carbon/xenomorph/M = currentrun[currentrun.len] + while (length(currentrun)) + var/mob/living/carbon/xenomorph/M = currentrun[length(currentrun)] currentrun.len-- if (!M || QDELETED(M)) diff --git a/code/datums/_ndatabase/code/brsql_adapter.dm b/code/datums/_ndatabase/code/brsql_adapter.dm index 251267a04fdb..2362572f588a 100644 --- a/code/datums/_ndatabase/code/brsql_adapter.dm +++ b/code/datums/_ndatabase/code/brsql_adapter.dm @@ -103,7 +103,7 @@ /datum/db/adapter/brsql_adapter/insert_table(table_name, list/values, datum/callback/CB, sync = FALSE) set waitfor = FALSE - var/length = values.len + var/length = length(values) var/list/qpars = list() var/query_inserttable = getquery_insert_table(table_name, values, qpars) var/datum/callback/callback = CALLBACK(src, TYPE_PROC_REF(/datum/db/adapter/brsql_adapter, after_insert_table), CB, length, table_name) @@ -150,7 +150,7 @@ if(table_meta.status != DB_QUERY_FINISHED) issue_log += "Unable to access system table, error: '[table_meta.error]'" return FALSE // OH SHIT OH FUCK - if(!table_meta.results.len) // Table doesn't exist + if(!length(table_meta.results)) // Table doesn't exist return internal_create_table(table_name, field_types) && internal_record_table_in_sys(type_name, table_name, field_types) var/id = table_meta.results[1][DB_DEFAULT_ID_FIELD] @@ -178,7 +178,7 @@ if(index_meta.status != DB_QUERY_FINISHED) issue_log += "Unable to access system index table, error: '[index_meta.error]'" return FALSE // OH SHIT OH FUCK - if(!index_meta.results.len) // Index doesn't exist + if(!length(index_meta.results)) // Index doesn't exist return internal_create_index(index_name, table_name, fields, unique, cluster) && internal_record_index_in_sys(index_name, table_name, fields) var/id = index_meta.results[1][DB_DEFAULT_ID_FIELD] diff --git a/code/datums/_ndatabase/code/native_adapter.dm b/code/datums/_ndatabase/code/native_adapter.dm index 1c23a6ceab8f..d5956ca8d85f 100644 --- a/code/datums/_ndatabase/code/native_adapter.dm +++ b/code/datums/_ndatabase/code/native_adapter.dm @@ -92,7 +92,7 @@ /datum/db/adapter/native_adapter/insert_table(table_name, list/values, datum/callback/CB, sync = FALSE) set waitfor = 0 - var/length = values.len + var/length = length(values) var/startid = internal_request_insert_allocation(table_name, length) var/list/qpars = list() var/query_inserttable = getquery_insert_table(table_name, values, startid, qpars) @@ -138,7 +138,7 @@ if(table_meta.status != DB_QUERY_FINISHED) issue_log += "Unable to access system table, error: '[table_meta.error]'" return FALSE // OH SHIT OH FUCK - if(!table_meta.results.len) // Table doesn't exist + if(!length(table_meta.results)) // Table doesn't exist return internal_create_table(table_name, field_types) && internal_record_table_in_sys(type_name, table_name, field_types) var/id = table_meta.results[1][DB_DEFAULT_ID_FIELD] diff --git a/code/datums/_ndatabase/code/native_persistent_query.dm b/code/datums/_ndatabase/code/native_persistent_query.dm index 15e505d578d7..39025aa1fd93 100644 --- a/code/datums/_ndatabase/code/native_persistent_query.dm +++ b/code/datums/_ndatabase/code/native_persistent_query.dm @@ -29,7 +29,7 @@ /datum/db/query/native/read_single() if(status >= DB_QUERY_FINISHED || completed) //broken or finished return - + if(!completed) completed = TRUE var/status = query.Execute(db) @@ -41,9 +41,9 @@ if(!results) results = list() var/list/cols = query.Columns() - if(cols && cols.len>0) + if(LAZYLEN(cols)>0) while(query.NextRow()) var/list/current_row = query.GetRowData() results += list(current_row) - affected_rows = query.RowsAffected() + affected_rows = query.RowsAffected() status = DB_QUERY_FINISHED diff --git a/code/datums/_ndatabase/subsystems/database_query_manager.dm b/code/datums/_ndatabase/subsystems/database_query_manager.dm index 596d55121920..5a68c4e349c1 100644 --- a/code/datums/_ndatabase/subsystems/database_query_manager.dm +++ b/code/datums/_ndatabase/subsystems/database_query_manager.dm @@ -62,7 +62,7 @@ GLOBAL_REAL(SSdatabase, /datum/controller/subsystem/database_query_manager) /datum/controller/subsystem/database_query_manager/stat_entry(msg) var/text = (connection && connection.status == DB_CONNECTION_READY) ? ("READY") : ("PREPPING") - msg = "[text], AQ:[queries_active.len]; SQ:[queries_standby.len]; P:[queries_current.len]; C:[in_callback]" + msg = "[text], AQ:[length(queries_active)]; SQ:[length(queries_standby)]; P:[length(queries_current)]; C:[in_callback]" return ..() /datum/controller/subsystem/database_query_manager/fire(resumed = FALSE) diff --git a/code/datums/_ndatabase/subsystems/entity_manager.dm b/code/datums/_ndatabase/subsystems/entity_manager.dm index 833bc6926e09..2ef5da2b22dd 100644 --- a/code/datums/_ndatabase/subsystems/entity_manager.dm +++ b/code/datums/_ndatabase/subsystems/entity_manager.dm @@ -102,8 +102,8 @@ GLOBAL_REAL(SSentity_manager, /datum/controller/subsystem/entity_manager) currentrun = tables_unsorted.Copy() if(!SSdatabase.connection.connection_ready()) return - while (currentrun.len) - var/datum/entity_meta/Q = currentrun[currentrun.len] + while (length(currentrun)) + var/datum/entity_meta/Q = currentrun[length(currentrun)] do_select(Q) do_insert(Q) do_update(Q) diff --git a/code/datums/_ndatabase/tests/test_entity.dm b/code/datums/_ndatabase/tests/test_entity.dm index de1942eec7d3..3bc9cc829bf4 100644 --- a/code/datums/_ndatabase/tests/test_entity.dm +++ b/code/datums/_ndatabase/tests/test_entity.dm @@ -50,7 +50,7 @@ SSentity_manager.filter_then(/datum/entity/test_entity, DB_COMP("value", DB_EQUALS, value), CALLBACK(GLOBAL_PROC, GLOBAL_PROC_REF(log_filter))) /proc/log_filter(list/datum/entity/elist) - to_world("got [elist.len] items") + to_world("got [length(elist)] items") /proc/log_sync(datum/entity/test_entity/ET) to_world("id:[ET.id] = name: [ET.name], description: [ET.description], value: [ET.value]") diff --git a/code/datums/ammo/ammo.dm b/code/datums/ammo/ammo.dm index a59290ab5f51..022909691cfc 100644 --- a/code/datums/ammo/ammo.dm +++ b/code/datums/ammo/ammo.dm @@ -212,7 +212,7 @@ M.apply_damage(damage,damage_type) - if(XNO && XNO.xeno_shields.len) + if(XNO && length(XNO.xeno_shields)) P.play_shielded_hit_effect(M) else P.play_hit_effect(M) diff --git a/code/datums/ammo/misc.dm b/code/datums/ammo/misc.dm index d3ce356372be..9a9ed2fb505b 100644 --- a/code/datums/ammo/misc.dm +++ b/code/datums/ammo/misc.dm @@ -200,7 +200,7 @@ if(!M || M == P.firer) return if(M.throw_mode && !M.get_active_hand()) //empty active hand and we're in throw mode. If so we catch the can. if(!M.is_mob_incapacitated()) // People who are not able to catch cannot catch. - if(P.contents.len == 1) + if(length(P.contents) == 1) for(var/obj/item/reagent_container/food/drinks/cans/souto/S in P.contents) M.put_in_active_hand(S) for(var/mob/O in viewers(GLOB.world_view_size, P)) //find all people in view. @@ -214,7 +214,7 @@ H.apply_effect(15, DAZE) H.apply_effect(15, SLOW) shake_camera(H, 2, 1) - if(P.contents.len) + if(length(P.contents)) drop_can(P.loc, P) //We make a can at the location. /datum/ammo/souto/on_hit_obj(obj/O,obj/projectile/P) @@ -230,7 +230,7 @@ drop_can(P.loc, P) //We make a can at the location. /datum/ammo/souto/proc/drop_can(loc, obj/projectile/P) - if(P.contents.len) + if(length(P.contents)) for(var/obj/item/I in P.contents) I.forceMove(loc) randomize_projectile(P) diff --git a/code/datums/browser.dm b/code/datums/browser.dm index 3b694e8f44bb..f7626214a73e 100644 --- a/code/datums/browser.dm +++ b/code/datums/browser.dm @@ -117,9 +117,9 @@ window_size = "size=[width]x[height];" common_asset.send(user) other_asset.send(user) - if (stylesheets.len) + if (length(stylesheets)) SSassets.transport.send_assets(user, stylesheets) - if (scripts.len) + if (length(scripts)) SSassets.transport.send_assets(user, scripts) user << browse(get_content(), "window=[window_id];[window_size][window_options]") diff --git a/code/datums/components/_component.dm b/code/datums/components/_component.dm index c998bd55257c..f356fc5c1077 100644 --- a/code/datums/components/_component.dm +++ b/code/datums/components/_component.dm @@ -102,7 +102,7 @@ components_of_type = test if(I == our_type) //exact match, take priority var/inserted = FALSE - for(var/J in 1 to components_of_type.len) + for(var/J in 1 to length(components_of_type)) var/datum/component/C = components_of_type[J] if(C.type != our_type) //but not over other exact matches components_of_type.Insert(J, I) @@ -127,13 +127,13 @@ var/list/components_of_type = dc[I] if(length(components_of_type)) // var/list/subtracted = components_of_type - src - if(subtracted.len == 1) //only 1 guy left + if(length(subtracted) == 1) //only 1 guy left dc[I] = subtracted[1] //make him special else dc[I] = subtracted else //just us dc -= I - if(!dc.len) + if(!length(dc)) P.datum_components = null UnregisterFromParent() @@ -243,7 +243,7 @@ lookup[sig] -= src signal_procs[target] -= sig_type_or_types - if(!signal_procs[target].len) + if(!length(signal_procs[target])) signal_procs -= target /** diff --git a/code/datums/datum.dm b/code/datums/datum.dm index 3e317ffd601e..e926dfd022ca 100644 --- a/code/datums/datum.dm +++ b/code/datums/datum.dm @@ -119,7 +119,7 @@ var/datum/component/C = all_components qdel(C, FALSE, TRUE) if(datum_components) - debug_log("'[src]' datum_components was not null after removing all components! [datum_components.len] entries remained...") + debug_log("'[src]' datum_components was not null after removing all components! [length(datum_components)] entries remained...") datum_components.Cut() var/list/lookup = comp_lookup diff --git a/code/datums/diseases/advance/advance.dm b/code/datums/diseases/advance/advance.dm index 6ccbaa66e7de..41f1fe30e921 100644 --- a/code/datums/diseases/advance/advance.dm +++ b/code/datums/diseases/advance/advance.dm @@ -50,7 +50,7 @@ GLOBAL_LIST_INIT(advance_cures, list( /datum/disease/advance/New(process = 1, datum/disease/advance/D) // Setup our dictionary if it hasn't already. - if(!GLOB.dictionary_symptoms.len) + if(!length(GLOB.dictionary_symptoms)) for(var/symp in GLOB.list_symptoms) var/datum/symptom/S = new symp GLOB.dictionary_symptoms[S.id] = symp @@ -59,9 +59,9 @@ GLOBAL_LIST_INIT(advance_cures, list( D = null // Generate symptoms if we weren't given any. - if(!symptoms || !symptoms.len) + if(!LAZYLEN(symptoms)) - if(!D || !D.symptoms || !D.symptoms.len) + if(!D || !LAZYLEN(D.symptoms)) symptoms = GenerateSymptoms() else for(var/datum/symptom/S in D.symptoms) @@ -80,7 +80,7 @@ GLOBAL_LIST_INIT(advance_cures, list( // Randomly pick a symptom to activate. /datum/disease/advance/stage_act() ..() - if(symptoms && symptoms.len) + if(LAZYLEN(symptoms)) if(!processing) processing = 1 @@ -148,7 +148,7 @@ GLOBAL_LIST_INIT(advance_cures, list( if(!HasSymptom(S)) possible_symptoms += S - if(!possible_symptoms.len) + if(!length(possible_symptoms)) return //error("Advance Disease - We weren't able to get any possible symptoms in GenerateSymptoms([type_level_limit], [amount_get])") @@ -182,7 +182,7 @@ GLOBAL_LIST_INIT(advance_cures, list( //Generate disease properties based on the effects. Returns an associated list. /datum/disease/advance/proc/GenerateProperties() - if(!symptoms || !symptoms.len) + if(!LAZYLEN(symptoms)) CRASH("We did not have any symptoms before generating properties.") var/list/properties = list("resistance" = 1, "stealth" = 1, "stage_rate" = 1, "transmittable" = 1, "severity" = 1) @@ -200,11 +200,11 @@ GLOBAL_LIST_INIT(advance_cures, list( // Assign the properties that are in the list. /datum/disease/advance/proc/AssignProperties(list/properties = list()) - if(properties && properties.len) + if(LAZYLEN(properties)) hidden = list( (properties["stealth"] > 2), (properties["stealth"] > 3) ) // The more symptoms we have, the less transmittable it is but some symptoms can make up for it. - SetSpread(clamp(properties["transmittable"] - symptoms.len, BLOOD, AIRBORNE)) + SetSpread(clamp(properties["transmittable"] - length(symptoms), BLOOD, AIRBORNE)) permeability_mod = max(ceil(0.4 * properties["transmittable"]), 1) cure_chance = 15 - clamp(properties["resistance"], -5, 5) // can be between 10 and 20 stage_prob = max(properties["stage_rate"], 2) @@ -253,8 +253,8 @@ GLOBAL_LIST_INIT(advance_cures, list( // Will generate a random cure, the less resistance the symptoms have, the harder the cure. /datum/disease/advance/proc/GenerateCure(list/properties = list()) - if(properties && properties.len) - var/res = clamp(properties["resistance"] - (symptoms.len / 2), 1, GLOB.advance_cures.len) + if(LAZYLEN(properties)) + var/res = clamp(properties["resistance"] - (length(symptoms) / 2), 1, length(GLOB.advance_cures)) cure_id = GLOB.advance_cures[res] // Get the cure name from the cure_id @@ -274,7 +274,7 @@ GLOBAL_LIST_INIT(advance_cures, list( // Randomly remove a symptom. /datum/disease/advance/proc/Devolve() - if(symptoms.len > 1) + if(length(symptoms) > 1) var/s = SAFEPICK(symptoms) if(s) RemoveSymptom(s) @@ -305,7 +305,7 @@ GLOBAL_LIST_INIT(advance_cures, list( if(HasSymptom(S)) return - if(symptoms.len < 5 + rand(-1, 1)) + if(length(symptoms) < 5 + rand(-1, 1)) symptoms += S else RemoveSymptom(pick(symptoms)) @@ -331,14 +331,14 @@ GLOBAL_LIST_INIT(advance_cures, list( for(var/datum/disease/advance/A in D_list) diseases += A.Copy() - if(!diseases.len) + if(!length(diseases)) return null - if(diseases.len <= 1) + if(length(diseases) <= 1) return pick(diseases) // Just return the only entry. var/i = 0 // Mix our diseases until we are left with only one result. - while(i < 20 && diseases.len > 1) + while(i < 20 && length(diseases) > 1) i++ @@ -362,7 +362,7 @@ GLOBAL_LIST_INIT(advance_cures, list( R.data_properties = data.Copy() else R.data_properties = data - if(preserve.len) + if(length(preserve)) R.data_properties["viruses"] = preserve /proc/AdminCreateVirus(mob/user) @@ -385,7 +385,7 @@ GLOBAL_LIST_INIT(advance_cures, list( i-- while(i > 0) - if(D.symptoms.len > 0) + if(length(D.symptoms) > 0) var/new_name = input(user, "Name your new disease.", "New Name") D.AssignName(new_name) diff --git a/code/datums/diseases/advance/symptoms/symptoms.dm b/code/datums/diseases/advance/symptoms/symptoms.dm index 7746a03b4f89..8ddd5897f92a 100644 --- a/code/datums/diseases/advance/symptoms/symptoms.dm +++ b/code/datums/diseases/advance/symptoms/symptoms.dm @@ -17,7 +17,7 @@ GLOBAL_LIST_EMPTY(dictionary_symptoms) /datum/symptom/New() var/list/S = GLOB.list_symptoms - for(var/i = 1; i <= S.len; i++) + for(var/i = 1; i <= length(S); i++) if(src.type == S[i]) id = "[i]" return diff --git a/code/datums/diseases/black_goo.dm b/code/datums/diseases/black_goo.dm index 5d6d96fcc57c..6fb74bc82bd4 100644 --- a/code/datums/diseases/black_goo.dm +++ b/code/datums/diseases/black_goo.dm @@ -301,12 +301,12 @@ /obj/item/storage/fancy/blackgoo/get_examine_text(mob/user) . = ..() . += "A strange looking metal container..." - if(contents.len <= 0) + if(length(contents) <= 0) . += "There are no bottles left inside it." - else if(contents.len == 1) + else if(length(contents) == 1) . += "There is one bottle left inside it." else - . += "There are [src.contents.len] bottles inside the container." + . += "There are [length(src.contents)] bottles inside the container." /obj/item/storage/fancy/blackgoo/Initialize() diff --git a/code/datums/emergency_calls/custom.dm b/code/datums/emergency_calls/custom.dm index 0117c83fc19c..b62d984f6fe3 100644 --- a/code/datums/emergency_calls/custom.dm +++ b/code/datums/emergency_calls/custom.dm @@ -19,7 +19,7 @@ if(!istype(spawn_loc)) return //Didn't find a useable spawn point. - if(!players_to_offer.len) + if(!length(players_to_offer)) return // No more players var/mob/living/carbon/human/H = pick(players_to_offer) diff --git a/code/datums/emergency_calls/emergency_call.dm b/code/datums/emergency_calls/emergency_call.dm index a803a7f06c78..99b31ab41f19 100644 --- a/code/datums/emergency_calls/emergency_call.dm +++ b/code/datums/emergency_calls/emergency_call.dm @@ -64,11 +64,11 @@ var/home_base = /datum/lazy_template/ert/freelancer_station /datum/game_mode/proc/initialize_emergency_calls() - if(all_calls.len) //It's already been set up. + if(length(all_calls)) //It's already been set up. return var/list/total_calls = typesof(/datum/emergency_call) - if(!total_calls.len) + if(!length(total_calls)) to_world(SPAN_DANGER("\b Error setting up emergency calls, no datums found.")) return FALSE for(var/S in total_calls) @@ -154,7 +154,7 @@ if(jobban_isbanned(src, "Syndicate") || jobban_isbanned(src, "Emergency Response Team")) to_chat(src, SPAN_DANGER("You are jobbanned from the emergency response team!")) return - if(!SSticker.mode || !SSticker.mode.picked_calls.len) + if(!SSticker.mode || !length(SSticker.mode.picked_calls)) to_chat(src, SPAN_WARNING("No distress beacons are active. You will be notified if this changes.")) return @@ -230,8 +230,8 @@ SEND_SIGNAL(src, COMSIG_ERT_SETUP) - if(candidates.len < mob_min && !spawn_max_amount) - message_admins("Aborting distress beacon, not enough candidates: found [candidates.len].") + if(length(candidates) < mob_min && !spawn_max_amount) + message_admins("Aborting distress beacon, not enough candidates: found [length(candidates)].") members = list() //Empty the members list. candidates = list() @@ -244,7 +244,7 @@ var/list/datum/mind/picked_candidates = list() if(mob_max > 0) var/mob_count = 0 - while (mob_count < mob_max && candidates.len) + while (mob_count < mob_max && length(candidates)) var/datum/mind/M = pick(candidates) //Get a random candidate, then remove it from the candidates list. if(!istype(M))//Something went horrifically wrong candidates.Remove(M) @@ -254,13 +254,13 @@ continue if(M.current && M.current.stat != DEAD) candidates.Remove(M) //Strip them from the list, they aren't dead anymore. - if(!candidates.len) + if(!length(candidates)) break //NO picking from empty lists continue picked_candidates.Add(M) candidates.Remove(M) mob_count++ - if(candidates.len) + if(length(candidates)) for(var/datum/mind/I in candidates) if(I.current) to_chat(I.current, SPAN_WARNING("You didn't get selected to join the distress team. Better luck next time!")) @@ -310,7 +310,7 @@ SSshuttle.moveShuttleToDock(shuttle, pick(active_lzs), TRUE) var/i = 0 - if(picked_candidates.len) + if(length(picked_candidates)) for(var/datum/mind/M in picked_candidates) members += M i++ diff --git a/code/datums/entities/player.dm b/code/datums/entities/player.dm index a62e663ba21c..fbdcc11e1037 100644 --- a/code/datums/entities/player.dm +++ b/code/datums/entities/player.dm @@ -606,14 +606,14 @@ BSQL_PROTECT_DATUM(/datum/entity/player) note.admin_rank = "N/A" note.date = I.timestamp var/list/splitting = splittext(I.content, "|") - if(splitting.len == 1) + if(length(splitting) == 1) note.text = I.content note.is_ban = FALSE - if(splitting.len == 3) + if(length(splitting) == 3) note.text = splitting[3] note.ban_time = text2num(replacetext(replacetext(splitting[2],"Duration: ","")," minutes","")) note.is_ban = TRUE - if(splitting.len == 2) + if(length(splitting) == 2) note.text = I.content note.is_ban = TRUE diff --git a/code/datums/global_variables.dm b/code/datums/global_variables.dm index 53e9c0391e17..24d32bbf3552 100644 --- a/code/datums/global_variables.dm +++ b/code/datums/global_variables.dm @@ -154,9 +154,9 @@ else if (istype(value, /list)) var/list/L = value - html += "[name] = /list ([L.len])" + html += "[name] = /list ([length(L)])" - if (L.len > 0 && !(name == "underlays" || name == "overlays" || name == "vars" || L.len > 500)) + if (length(L) > 0 && !(name == "underlays" || name == "overlays" || name == "vars" || length(L) > 500)) // not sure if this is completely right... html += "
    " var/index = 1 diff --git a/code/datums/helper_datums/getrev.dm b/code/datums/helper_datums/getrev.dm index b7d528380a42..aa4665bda652 100644 --- a/code/datums/helper_datums/getrev.dm +++ b/code/datums/helper_datums/getrev.dm @@ -41,7 +41,7 @@ GLOBAL_DATUM_INIT(revdata, /datum/getrev, new) return msg.Join("\n") /datum/getrev/proc/GetTestMergeInfo(header = TRUE) - if(!testmerge.len) + if(!length(testmerge)) return "" . = header ? "The following pull requests are currently test merged:
    " : "" for(var/line in testmerge) @@ -70,7 +70,7 @@ GLOBAL_DATUM_INIT(revdata, /datum/getrev, new) var/pc = revdata.originmastercommit if(pc) msg += "Master commit: [pc]" - if(revdata.testmerge.len) + if(length(revdata.testmerge)) msg += revdata.GetTestMergeInfo() if(revdata.commit && revdata.commit != revdata.originmastercommit) msg += "Local commit: [revdata.commit]" diff --git a/code/datums/helper_datums/teleport.dm b/code/datums/helper_datums/teleport.dm index 6a4276208d13..2b283c978c3a 100644 --- a/code/datums/helper_datums/teleport.dm +++ b/code/datums/helper_datums/teleport.dm @@ -157,8 +157,8 @@ precision = rand(1,100) var/list/bagholding = teleatom.search_contents_for(/obj/item/storage/backpack/holding) - if(bagholding.len) - precision = max(rand(1,100)*bagholding.len,100) + if(length(bagholding)) + precision = max(rand(1,100)*length(bagholding),100) if(istype(teleatom, /mob/living)) var/mob/living/MM = teleatom to_chat(MM, SPAN_WARNING("The Bluespace interface on your Bag of Holding interferes with the teleport!")) diff --git a/code/datums/matrix_editor.dm b/code/datums/matrix_editor.dm index 8e064d76db7b..c31720014d45 100644 --- a/code/datums/matrix_editor.dm +++ b/code/datums/matrix_editor.dm @@ -72,11 +72,11 @@ if(!elements_str) return var/list/elements = splittext(elements_str, ",") - if(elements.len != 6) - to_chat(usr, "When creating a custom matrix, explicitly provide all 6 elements! Only [elements.len] were provided.") + if(length(elements) != 6) + to_chat(usr, "When creating a custom matrix, explicitly provide all 6 elements! Only [length(elements)] were provided.") return - for(var/i = 1 to elements.len) + for(var/i = 1 to length(elements)) var/num_ver = text2num(elements[i]) if(isnull(num_ver)) to_chat(usr, "Failed to convert element #[i] ([elements[i]]) to a number.") diff --git a/code/datums/medal_awards.dm b/code/datums/medal_awards.dm index f2dfc6a5c1d5..15152a8179a4 100644 --- a/code/datums/medal_awards.dm +++ b/code/datums/medal_awards.dm @@ -402,7 +402,7 @@ GLOBAL_LIST_INIT(xeno_medals, list(XENO_SLAUGHTER_MEDAL, XENO_RESILIENCE_MEDAL, to_chat(usr, "Error: Could not find the [is_marine_medal ? "marine" : "xeno"] awards for '[recipient_name]'!") return FALSE - if(index < 1 || index > recipient_award.medal_names.len) + if(index < 1 || index > length(recipient_award.medal_names)) to_chat(usr, "Error: Index [index] is out of bounds!") return FALSE @@ -429,7 +429,7 @@ GLOBAL_LIST_INIT(xeno_medals, list(XENO_SLAUGHTER_MEDAL, XENO_RESILIENCE_MEDAL, // Either entirely delete the award from the list, or just remove the entry if there are multiple var/medal_type = recipient_award.medal_names[index] var/citation = recipient_award.medal_citations[index] - if(recipient_award.medal_names.len == 1) + if(length(recipient_award.medal_names) == 1) if(is_marine_medal) GLOB.medal_awards.Remove(recipient_name) else diff --git a/code/datums/quadtree.dm b/code/datums/quadtree.dm index 2b0360152997..5e5b27d57330 100644 --- a/code/datums/quadtree.dm +++ b/code/datums/quadtree.dm @@ -103,7 +103,7 @@ player_coords = list(p_coords) return TRUE - else if(!final_divide && player_coords.len >= QUADTREE_CAPACITY) + else if(!final_divide && length(player_coords) >= QUADTREE_CAPACITY) if(!is_divided) subdivide() if(nw_branch.insert_player(p_coords)) diff --git a/code/datums/recipe.dm b/code/datums/recipe.dm index b4b6c45a0c2c..68c036ff71df 100644 --- a/code/datums/recipe.dm +++ b/code/datums/recipe.dm @@ -49,7 +49,7 @@ . = -1 else return 0 - if ((reagents?(reagents.len):(0)) < avail_reagents.reagent_list.len) + if ((LAZYLEN(reagents) || 0) < length(avail_reagents.reagent_list)) return -1 return . @@ -70,7 +70,7 @@ break if (!found) . = -1 - if (checklist.len) + if (length(checklist)) return 0 return . @@ -107,17 +107,17 @@ for (var/datum/recipe/recipe in available_recipes) if (recipe.check_reagents(obj.reagents)==exact && recipe.check_items(obj)==exact) possible_recipes+=recipe - if (possible_recipes.len==0) + if (length(possible_recipes)==0) return null - else if (possible_recipes.len==1) + else if (length(possible_recipes)==1) return possible_recipes[1] else //okay, let's select the most complicated recipe var/r_count = 0 var/i_count = 0 . = possible_recipes[1] for (var/datum/recipe/recipe in possible_recipes) - var/N_i = (recipe.items)?(recipe.items.len):0 - var/N_r = (recipe.reagents)?(recipe.reagents.len):0 + var/N_i = LAZYLEN(recipe.items) || 0 + var/N_r = LAZYLEN(recipe.reagents) || 0 if (N_i > i_count || (N_i== i_count && N_r > r_count )) r_count = N_r i_count = N_i diff --git a/code/datums/soundOutput.dm b/code/datums/soundOutput.dm index 1f4512b28d59..eb7339ceae51 100644 --- a/code/datums/soundOutput.dm +++ b/code/datums/soundOutput.dm @@ -104,7 +104,7 @@ /datum/soundOutput/proc/update_soundscape() scape_cooldown-- if(scape_cooldown <= 0) - if(soundscape_playlist.len) + if(length(soundscape_playlist)) var/sound/S = sound() S.file = pick(soundscape_playlist) S.volume = 100 * owner.volume_preferences[VOLUME_AMB] diff --git a/code/datums/statistics/entities/panel_stats.dm b/code/datums/statistics/entities/panel_stats.dm index 5cfb888b8ea1..c62925673622 100644 --- a/code/datums/statistics/entities/panel_stats.dm +++ b/code/datums/statistics/entities/panel_stats.dm @@ -463,7 +463,7 @@ total_deaths_list += list(list("name" = S.name, "value" = S.value)) for(var/datum/entity/statistic/death/S in death_stats_list) - if(new_death_stats_list.len >= STATISTICS_DEATH_LIST_LEN) + if(length(new_death_stats_list) >= STATISTICS_DEATH_LIST_LEN) break var/list/damage_list = list() if(S.total_brute) @@ -496,7 +496,7 @@ "y" = S.y, "z" = S.z )) - if(new_death_stats_list.len < STATISTICS_DEATH_LIST_LEN) + if(length(new_death_stats_list) < STATISTICS_DEATH_LIST_LEN) new_death_stats_list += death for(var/iteration in weapon_stats_list) diff --git a/code/datums/statistics/entities/round_stats.dm b/code/datums/statistics/entities/round_stats.dm index 25543dff22b1..10ec04c6da0e 100644 --- a/code/datums/statistics/entities/round_stats.dm +++ b/code/datums/statistics/entities/round_stats.dm @@ -300,8 +300,8 @@ if(death_data["death_stats_list"]) new_death_list = death_data["death_stats_list"] new_death_list.Insert(1, death) - if(new_death_list.len > STATISTICS_DEATH_LIST_LEN) - new_death_list.Cut(STATISTICS_DEATH_LIST_LEN+1, new_death_list.len) + if(length(new_death_list) > STATISTICS_DEATH_LIST_LEN) + new_death_list.Cut(STATISTICS_DEATH_LIST_LEN+1, length(new_death_list)) death_data["death_stats_list"] = new_death_list track_dead_participant(new_death.faction_name) diff --git a/code/datums/weather/weather_map_holder.dm b/code/datums/weather/weather_map_holder.dm index c72925399a85..eb3458d70a25 100644 --- a/code/datums/weather/weather_map_holder.dm +++ b/code/datums/weather/weather_map_holder.dm @@ -33,7 +33,7 @@ // Return a type that can be initialized into the next weather event. // Feel free to override this /datum/weather_ss_map_holder/proc/get_new_event() - if (potential_weather_events && potential_weather_events.len != 0) + if (LAZYLEN(potential_weather_events) != 0) return pick(potential_weather_events) else log_debug("Weather subsystem map holder [src] is improperly configured. Code: WSSMH03") diff --git a/code/defines/procs/AStar.dm b/code/defines/procs/AStar.dm index fad263aea42b..b4baef969815 100644 --- a/code/defines/procs/AStar.dm +++ b/code/defines/procs/AStar.dm @@ -46,13 +46,13 @@ length to avoid portals or something i guess?? Not that they're counted right no cmp = compare /PriorityQueue/proc/IsEmpty() - return !L.len + return !length(L) /PriorityQueue/proc/Enqueue(d) var/i var/j L.Add(d) - i = L.len + i = length(L) j = i>>1 while(i > 1 && call(cmp)(L[j],L[i]) > 0) L.Swap(i,j) @@ -60,22 +60,22 @@ length to avoid portals or something i guess?? Not that they're counted right no j >>= 1 /PriorityQueue/proc/Dequeue() - if(!L.len) return 0 + if(!length(L)) return 0 . = L[1] Remove(1) /PriorityQueue/proc/Remove(i) - if(i > L.len) return 0 - L.Swap(i,L.len) - L.Cut(L.len) - if(i < L.len) + if(i > length(L)) return 0 + L.Swap(i,length(L)) + L.Cut(length(L)) + if(i < length(L)) _Fix(i) /PriorityQueue/proc/_Fix(i) var/child = i + i var/item = L[i] - while(child <= L.len) - if(child + 1 <= L.len && call(cmp)(L[child],L[child + 1]) > 0) + while(child <= length(L)) + if(child + 1 <= length(L) && call(cmp)(L[child],L[child + 1]) > 0) child++ if(call(cmp)(item,L[child]) > 0) L[i] = L[child] @@ -159,7 +159,7 @@ length to avoid portals or something i guess?? Not that they're counted right no var/ng = cur.g + call(cur.source,dist)(d) if(d.bestF) if(ng + call(d,dist)(end) < d.bestF) - for(var/i = 1; i <= open.L.len; i++) + for(var/i = 1; i <= length(open.L); i++) var/PathNode/n = open.L[i] if(n.source == d) open.Remove(i) @@ -168,21 +168,21 @@ length to avoid portals or something i guess?? Not that they're counted right no continue open.Enqueue(new /PathNode(d,cur,ng,call(d,dist)(end),cur.nt+1)) - if(maxnodes && open.L.len > maxnodes) - open.L.Cut(open.L.len) + if(maxnodes && length(open.L) > maxnodes) + open.L.Cut(length(open.L)) } var/PathNode/temp while(!open.IsEmpty()) temp = open.Dequeue() temp.source.bestF = 0 - while(closed.len) - temp = closed[closed.len] + while(length(closed)) + temp = closed[length(closed)] temp.bestF = 0 - closed.Cut(closed.len) + closed.Cut(length(closed)) if(path) - for(var/i = 1; i <= path.len/2; i++) - path.Swap(i,path.len-i+1) + for(var/i = 1; i <= length(path)/2; i++) + path.Swap(i,length(path)-i+1) return path diff --git a/code/game/atoms.dm b/code/game/atoms.dm index a14f1018e49a..bc0e41a338e3 100644 --- a/code/game/atoms.dm +++ b/code/game/atoms.dm @@ -238,7 +238,7 @@ directive is properly returned. pass |= istype(A, type) if(!pass) continue - if(A.contents.len) + if(length(A.contents)) found += A.search_contents_for(path,filter_path) return found diff --git a/code/game/cas_manager/datums/cas_fire_mission.dm b/code/game/cas_manager/datums/cas_fire_mission.dm index dc55e057edcd..f672dffed83a 100644 --- a/code/game/cas_manager/datums/cas_fire_mission.dm +++ b/code/game/cas_manager/datums/cas_fire_mission.dm @@ -80,7 +80,7 @@ /datum/cas_fire_mission/proc/check(obj/structure/machinery/computer/dropship_weapons/linked_console) error_weapon = null - if(records.len == 0) + if(length(records) == 0) return FIRE_MISSION_ALL_GOOD //I mean yes... but why? for(var/datum/cas_fire_mission_record/record in records) @@ -105,7 +105,7 @@ var/i if(!record.offsets) continue - for(i=1,i<=record.offsets.len,i++) + for(i=1,i<=length(record.offsets),i++) if(cd > 0) cd-- if(record.offsets[i] == null || record.offsets[i] == "-") @@ -192,7 +192,7 @@ envelope.change_current_loc(current_turf) var/datum/cas_fire_mission_record/item for(item in records) - if(item.offsets.len < step || item.offsets[step] == null || item.offsets[step]=="-") + if(length(item.offsets) < step || item.offsets[step] == null || item.offsets[step]=="-") continue var/offset = item.offsets[step] if (current_turf == null) diff --git a/code/game/gamemodes/cm_initialize.dm b/code/game/gamemodes/cm_initialize.dm index ae6cdf10c64e..4a208b00a796 100644 --- a/code/game/gamemodes/cm_initialize.dm +++ b/code/game/gamemodes/cm_initialize.dm @@ -118,7 +118,7 @@ Additional game mode variables. /datum/game_mode/proc/initialize_special_clamps() xeno_starting_num = clamp((GLOB.readied_players/CONFIG_GET(number/xeno_number_divider)), xeno_required_num, INFINITY) //(n, minimum, maximum) surv_starting_num = clamp((GLOB.readied_players/CONFIG_GET(number/surv_number_divider)), 2, 8) //this doesnt run - marine_starting_num = GLOB.player_list.len - xeno_starting_num - surv_starting_num + marine_starting_num = length(GLOB.player_list) - xeno_starting_num - surv_starting_num for(var/datum/squad/sq in GLOB.RoleAuthority.squads) if(sq) sq.max_engineers = engi_slot_formula(marine_starting_num) @@ -266,7 +266,7 @@ Additional game mode variables. /datum/game_mode/proc/initialize_starting_xenomorph_list(list/hives = list(XENO_HIVE_NORMAL), bypass_checks = FALSE) var/list/datum/mind/possible_xenomorphs = get_players_for_role(JOB_XENOMORPH) var/list/datum/mind/possible_queens = get_players_for_role(JOB_XENOMORPH_QUEEN) - if(possible_xenomorphs.len < xeno_required_num && !bypass_checks) //We don't have enough aliens, we don't consider people rolling for only Queen. + if(length(possible_xenomorphs) < xeno_required_num && !bypass_checks) //We don't have enough aliens, we don't consider people rolling for only Queen. to_world("

    Not enough players have chosen to be a xenomorph in their character setup. Aborting.

    ") return @@ -388,7 +388,7 @@ Additional game mode variables. available_xenos += larva_option available_xenos[larva_option] = list(hive) - if(!available_xenos.len || (instant_join && !available_xenos_non_ssd.len)) + if(!length(available_xenos) || (instant_join && !length(available_xenos_non_ssd))) if(!xeno_candidate.client?.prefs || !(xeno_candidate.client.prefs.be_special & BE_ALIEN_AFTER_DEATH)) to_chat(xeno_candidate, SPAN_WARNING("There aren't any available xenomorphs or burrowed larvae. \ You can try getting spawned as a chestburster larva by toggling your Xenomorph candidacy in \ @@ -524,16 +524,16 @@ Additional game mode variables. var/last_active_hive = 0 for(var/hivenumber in GLOB.hive_datum) hive = GLOB.hive_datum[hivenumber] - if(hive.totalXenos.len <= 0) + if(length(hive.totalXenos) <= 0) continue active_hives[hive.name] = hive.hivenumber last_active_hive = hive.hivenumber - if(active_hives.len <= 0) + if(length(active_hives) <= 0) to_chat(xeno_candidate, SPAN_WARNING("There aren't any Hives active at this point for you to join.")) return FALSE - if(active_hives.len > 1) + if(length(active_hives) > 1) var/hive_picked = tgui_input_list(xeno_candidate, "Select which Hive to attempt joining.", "Hive Choice", active_hives, theme="hive_status") if(!hive_picked) to_chat(xeno_candidate, SPAN_ALERT("Hive choice error. Aborting.")) @@ -558,7 +558,7 @@ Additional game mode variables. var/descriptive_name = "[morpher.name] in [area_name]" available_facehugger_sources[descriptive_name] = morpher - if(available_facehugger_sources.len <= 0) + if(length(available_facehugger_sources) <= 0) to_chat(xeno_candidate, SPAN_WARNING("There aren't any Carriers or Egg Morphers with available Facehuggers for you to join. Please try again later!")) return FALSE @@ -590,16 +590,16 @@ Additional game mode variables. var/last_active_hive = 0 for(var/hivenumber in GLOB.hive_datum) hive = GLOB.hive_datum[hivenumber] - if(hive.totalXenos.len <= 0) + if(length(hive.totalXenos) <= 0) continue active_hives[hive.name] = hive.hivenumber last_active_hive = hive.hivenumber - if(active_hives.len <= 0) + if(length(active_hives) <= 0) to_chat(xeno_candidate, SPAN_WARNING("There aren't any Hives active at this point for you to join.")) return FALSE - if(active_hives.len > 1) + if(length(active_hives) > 1) var/hive_picked = tgui_input_list(xeno_candidate, "Select which Hive to attempt joining.", "Hive Choice", active_hives, theme="hive_status") if(!hive_picked) to_chat(xeno_candidate, SPAN_ALERT("Hive choice error. Aborting.")) @@ -826,7 +826,7 @@ Additional game mode variables. H.name = H.get_visible_name() if(!H.first_xeno) //Only give objectives/back-stories to uninfected survivors - if(spawner.intro_text && spawner.intro_text.len) + if(LAZYLEN(spawner.intro_text)) spawn(4) for(var/line in spawner.intro_text) to_chat(H, line) @@ -893,7 +893,7 @@ Additional game mode variables. var/story //The actual story they will get to read. var/random_name var/datum/mind/survivor - while(current_survivors.len) + while(length(current_survivors)) survivor = pick(current_survivors) if(!istype(survivor)) current_survivors -= survivor @@ -905,8 +905,8 @@ Additional game mode variables. current_survivors -= survivor continue - if(current_survivors.len > 1) //If we have another survivor to pick from. - if(survivor_multi_story.len) //Unlikely. + if(length(current_survivors) > 1) //If we have another survivor to pick from. + if(length(survivor_multi_story)) //Unlikely. var/datum/mind/another_survivor = pick(current_survivors - survivor) // We don't want them to be picked twice. current_survivors -= another_survivor if(!istype(another_survivor)) continue//If somehow this thing screwed up, we're going to run another pass. @@ -921,7 +921,7 @@ Additional game mode variables. to_chat(another_survivor.current, temp_story) another_survivor.memory += temp_story else - if(survivor_story.len) //Shouldn't happen, but technically possible. + if(length(survivor_story)) //Shouldn't happen, but technically possible. story = pick(survivor_story) survivor_story -= story spawn(6) diff --git a/code/game/gamemodes/cm_process.dm b/code/game/gamemodes/cm_process.dm index 462f82e99cec..d6519bbcd887 100644 --- a/code/game/gamemodes/cm_process.dm +++ b/code/game/gamemodes/cm_process.dm @@ -40,12 +40,12 @@ of predators), but can be added to include variant game modes (like humans vs. h set waitfor = 0 sleep(2 SECONDS) GLOB.fallen_list += GLOB.fallen_list_cross - if(GLOB.fallen_list.len) + if(length(GLOB.fallen_list)) var/dat = "
    " dat += SPAN_ROUNDBODY("In Flanders fields...
    ") dat += SPAN_CENTERBOLD("In memoriam of our fallen soldiers:
    ") - for(var/i = 1 to GLOB.fallen_list.len) - if(i != GLOB.fallen_list.len) + for(var/i = 1 to length(GLOB.fallen_list)) + if(i != length(GLOB.fallen_list)) dat += "[GLOB.fallen_list[i]], " else dat += "[GLOB.fallen_list[i]].
    " @@ -87,20 +87,20 @@ of predators), but can be added to include variant game modes (like humans vs. h /datum/game_mode/proc/declare_completion_announce_medal_awards() set waitfor = 0 sleep(2 SECONDS) - if(GLOB.medal_awards.len) + if(length(GLOB.medal_awards)) var/dat = "
    " dat += SPAN_ROUNDBODY("
    Medal Awards:") for(var/recipient in GLOB.medal_awards) var/datum/recipient_awards/recipient_award = GLOB.medal_awards[recipient] - for(var/i in 1 to recipient_award.medal_names.len) + for(var/i in 1 to length(recipient_award.medal_names)) dat += "
    [recipient_award.recipient_rank] [recipient] is awarded [recipient_award.posthumous[i] ? "posthumously " : ""]the [recipient_award.medal_names[i]]: \'[recipient_award.medal_citations[i]]\'." to_world(dat) - if(GLOB.jelly_awards.len) + if(length(GLOB.jelly_awards)) var/dat = "
    " dat += SPAN_ROUNDBODY("
    Royal Jelly Awards:") for(var/recipient in GLOB.jelly_awards) var/datum/recipient_awards/recipient_award = GLOB.jelly_awards[recipient] - for(var/i in 1 to recipient_award.medal_names.len) + for(var/i in 1 to length(recipient_award.medal_names)) dat += "
    [recipient] is awarded [recipient_award.posthumous[i] ? "posthumously " : ""]a [recipient_award.medal_names[i]]: \'[recipient_award.medal_citations[i]]\'[recipient_award.giver_rank[i] ? " by [recipient_award.giver_rank[i]]" : ""][recipient_award.giver_name[i] ? " ([recipient_award.giver_name[i]])" : ""]." to_world(dat) diff --git a/code/game/gamemodes/colonialmarines/colonialmarines.dm b/code/game/gamemodes/colonialmarines/colonialmarines.dm index 796bf71c3a8e..14f5397b1f91 100644 --- a/code/game/gamemodes/colonialmarines/colonialmarines.dm +++ b/code/game/gamemodes/colonialmarines/colonialmarines.dm @@ -89,7 +89,7 @@ new type_to_spawn(T) //desert river test - if(!round_toxic_river.len) + if(!length(round_toxic_river)) round_toxic_river = null //No tiles? else round_time_river = rand(-100,100) @@ -100,7 +100,7 @@ var/obj/structure/tunnel/T var/i = 0 var/turf/t - while(GLOB.xeno_tunnels.len && i++ < 3) + while(length(GLOB.xeno_tunnels) && i++ < 3) t = get_turf(pick_n_take(GLOB.xeno_tunnels)) T = new(t) T.id = "hole[i]" @@ -522,7 +522,7 @@ GLOB.round_statistics.game_mode = name GLOB.round_statistics.round_length = world.time GLOB.round_statistics.round_result = round_finished - GLOB.round_statistics.end_round_player_population = GLOB.clients.len + GLOB.round_statistics.end_round_player_population = length(GLOB.clients) GLOB.round_statistics.log_round_statistics() @@ -641,7 +641,7 @@ total_marines += squad_marines_job_report[job_type] total_squad_marines += squad_marines_job_report[job_type] incrementer++ - if(incrementer < squad_marines_job_report.len) + if(incrementer < length(squad_marines_job_report)) squad_marine_job_text += ", " var/auxiliary_marine_job_text = "" @@ -651,7 +651,7 @@ auxiliary_marine_job_text += "[job_type]: [auxiliary_marines_job_report[job_type]]" total_marines += auxiliary_marines_job_report[job_type] incrementer++ - if(incrementer < auxiliary_marines_job_report.len) + if(incrementer < length(auxiliary_marines_job_report)) auxiliary_marine_job_text += ", " var/total_non_standard = 0 @@ -662,7 +662,7 @@ non_standard_job_text += "[job_type]: [non_standard_job_report[job_type]]" total_non_standard += non_standard_job_report[job_type] incrementer++ - if(incrementer < non_standard_job_report.len) + if(incrementer < length(non_standard_job_report)) non_standard_job_text += ", " var/list/hive_xeno_numbers = list() @@ -676,7 +676,7 @@ hive_caste_text += "[hive_caste]: [per_hive_status[hive_caste]]" hive_amount += per_hive_status[hive_caste] incrementer++ - if(incrementer < per_hive_status.len) + if(incrementer < length(per_hive_status)) hive_caste_text += ", " if(hive_amount) hive_xeno_numbers[hive] = hive_amount diff --git a/code/game/gamemodes/colonialmarines/huntergames.dm b/code/game/gamemodes/colonialmarines/huntergames.dm index 310785070458..23344ee9e8f0 100644 --- a/code/game/gamemodes/colonialmarines/huntergames.dm +++ b/code/game/gamemodes/colonialmarines/huntergames.dm @@ -212,10 +212,10 @@ var/mob/living/carbon/human/H var/turf/picked - if(GLOB.hunter_primaries.len) + if(length(GLOB.hunter_primaries)) picked = get_turf(pick_n_take(GLOB.hunter_primaries)) else - if(GLOB.hunter_secondaries.len) + if(length(GLOB.hunter_secondaries)) picked = get_turf(pick_n_take(GLOB.hunter_secondaries)) else message_admins("There were no spawn points available for a contestant.") @@ -226,7 +226,7 @@ if(istype(M,/mob/living/carbon/human)) //somehow? H = M - if(H.contents.len) + if(length(H.contents)) for(var/obj/item/I in H.contents) qdel(I) H.forceMove(picked) @@ -315,7 +315,7 @@ last_drop = world.time waiting_for_drop_votes = 1 sleep(600) - if(!supply_votes.len) + if(!length(supply_votes)) to_world(SPAN_ROUNDBODY("Nobody got anything! .. weird.")) waiting_for_drop_votes = 0 supply_votes = list() diff --git a/code/game/gamemodes/colonialmarines/whiskey_outpost.dm b/code/game/gamemodes/colonialmarines/whiskey_outpost.dm index e7a43debb5fc..b3fd079d638c 100644 --- a/code/game/gamemodes/colonialmarines/whiskey_outpost.dm +++ b/code/game/gamemodes/colonialmarines/whiskey_outpost.dm @@ -201,9 +201,9 @@ /datum/game_mode/whiskey_outpost/proc/announce_xeno_wave(datum/whiskey_outpost_wave/wave_data) if(!istype(wave_data)) return - if(wave_data.command_announcement.len > 0) + if(length(wave_data.command_announcement) > 0) marine_announcement(wave_data.command_announcement[1], wave_data.command_announcement[2]) - if(wave_data.sound_effect.len > 0) + if(length(wave_data.sound_effect) > 0) playsound_z(SSmapping.levels_by_trait(ZTRAIT_GROUND), pick(wave_data.sound_effect)) //CHECK WIN @@ -297,7 +297,7 @@ if(GLOB.round_statistics) GLOB.round_statistics.game_mode = name GLOB.round_statistics.round_length = world.time - GLOB.round_statistics.end_round_player_population = GLOB.clients.len + GLOB.round_statistics.end_round_player_population = length(GLOB.clients) GLOB.round_statistics.log_round_statistics() @@ -485,7 +485,7 @@ if(crate) crate.storage_capacity = 60 - if(randomitems.len) + if(length(randomitems)) for(var/i = 0; i < choosemax; i++) var/path = pick(randomitems) var/obj/I = new path(crate) @@ -536,7 +536,7 @@ for(var/obj/O in T) if(istype(O,/obj/structure/closet/crate)) var/obj/structure/closet/crate/C = O - if(C.contents.len) + if(length(C.contents)) to_chat(user, SPAN_DANGER("[O] must be emptied before it can be recycled")) continue new /obj/item/stack/sheet/metal(get_step(src,dir)) @@ -778,7 +778,7 @@ return /obj/item/storage/box/attachments/update_icon() - if(!contents.len) + if(!length(contents)) var/turf/T = get_turf(src) if(T) new /obj/item/paper/crumpled(T) diff --git a/code/game/gamemodes/colonialmarines/whiskey_outpost/whiskey_output_waves.dm b/code/game/gamemodes/colonialmarines/whiskey_outpost/whiskey_output_waves.dm index 609a70f1dd3b..68b2a51e76e7 100644 --- a/code/game/gamemodes/colonialmarines/whiskey_outpost/whiskey_output_waves.dm +++ b/code/game/gamemodes/colonialmarines/whiskey_outpost/whiskey_output_waves.dm @@ -43,7 +43,7 @@ available_xenos += unique_xenos - if(!available_xenos.len) + if(!length(available_xenos)) to_chat(xeno_candidate, SPAN_WARNING("There aren't any available xenomorphs.")) return FALSE diff --git a/code/game/gamemodes/colonialmarines/xenovsxeno.dm b/code/game/gamemodes/colonialmarines/xenovsxeno.dm index 40e67df4d458..e1672f362731 100644 --- a/code/game/gamemodes/colonialmarines/xenovsxeno.dm +++ b/code/game/gamemodes/colonialmarines/xenovsxeno.dm @@ -44,8 +44,8 @@ /datum/game_mode/xenovs/pre_setup() monkey_types = SSmapping.configs[GROUND_MAP].monkey_types if(monkey_amount) - if(monkey_types.len) - for(var/i = min(floor(monkey_amount*GLOB.clients.len), GLOB.monkey_spawns.len), i > 0, i--) + if(length(monkey_types)) + for(var/i = min(floor(monkey_amount*length(GLOB.clients)), length(GLOB.monkey_spawns)), i > 0, i--) var/turf/T = get_turf(pick_n_take(GLOB.monkey_spawns)) var/monkey_to_spawn = pick(monkey_types) @@ -265,7 +265,7 @@ if(GLOB.round_statistics) GLOB.round_statistics.game_mode = name GLOB.round_statistics.round_length = world.time - GLOB.round_statistics.end_round_player_population = GLOB.clients.len + GLOB.round_statistics.end_round_player_population = length(GLOB.clients) GLOB.round_statistics.log_round_statistics() diff --git a/code/game/gamemodes/extended/extended.dm b/code/game/gamemodes/extended/extended.dm index 72512a7e77ff..f5b64571f98c 100644 --- a/code/game/gamemodes/extended/extended.dm +++ b/code/game/gamemodes/extended/extended.dm @@ -42,7 +42,7 @@ if(GLOB.round_statistics) GLOB.round_statistics.game_mode = name GLOB.round_statistics.round_length = world.time - GLOB.round_statistics.end_round_player_population = GLOB.clients.len + GLOB.round_statistics.end_round_player_population = length(GLOB.clients) GLOB.round_statistics.log_round_statistics() calculate_end_statistics() diff --git a/code/game/gamemodes/extended/infection.dm b/code/game/gamemodes/extended/infection.dm index e2c34f9aa16c..1f641917d53f 100644 --- a/code/game/gamemodes/extended/infection.dm +++ b/code/game/gamemodes/extended/infection.dm @@ -71,16 +71,16 @@ possible_synth_survivors -= A possible_survivors = shuffle(possible_survivors) //Shuffle them up a bit - if(possible_survivors.len) //We have some, it looks like. + if(length(possible_survivors)) //We have some, it looks like. for(var/datum/mind/A in possible_survivors) //Strip out any xenos first so we don't double-dip. if(A.roundstart_picked) possible_survivors -= A - if(possible_survivors.len) //We may have stripped out all the contendors, so check again. + if(length(possible_survivors)) //We may have stripped out all the contendors, so check again. var/i = surv_starting_num var/datum/mind/new_survivor while(i > 0) - if(!possible_survivors.len) + if(!length(possible_survivors)) break //Ran out of candidates! Can't have a null pick(), so just stick with what we have. new_survivor = pick(possible_survivors) if(!new_survivor) @@ -123,7 +123,7 @@ if(GLOB.round_statistics) GLOB.round_statistics.game_mode = name GLOB.round_statistics.round_length = world.time - GLOB.round_statistics.end_round_player_population = GLOB.clients.len + GLOB.round_statistics.end_round_player_population = length(GLOB.clients) GLOB.round_statistics.log_round_statistics() declare_completion_announce_xenomorphs() diff --git a/code/game/jobs/access.dm b/code/game/jobs/access.dm index 94e59cbd93ef..5c10e8e7d934 100644 --- a/code/game/jobs/access.dm +++ b/code/game/jobs/access.dm @@ -61,7 +61,7 @@ gen_access() if(!islist(req_access)) return 1//something's very wrong var/L[] = req_access - if(!L.len && (!req_one_access || !req_one_access.len)) return 1//no requirements + if(!length(L) && !LAZYLEN(req_one_access)) return 1//no requirements if(!I) return var/list/A = I.GetAccess() @@ -69,7 +69,7 @@ if(!(i in A)) return FALSE//doesn't have this access - if(req_one_access && req_one_access.len) + if(LAZYLEN(req_one_access)) for(var/i in req_one_access) if(i in A) return TRUE//has an access from the single access list @@ -80,14 +80,14 @@ gen_access() if(!req_access && !req_one_access) return 1 if(!islist(req_access)) return 1 - if(!req_access.len && !islist(req_one_access)) + if(!length(req_access) && !islist(req_one_access)) return TRUE - if(!req_access.len && (!req_one_access || !req_one_access.len)) return 1 + if(!length(req_access) && !LAZYLEN(req_one_access)) return 1 if(!islist(L)) return var/i for(i in req_access) if(!(i in L)) return //doesn't have this access - if(req_one_access && req_one_access.len) + if(LAZYLEN(req_one_access)) for(i in req_one_access) if(i in L) return 1//has an access from the single access list return diff --git a/code/game/jobs/job/civilians/other/survivors.dm b/code/game/jobs/job/civilians/other/survivors.dm index 4fc344713d61..87b7fcb2b18f 100644 --- a/code/game/jobs/job/civilians/other/survivors.dm +++ b/code/game/jobs/job/civilians/other/survivors.dm @@ -187,7 +187,7 @@ AddTimelock(/datum/job/civilian/survivor, list( /datum/job/civilian/survivor/commanding_officer/set_spawn_positions() var/list/CO_survivor_types = SSmapping.configs[GROUND_MAP].CO_survivor_types - if(CO_survivor_types.len) + if(length(CO_survivor_types)) total_positions = 1 spawn_positions = 1 return spawn_positions diff --git a/code/game/jobs/job/job.dm b/code/game/jobs/job/job.dm index d758e187ce70..0af315fc3b9d 100644 --- a/code/game/jobs/job/job.dm +++ b/code/game/jobs/job/job.dm @@ -188,7 +188,7 @@ remembered_info += "Your account pin is: [generated_account.remote_access_pin]
    " remembered_info += "Your account funds are: $[generated_account.money]
    " - if(generated_account.transaction_log.len) + if(length(generated_account.transaction_log)) var/datum/transaction/T = generated_account.transaction_log[1] remembered_info += "Your account was created: [T.time], [T.date] at [T.source_terminal]
    " account_user.mind.store_memory(remembered_info) diff --git a/code/game/jobs/job/marine/squad_info.dm b/code/game/jobs/job/marine/squad_info.dm index 7e7dfcc0229a..37db48c3116e 100644 --- a/code/game/jobs/job/marine/squad_info.dm +++ b/code/game/jobs/job/marine/squad_info.dm @@ -9,7 +9,7 @@ return GLOB.not_incapacitated_state /datum/squad/ui_data(mob/user) - if(!squad_info_data.len) //initial first update of data + if(!length(squad_info_data)) //initial first update of data update_all_squad_info() if(squad_info_data["total_mar"] != count) //updates for new marines update_free_mar() @@ -130,7 +130,7 @@ //fireteam and TL update /datum/squad/proc/update_fireteam(team) - squad_info_data["fireteams"][team]["total"] = fireteams[team].len + squad_info_data["fireteams"][team]["total"] = length(fireteams[team]) if(squad_info_data["fireteams"][team]["total"] < 1) squad_info_data["fireteams"][team]["tl"] = list() squad_info_data["fireteams"][team]["mar"] = list() @@ -197,7 +197,7 @@ squad_info_data["total_kia"] = 0 var/mar_free = count for(var/team in fireteams) - mar_free -= fireteams[team].len + mar_free -= length(fireteams[team]) if(squad_leader) mar_free-- for(var/list/freeman in squad_info_data["mar_free"]) diff --git a/code/game/jobs/job/marine/squads.dm b/code/game/jobs/job/marine/squads.dm index 3285e75e45c3..419f7d545fcf 100644 --- a/code/game/jobs/job/marine/squads.dm +++ b/code/game/jobs/job/marine/squads.dm @@ -649,7 +649,7 @@ //Not a safe proc. Returns null if squads or jobs aren't set up. //Mostly used in the marine squad console in marine_consoles.dm. /proc/get_squad_by_name(text) - if(!GLOB.RoleAuthority || GLOB.RoleAuthority.squads.len == 0) + if(!GLOB.RoleAuthority || length(GLOB.RoleAuthority.squads) == 0) return null var/datum/squad/S for(S in GLOB.RoleAuthority.squads) diff --git a/code/game/jobs/role_authority.dm b/code/game/jobs/role_authority.dm index a9017e2cc8d3..b4894eda4d24 100644 --- a/code/game/jobs/role_authority.dm +++ b/code/game/jobs/role_authority.dm @@ -331,7 +331,7 @@ I hope it's easier to tell what the heck this proc is even doing, unlike previou var/i = 0 var/j while(++i < 3) //Get two passes. - if(!roles_to_iterate.len || prob(65)) break //Base chance to become a marine when being assigned randomly, or there are no roles available. + if(!length(roles_to_iterate) || prob(65)) break //Base chance to become a marine when being assigned randomly, or there are no roles available. j = pick(roles_to_iterate) J = roles_to_iterate[j] @@ -533,7 +533,7 @@ I hope it's easier to tell what the heck this proc is even doing, unlike previou //Find which squad has the least population. If all 4 squads are equal it should just use a random one /datum/authority/branch/role/proc/get_lowest_squad(mob/living/carbon/human/H) - if(!squads.len) //Something went wrong, our squads aren't set up. + if(!length(squads)) //Something went wrong, our squads aren't set up. to_world("Warning, something messed up in get_lowest_squad(). No squads set up!") return null @@ -542,7 +542,7 @@ I hope it's easier to tell what the heck this proc is even doing, unlike previou var/list/squads_copy = squads.Copy() var/list/mixed_squads = list() - for(var/i= 1 to squads_copy.len) + for(var/i= 1 to length(squads_copy)) var/datum/squad/S = pick_n_take(squads_copy) if (S.roundstart && S.usable && S.faction == H.faction && S.name != "Root") mixed_squads += S @@ -586,7 +586,7 @@ I hope it's easier to tell what the heck this proc is even doing, unlike previou if(!H) return - if(!squads.len) + if(!length(squads)) to_chat(H, "Something went wrong with your squad randomizer! Tell a coder!") return //Shit, where's our squad data @@ -597,7 +597,7 @@ I hope it's easier to tell what the heck this proc is even doing, unlike previou var/list/squads_copy = squads.Copy() var/list/mixed_squads = list() // The following code removes non useable squads from the lists of squads we assign marines too. - for(var/i= 1 to squads_copy.len) + for(var/i= 1 to length(squads_copy)) var/datum/squad/S = pick_n_take(squads_copy) if (S.roundstart && S.usable && S.faction == H.faction && S.name != "Root") mixed_squads += S diff --git a/code/game/machinery/air_alarm.dm b/code/game/machinery/air_alarm.dm index 7eccb51c0660..3efb579ceadc 100644 --- a/code/game/machinery/air_alarm.dm +++ b/code/game/machinery/air_alarm.dm @@ -264,10 +264,10 @@ /obj/structure/machinery/alarm/proc/register_env_machine(m_id, device_type) var/new_name if (device_type=="AVP") - new_name = "[alarm_area.name] Vent Pump #[alarm_area.air_vent_names.len+1]" + new_name = "[alarm_area.name] Vent Pump #[length(alarm_area.air_vent_names)+1]" alarm_area.air_vent_names[m_id] = new_name else if (device_type=="AScr") - new_name = "[alarm_area.name] Air Scrubber #[alarm_area.air_scrub_names.len+1]" + new_name = "[alarm_area.name] Air Scrubber #[length(alarm_area.air_scrub_names)+1]" alarm_area.air_scrub_names[m_id] = new_name else return @@ -648,7 +648,7 @@ Pressure: [environment_pressure]kP if (AALARM_SCREEN_VENT) var/sensor_data = "" - if(alarm_area.air_vent_names.len) + if(length(alarm_area.air_vent_names)) for(var/id_tag in alarm_area.air_vent_names) var/long_name = alarm_area.air_vent_names[id_tag] var/list/data = alarm_area.air_vent_info[id_tag] @@ -690,7 +690,7 @@ siphoning output = {"Main menu
    [sensor_data]"} if (AALARM_SCREEN_SCRUB) var/sensor_data = "" - if(alarm_area.air_scrub_names.len) + if(length(alarm_area.air_scrub_names)) for(var/id_tag in alarm_area.air_scrub_names) var/long_name = alarm_area.air_scrub_names[id_tag] var/list/data = alarm_area.air_scrub_info[id_tag] @@ -735,7 +735,7 @@ Nitrous Oxide AALARM_MODE_FILL = SET_CLASS("Fill - Shuts off scrubbers and opens vents", INTERFACE_GREEN),\ AALARM_MODE_OFF = SET_CLASS("Off - Shuts off vents and scrubbers", INTERFACE_BLUE) ) - for (var/m=1,m<=modes.len,m++) + for (var/m=1,m<=length(modes),m++) if (mode==m) output += "
  • [modes[m]] (selected)
  • " else diff --git a/code/game/machinery/autolathe.dm b/code/game/machinery/autolathe.dm index fed690f6707b..4150aead979e 100644 --- a/code/game/machinery/autolathe.dm +++ b/code/game/machinery/autolathe.dm @@ -106,7 +106,7 @@ /obj/structure/machinery/autolathe/ui_data(mob/user) var/list/data = list() - if(queue.len) + if(length(queue)) var/list/queue_list = list() var/i = 0 for(var/params in queue) @@ -119,7 +119,7 @@ else data["queued"] = null - if(currently_making_data.len) + if(length(currently_making_data)) data["currently_making"] = currently_making_data else data["currently_making"] = null @@ -129,7 +129,7 @@ var/list/wire_descriptions = get_wire_descriptions() var/list/panel_wires = list() - for(var/wire = 1 to wire_descriptions.len) + for(var/wire = 1 to length(wire_descriptions)) panel_wires += list(list("desc" = wire_descriptions[wire], "cut" = isWireCut(wire))) data["electrical"] = list( @@ -164,7 +164,7 @@ switch(action) if("cancel") var/index = params["index"] - if(index < 1 || index > queue.len) + if(index < 1 || index > length(queue)) return var/list/to_del = queue[index] @@ -198,7 +198,7 @@ if(!initial(make_loc)) make_loc = get_step(loc, get_dir(src,usr)) - if(index > 0 && index <= recipes.len) + if(index > 0 && index <= length(recipes)) making = recipes[index] //Exploit detection, not sure if necessary after rewrite. @@ -358,7 +358,7 @@ storage_capacity[material] = tot_rating * 30000 /obj/structure/machinery/autolathe/proc/try_queue(mob/living/carbon/human/user, datum/autolathe/recipe/making, turf/make_loc, multiplier = 1) - if(queue.len >= queue_max) + if(length(queue) >= queue_max) to_chat(usr, SPAN_DANGER("The [name] has queued the maximum number of operations. Please wait for completion of current operation.")) return AUTOLATHE_FAILED @@ -392,7 +392,7 @@ busy = TRUE - while (queue.len) + while (length(queue)) print_params = queue[1] queue -= list(print_params) print_item(arglist(print_params)) @@ -526,7 +526,7 @@ max_print_amt = -1 - if(!R.resources || !R.resources.len) + if(!LAZYLEN(R.resources)) print_data["materials"] = "No resources required" else //Make sure it's buildable and list requires resources. diff --git a/code/game/machinery/bots/cleanbot.dm b/code/game/machinery/bots/cleanbot.dm index c21a7a854bc3..cd93ce513972 100644 --- a/code/game/machinery/bots/cleanbot.dm +++ b/code/game/machinery/bots/cleanbot.dm @@ -180,7 +180,7 @@ text("[src.oddbutton ? "Yes" : "No" if (!should_patrol) return - if (!patrol_path || patrol_path.len < 1) + if (LAZYLEN(patrol_path) < 1) var/datum/radio_frequency/frequency = SSradio.return_frequency(beacon_freq) if(!frequency) return @@ -204,20 +204,20 @@ text("[src.oddbutton ? "Yes" : "No" return - if(target && path.len == 0) + if(target && length(path) == 0) spawn(0) if(!src || !target) return src.path = AStar(src.loc, src.target.loc, /turf/proc/CardinalTurfsWithAccess, /turf/proc/Distance, 0, 30, id=botcard) if (!path) path = list() - if(src.path.len == 0) + if(length(src.path) == 0) src.oldtarget = src.target target.targeted_by = null src.target = null return - if(src.path.len > 0 && src.target && (src.target != null)) + if(length(src.path) > 0 && src.target && (src.target != null)) step_to(src, src.path[1]) src.path -= src.path[1] - else if(src.path.len == 1) + else if(length(src.path) == 1) step_to(src, target) if(src.target && (src.target != null)) @@ -231,7 +231,7 @@ text("[src.oddbutton ? "Yes" : "No" src.oldloc = src.loc /obj/structure/machinery/bot/cleanbot/proc/patrol_move() - if (src.patrol_path.len <= 0) + if (length(src.patrol_path) <= 0) return var/next = src.patrol_path[1] diff --git a/code/game/machinery/bots/floorbot.dm b/code/game/machinery/bots/floorbot.dm index be8ec5aa8574..85f6d580cec7 100644 --- a/code/game/machinery/bots/floorbot.dm +++ b/code/game/machinery/bots/floorbot.dm @@ -199,21 +199,21 @@ src.oldtarget = null return - if(src.target && (src.target != null) && src.path.len == 0) + if(src.target && (src.target != null) && length(src.path) == 0) spawn(0) if(!istype(src.target, /turf/)) src.path = AStar(src.loc, src.target.loc, /turf/proc/AdjacentTurfsSpace, /turf/proc/Distance, 0, 30, id=botcard) else src.path = AStar(src.loc, src.target, /turf/proc/AdjacentTurfsSpace, /turf/proc/Distance, 0, 30, id=botcard) if (!src.path) src.path = list() - if(src.path.len == 0) + if(length(src.path) == 0) src.oldtarget = src.target src.target = null return - if(src.path.len > 0 && src.target && (src.target != null)) + if(length(src.path) > 0 && src.target && (src.target != null)) step_to(src, src.path[1]) src.path -= src.path[1] - else if(src.path.len == 1) + else if(length(src.path) == 1) step_to(src, target) src.path = new() @@ -342,7 +342,7 @@ if(!istype(T, /obj/item/stack/tile/plasteel)) ..() return - if(src.contents.len >= 1) + if(length(src.contents) >= 1) to_chat(user, SPAN_NOTICE("That won't fit, there's already stuff inside.")) return for(var/mob/M in content_watchers) diff --git a/code/game/machinery/bots/medbot.dm b/code/game/machinery/bots/medbot.dm index 77e890d88d34..5193b1b7cddd 100644 --- a/code/game/machinery/bots/medbot.dm +++ b/code/game/machinery/bots/medbot.dm @@ -62,7 +62,7 @@ src.overlays += image('icons/obj/structures/machinery/aibots.dmi', "medskin_[src.skin]") src.botcard = new /obj/item/card/id(src) - if(isnull(src.botcard_access) || (src.botcard_access.len < 1)) + if(!LAZYLEN(src.botcard_access)) var/datum/job/J = GLOB.RoleAuthority ? GLOB.RoleAuthority.roles_by_path[/datum/job/civilian/doctor] : new /datum/job/civilian/doctor botcard.access = J.get_access() else @@ -278,31 +278,31 @@ src.medicate_patient(src.patient) return - else if(src.patient && (src.path.len) && (get_dist(src.patient,src.path[src.path.len]) > 2)) + else if(src.patient && (length(src.path)) && (get_dist(src.patient,src.path[length(src.path)]) > 2)) src.path = new() src.currently_healing = 0 src.last_found = world.time - if(src.patient && src.path.len == 0 && (get_dist(src,src.patient) > 1)) + if(src.patient && length(src.path) == 0 && (get_dist(src,src.patient) > 1)) spawn(0) src.path = AStar(src.loc, get_turf(src.patient), /turf/proc/CardinalTurfsWithAccess, /turf/proc/Distance, 0, 30,id=botcard) if (!path) path = list() - if(src.path.len == 0) + if(length(src.path) == 0) src.oldpatient = src.patient src.patient = null src.currently_healing = 0 src.last_found = world.time return - if(src.path.len > 0 && src.patient) + if(length(src.path) > 0 && src.patient) step_to(src, src.path[1]) src.path -= src.path[1] spawn(3) - if(src.path.len) + if(length(src.path)) step_to(src, src.path[1]) src.path -= src.path[1] - if(src.path.len > 8 && src.patient) + if(length(src.path) > 8 && src.patient) src.frustration++ return @@ -487,7 +487,7 @@ return //Making a medibot! - if(src.contents.len >= 1) + if(length(src.contents) >= 1) to_chat(user, SPAN_NOTICE("You need to empty [src] out first.")) return diff --git a/code/game/machinery/bots/mulebot.dm b/code/game/machinery/bots/mulebot.dm index 0686759f0edd..563c4b89c590 100644 --- a/code/game/machinery/bots/mulebot.dm +++ b/code/game/machinery/bots/mulebot.dm @@ -105,12 +105,12 @@ var/list/orders = list("0","1","2","3","4","5","6","7","8","9") wire_text = list() wire_order = list() - while(colours.len > 0) - var/color = colours[ rand(1,colours.len) ] + while(length(colours) > 0) + var/color = colours[ rand(1,length(colours)) ] wire_text += color colours -= color - var/order = orders[ rand(1,orders.len) ] + var/order = orders[ rand(1,length(orders)) ] wire_order += text2num(order) orders -= order @@ -584,7 +584,7 @@ at_target() return - else if(path.len > 0 && target) // valid path + else if(length(path) > 0 && target) // valid path var/turf/next = path[1] reached_target = 0 @@ -645,7 +645,7 @@ spawn(2) calc_path(next) - if(path.len > 0) + if(length(path) > 0) src.visible_message("[src] makes a delighted ping!", "You hear a ping.") playsound(src.loc, 'sound/machines/ping.ogg', 25, 0) mode = 4 @@ -667,7 +667,7 @@ calc_path() - if(path.len > 0) + if(length(path) > 0) blockcount = 0 mode = 4 src.visible_message("[src] makes a delighted ping!", "You hear a ping.") diff --git a/code/game/machinery/camera/camera.dm b/code/game/machinery/camera/camera.dm index 6943544e30d4..4f6b40968bdb 100644 --- a/code/game/machinery/camera/camera.dm +++ b/code/game/machinery/camera/camera.dm @@ -52,13 +52,13 @@ GLOBAL_LIST_EMPTY_TYPED(all_cameras, /obj/structure/machinery/camera) if(colony_camera_mapload && mapload && is_ground_level(z)) network = list(CAMERA_NET_COLONY) - if(!src.network || src.network.len < 1) + if(LAZYLEN(src.network) < 1) if(loc) error("[src.name] in [get_area(src)] (x:[src.x] y:[src.y] z:[src.z]) has errored. [src.network?"Empty network list":"Null network list"]") else error("[src.name] in [get_area(src)]has errored. [src.network?"Empty network list":"Null network list"]") ASSERT(src.network) - ASSERT(src.network.len > 0) + ASSERT(length(src.network) > 0) set_pixel_location() update_icon() diff --git a/code/game/machinery/camera/motion.dm b/code/game/machinery/camera/motion.dm index 6a869f443d12..498984a48736 100644 --- a/code/game/machinery/camera/motion.dm +++ b/code/game/machinery/camera/motion.dm @@ -32,7 +32,7 @@ /obj/structure/machinery/camera/proc/lostTarget(mob/target) if (target in motionTargets) motionTargets -= target - if (motionTargets.len == 0) + if (length(motionTargets) == 0) cancelAlarm() /obj/structure/machinery/camera/proc/cancelAlarm() diff --git a/code/game/machinery/computer/almayer_control.dm b/code/game/machinery/computer/almayer_control.dm index 8cd043e23998..3d3c0fdbe4df 100644 --- a/code/game/machinery/computer/almayer_control.dm +++ b/code/game/machinery/computer/almayer_control.dm @@ -85,7 +85,7 @@ if(SShijack.evac_status == EVACUATION_STATUS_INITIATED) data["evac_eta"] = SShijack.get_evac_eta() - if(!messagetitle.len) + if(!length(messagetitle)) data["messages"] = null else for(var/i in 1 to length(messagetitle)) diff --git a/code/game/machinery/computer/arcade.dm b/code/game/machinery/computer/arcade.dm index 1ac5a06738d5..ff8f3959d64e 100644 --- a/code/game/machinery/computer/arcade.dm +++ b/code/game/machinery/computer/arcade.dm @@ -122,7 +122,7 @@ src.gameover = 1 src.temp = "[src.enemy_name] has fallen! Rejoice!" - if(!contents.len) + if(!length(contents)) var/prizeselect = pickweight(prizes) new prizeselect(src.loc) diff --git a/code/game/machinery/computer/atmos_alert.dm b/code/game/machinery/computer/atmos_alert.dm index 9a17449b9e47..8ce8248b07a2 100644 --- a/code/game/machinery/computer/atmos_alert.dm +++ b/code/game/machinery/computer/atmos_alert.dm @@ -62,10 +62,10 @@ ..() if(inoperable()) return - if(priority_alarms.len) + if(length(priority_alarms)) icon_state = "alert:2" - else if(minor_alarms.len) + else if(length(minor_alarms)) icon_state = "alert:1" else @@ -77,13 +77,13 @@ var/priority_text var/minor_text - if(priority_alarms.len) + if(length(priority_alarms)) for(var/zone in priority_alarms) priority_text += "[zone] X
    " else priority_text = "No priority alerts detected.
    " - if(minor_alarms.len) + if(length(minor_alarms)) for(var/zone in minor_alarms) minor_text += "[zone] X
    " else diff --git a/code/game/machinery/computer/camera_console.dm b/code/game/machinery/computer/camera_console.dm index 1e2cb427cab4..c818df9fbfb9 100644 --- a/code/game/machinery/computer/camera_console.dm +++ b/code/game/machinery/computer/camera_console.dm @@ -167,7 +167,7 @@ stack_trace("Camera in a cameranet has a non-list camera network") continue var/list/tempnetwork = C.network & network - if(tempnetwork.len) + if(length(tempnetwork)) D["[C.c_tag]"] = C return D diff --git a/code/game/machinery/computer/communications.dm b/code/game/machinery/computer/communications.dm index dec523ccc5b2..2e6922e43a85 100644 --- a/code/game/machinery/computer/communications.dm +++ b/code/game/machinery/computer/communications.dm @@ -366,7 +366,7 @@ dat += "
    Select primary LZ" dat += "

    " dat += "
    Make an announcement" - dat += GLOB.admins.len > 0 ? "
    Send a message to USCM" : "
    USCM communication offline" + dat += length(GLOB.admins) > 0 ? "
    Send a message to USCM" : "
    USCM communication offline" dat += "
    Award a medal" dat += "
    Send Distress Beacon" dat += "
    Activate Self-Destruct" @@ -393,7 +393,7 @@ if(STATE_MESSAGELIST) dat += "Messages:" - for(var/i = 1; i<=messagetitle.len; i++) + for(var/i = 1; i<=length(messagetitle); i++) dat += "
    [messagetitle[i]]" if(STATE_VIEWMESSAGE) @@ -466,7 +466,7 @@ if(STATE_MESSAGELIST) dat += "Messages:" - for(var/i = 1; i<=messagetitle.len; i++) + for(var/i = 1; i<=length(messagetitle); i++) dat += "
    [messagetitle[i]]" if(STATE_VIEWMESSAGE) diff --git a/code/game/machinery/computer/dropship_weapons.dm b/code/game/machinery/computer/dropship_weapons.dm index abd3ab50b75c..e07b415ed233 100644 --- a/code/game/machinery/computer/dropship_weapons.dm +++ b/code/game/machinery/computer/dropship_weapons.dm @@ -581,8 +581,8 @@ for(var/datum/cas_fire_mission_record/firerec as anything in editing_firemission.records) var/gimbal = firerec.get_offsets() var/ammo = firerec.get_ammo() - var/offsets = new /list(firerec.offsets.len) - for(var/idx = 1; idx < firerec.offsets.len; idx++) + var/offsets = new /list(length(firerec.offsets)) + for(var/idx = 1; idx < length(firerec.offsets); idx++) offsets[idx] = firerec.offsets[idx] == null ? "-" : firerec.offsets[idx] . += list( "name" = sanitize(copytext(firerec.weapon.name, 1, 50)), @@ -738,7 +738,7 @@ if(!skillcheck(weapon_operator, SKILL_PILOT, SKILL_PILOT_TRAINED)) //only pilots can fire dropship weapons. to_chat(weapon_operator, SPAN_WARNING("A screen with graphics and walls of physics and engineering values open, you immediately force it closed.")) return FALSE - if(firemission_tag > firemission_envelope.missions.len) + if(firemission_tag > length(firemission_envelope.missions)) to_chat(weapon_operator, SPAN_WARNING("Fire Mission ID corrupted or already deleted.")) return FALSE if(selected_firemission == firemission_envelope.missions[firemission_tag]) @@ -757,7 +757,7 @@ if(firemission_envelope.stat > FIRE_MISSION_STATE_IN_TRANSIT && firemission_envelope.stat < FIRE_MISSION_STATE_COOLDOWN) to_chat(weapon_operator, SPAN_WARNING("Fire Mission already underway.")) return FALSE - if(firemission_tag > firemission_envelope.missions.len) + if(firemission_tag > length(firemission_envelope.missions)) to_chat(weapon_operator, SPAN_WARNING("Fire Mission ID corrupted or deleted.")) return FALSE if(selected_firemission == firemission_envelope.missions[firemission_tag]) diff --git a/code/game/machinery/computer/guestpass.dm b/code/game/machinery/computer/guestpass.dm index 5204b53e20ee..20a7260320f2 100644 --- a/code/game/machinery/computer/guestpass.dm +++ b/code/game/machinery/computer/guestpass.dm @@ -165,7 +165,7 @@ if (giver) var/number = add_zero("[rand(0,9999)]", 4) var/entry = "\[[worldtime2text()]\] Pass #[number] issued by [giver.registered_name] ([giver.assignment]) to [giv_name]. Reason: [reason]. Grants access to following areas: " - for (var/i=1 to accesses.len) + for (var/i=1 to length(accesses)) var/A = accesses[i] if (A) var/area = get_access_desc(A) diff --git a/code/game/machinery/computer/security.dm b/code/game/machinery/computer/security.dm index 4138d89908d4..b3892de24413 100644 --- a/code/game/machinery/computer/security.dm +++ b/code/game/machinery/computer/security.dm @@ -155,7 +155,7 @@ dat += text("New Security Record

    ", src) dat += text("\nPrint Record
    \nBack
    ", src, src) if(4.0) - if(!Perp.len) + if(!length(Perp)) dat += text("ERROR. String could not be located.

    Back", src) else dat += {" @@ -172,7 +172,7 @@ Rank Criminal Status "} - for(var/i=1, i<=Perp.len, i += 2) + for(var/i=1, i<=length(Perp), i += 2) var/crimstat = "" var/datum/data/record/R = Perp[i] if(istype(Perp[i+1],/datum/data/record/)) @@ -271,16 +271,16 @@ What a mess.*/ Perp = new/list() t1 = lowertext(t1) var/list/components = splittext(t1, " ") - if(components.len > 5) + if(length(components) > 5) return //Lets not let them search too greedily. for(var/datum/data/record/R in GLOB.data_core.general) var/temptext = R.fields["name"] + " " + R.fields["id"] + " " + R.fields["rank"] - for(var/i = 1, i<=components.len, i++) + for(var/i = 1, i<=length(components), i++) if(findtext(temptext,components[i])) var/prelist = new/list(2) prelist[1] = R Perp += prelist - for(var/i = 1, i<=Perp.len, i+=2) + for(var/i = 1, i<=length(Perp), i+=2) for(var/datum/data/record/E in GLOB.data_core.security) var/datum/data/record/R = Perp[i] if ((E.fields["name"] == R.fields["name"] && E.fields["id"] == R.fields["id"])) diff --git a/code/game/machinery/computer/skills.dm b/code/game/machinery/computer/skills.dm index cc4d93f5a24c..cba8d50791f9 100644 --- a/code/game/machinery/computer/skills.dm +++ b/code/game/machinery/computer/skills.dm @@ -97,7 +97,7 @@ dat += "General Record Lost!
    " dat += "\nDelete Record (ALL)

    \nPrint Record
    \nBack
    " if(4.0) - if(!Perp.len) + if(!length(Perp)) dat += "ERROR. String could not be located.

    Back" else dat += {" @@ -114,7 +114,7 @@ Rank Fingerprints "} - for(var/i=1, i<=Perp.len, i += 2) + for(var/i=1, i<=length(Perp), i += 2) var/crimstat = "" var/datum/data/record/R = Perp[i] if(istype(Perp[i+1],/datum/data/record/)) @@ -202,16 +202,16 @@ What a mess.*/ Perp = new/list() t1 = lowertext(t1) var/list/components = splittext(t1, " ") - if(components.len > 5) + if(length(components) > 5) return //Lets not let them search too greedily. for(var/datum/data/record/R in GLOB.data_core.general) var/temptext = R.fields["name"] + " " + R.fields["id"] + " " + R.fields["rank"] - for(var/i = 1, i<=components.len, i++) + for(var/i = 1, i<=length(components), i++) if(findtext(temptext,components[i])) var/prelist = new/list(2) prelist[1] = R Perp += prelist - for(var/i = 1, i<=Perp.len, i+=2) + for(var/i = 1, i<=length(Perp), i+=2) for(var/datum/data/record/E in GLOB.data_core.security) var/datum/data/record/R = Perp[i] if ((E.fields["name"] == R.fields["name"] && E.fields["id"] == R.fields["id"])) diff --git a/code/game/machinery/computer/station_alert.dm b/code/game/machinery/computer/station_alert.dm index d262caf47859..ddce92c966fb 100644 --- a/code/game/machinery/computer/station_alert.dm +++ b/code/game/machinery/computer/station_alert.dm @@ -55,7 +55,7 @@ var/list/CL = null if(O && islist(O)) CL = O - if (CL.len == 1) + if (length(CL) == 1) C = CL[1] else if(O && istype(O, /obj/structure/machinery/camera)) C = O @@ -73,7 +73,7 @@ var/list/srcs = alarm[3] if (origin in srcs) srcs -= origin - if (srcs.len == 0) + if (length(srcs) == 0) cleared = 1 L -= I return !cleared @@ -85,7 +85,7 @@ var/active_alarms = 0 for (var/cat in src.alarms) var/list/L = src.alarms[cat] - if(L.len) active_alarms = 1 + if(length(L)) active_alarms = 1 if(active_alarms) icon_state = "alert:2" else diff --git a/code/game/machinery/constructable_frame.dm b/code/game/machinery/constructable_frame.dm index 357ef48fff37..0c8cc62c3f87 100644 --- a/code/game/machinery/constructable_frame.dm +++ b/code/game/machinery/constructable_frame.dm @@ -124,7 +124,7 @@ state = CONSTRUCTION_STATE_BEGIN circuit.forceMove(loc) circuit = null - if(components.len == 0) + if(length(components) == 0) to_chat(user, SPAN_NOTICE("You remove the circuit board.")) else to_chat(user, SPAN_NOTICE("You remove the circuit board and other components.")) diff --git a/code/game/machinery/cryo.dm b/code/game/machinery/cryo.dm index 61972f2f6c46..70c4a175489c 100644 --- a/code/game/machinery/cryo.dm +++ b/code/game/machinery/cryo.dm @@ -114,7 +114,7 @@ data["isBeakerLoaded"] = beaker ? TRUE : FALSE var/beakerContents = list() - if(beaker && beaker.reagents && beaker.reagents.reagent_list.len) + if(beaker && beaker.reagents && length(beaker.reagents.reagent_list)) for(var/datum/reagent/R in beaker.reagents.reagent_list) beakerContents += list(list("name" = R.name, "volume" = R.volume)) data["beakerContents"] = beakerContents diff --git a/code/game/machinery/cryopod.dm b/code/game/machinery/cryopod.dm index 1793b87c72ae..658e2aa150f3 100644 --- a/code/game/machinery/cryopod.dm +++ b/code/game/machinery/cryopod.dm @@ -103,7 +103,7 @@ GLOBAL_LIST_INIT(frozen_items, list(SQUAD_MARINE_1 = list(), SQUAD_MARINE_2 = li else if(href_list["item"]) - if(frozen_items_for_type.len == 0) + if(length(frozen_items_for_type) == 0) to_chat(user, SPAN_WARNING("There is nothing to recover from storage.")) return @@ -122,7 +122,7 @@ GLOBAL_LIST_INIT(frozen_items, list(SQUAD_MARINE_1 = list(), SQUAD_MARINE_2 = li else if(href_list["allitems"]) - if(frozen_items_for_type.len == 0) + if(length(frozen_items_for_type) == 0) to_chat(user, SPAN_WARNING("There is nothing to recover from storage.")) return diff --git a/code/game/machinery/door_display/door_display.dm b/code/game/machinery/door_display/door_display.dm index 3f0c53ada18e..4624ba5f1bd2 100644 --- a/code/game/machinery/door_display/door_display.dm +++ b/code/game/machinery/door_display/door_display.dm @@ -35,7 +35,7 @@ if (D.id == id) targets += D - if(targets.len == 0) + if(length(targets) == 0) stat |= BROKEN update_icon() diff --git a/code/game/machinery/doors/airlock.dm b/code/game/machinery/doors/airlock.dm index e8db9dd63875..84f02f0a5bbd 100644 --- a/code/game/machinery/doors/airlock.dm +++ b/code/game/machinery/doors/airlock.dm @@ -677,9 +677,9 @@ GLOBAL_LIST_INIT(airlock_wire_descriptions, list( airlock_electronics = new/obj/item/circuitboard/airlock(loc) if(!req_access || !req_one_access) check_access() - if(req_access.len) + if(length(req_access)) airlock_electronics.conf_access = req_access - else if(req_one_access.len) + else if(length(req_one_access)) airlock_electronics.conf_access = req_one_access airlock_electronics.one_access = TRUE else diff --git a/code/game/machinery/doors/firedoor.dm b/code/game/machinery/doors/firedoor.dm index cddd67c7e2b2..f3fba382fb04 100644 --- a/code/game/machinery/doors/firedoor.dm +++ b/code/game/machinery/doors/firedoor.dm @@ -75,7 +75,7 @@ . += SPAN_WARNING("WARNING: Current pressure differential is [pdiff]kPa! Opening door may result in injury!") . += "Sensor readings:" - for(var/index = 1; index <= tile_info.len; index++) + for(var/index = 1; index <= length(tile_info); index++) var/o = "  " switch(index) if(1) @@ -101,10 +101,10 @@ o += "[pressure]kPa" . += o - if(islist(users_to_open) && users_to_open.len) + if(islist(users_to_open) && length(users_to_open)) var/users_to_open_string = users_to_open[1] - if(users_to_open.len >= 2) - for(var/i = 2 to users_to_open.len) + if(length(users_to_open) >= 2) + for(var/i = 2 to length(users_to_open)) users_to_open_string += ", [users_to_open[i]]" . += "These people have opened \the [src] during an alert: [users_to_open_string]." @@ -275,7 +275,7 @@ if(dir_alerts) for(var/d=1;d<=4;d++) var/cdir = GLOB.cardinals[d] - for(var/i=1;i<=ALERT_STATES.len;i++) + for(var/i=1;i<=length(ALERT_STATES);i++) if(dir_alerts[d] & (1<<(i-1))) overlays += new/icon(icon,"alert_[ALERT_STATES[i]]", dir=cdir) else diff --git a/code/game/machinery/doors/windowdoor.dm b/code/game/machinery/doors/windowdoor.dm index a7af3ba4bdcb..61727d1fa471 100644 --- a/code/game/machinery/doors/windowdoor.dm +++ b/code/game/machinery/doors/windowdoor.dm @@ -15,7 +15,7 @@ /obj/structure/machinery/door/window/Initialize() . = ..() addtimer(CALLBACK(src, PROC_REF(update_icon)), 1) - if (src.req_access && src.req_access.len) + if (LAZYLEN(src.req_access)) src.icon_state = "[src.icon_state]" src.base_state = src.icon_state @@ -105,9 +105,9 @@ ae = new/obj/item/circuitboard/airlock( src.loc ) if(!src.req_access) src.check_access() - if(src.req_access.len) + if(length(src.req_access)) ae.conf_access = src.req_access - else if (src.req_one_access && src.req_one_access.len) + else if (LAZYLEN(src.req_one_access)) ae.conf_access = src.req_one_access ae.one_access = 1 else @@ -189,9 +189,9 @@ ae = new/obj/item/circuitboard/airlock( src.loc ) if(!src.req_access) src.check_access() - if(src.req_access.len) + if(length(src.req_access)) ae.conf_access = src.req_access - else if (src.req_one_access.len) + else if (length(src.req_one_access)) ae.conf_access = src.req_one_access ae.one_access = 1 else diff --git a/code/game/machinery/iv_drip.dm b/code/game/machinery/iv_drip.dm index 4e4e38d953d1..f4a3a9f25cc3 100644 --- a/code/game/machinery/iv_drip.dm +++ b/code/game/machinery/iv_drip.dm @@ -190,7 +190,7 @@ . += "The IV drip is [mode ? "injecting" : "taking blood"]." if(beaker) - if(beaker.reagents && beaker.reagents.reagent_list.len) + if(beaker.reagents && length(beaker.reagents.reagent_list)) . += SPAN_NOTICE(" Attached is \a [beaker] with [beaker.reagents.total_volume] units of liquid.") else . += SPAN_NOTICE(" Attached is an empty [beaker].") diff --git a/code/game/machinery/kitchen/microwave.dm b/code/game/machinery/kitchen/microwave.dm index 78e64ab49f89..dbb93a0e30c1 100644 --- a/code/game/machinery/kitchen/microwave.dm +++ b/code/game/machinery/kitchen/microwave.dm @@ -42,7 +42,7 @@ for (var/reagent in recipe.reagents) acceptable_reagents |= reagent if (recipe.items) - max_n_of_items = max(max_n_of_items,recipe.items.len) + max_n_of_items = max(max_n_of_items,length(recipe.items)) // This will do until I can think of a fun recipe to use dionaea in - // will also allow anything using the holder item to be microwaved into @@ -115,7 +115,7 @@ else if(operating) to_chat(user, SPAN_DANGER("It's running!")) else if(is_type_in_list(O,acceptable_items)) - if (contents.len>=max_n_of_items) + if (length(contents)>=max_n_of_items) to_chat(user, SPAN_DANGER("This [src] is full of ingredients, you cannot put more.")) return 1 if(istype(O, /obj/item/stack) && O:get_amount() > 1) // This is bad, but I can't think of how to change it diff --git a/code/game/machinery/kitchen/processor.dm b/code/game/machinery/kitchen/processor.dm index 4918df4d9a5b..62455d770539 100644 --- a/code/game/machinery/kitchen/processor.dm +++ b/code/game/machinery/kitchen/processor.dm @@ -41,7 +41,7 @@ if(!skillcheck(user, SKILL_DOMESTIC, SKILL_DOMESTIC_MASTER)) to_chat(user, SPAN_DANGER("You aren't trained to remove dangerous substances from food!")) return FALSE - return TRUE + return TRUE /datum/food_processor_process/meat input = /obj/item/reagent_container/food/snacks/meat @@ -55,7 +55,7 @@ if(!skillcheck(user, SKILL_DOMESTIC, SKILL_DOMESTIC_MASTER)) to_chat(user, SPAN_DANGER("You aren't trained to remove dangerous substances from food!")) return FALSE - return TRUE + return TRUE /datum/food_processor_process/potato input = /obj/item/reagent_container/food/snacks/grown/potato @@ -102,7 +102,7 @@ if(processing) to_chat(user, SPAN_DANGER("The processor is in the process of processing.")) return 1 - if(contents.len > 0) //TODO: several items at once? several different items? + if(length(contents) > 0) //TODO: several items at once? several different items? to_chat(user, SPAN_DANGER("Something is already in the processing chamber.")) return 1 if(HAS_TRAIT(O, TRAIT_TOOL_WRENCH)) @@ -130,7 +130,7 @@ if(src.processing) to_chat(user, SPAN_DANGER("The processor is in the process of processing.")) return 1 - if(src.contents.len == 0) + if(length(src.contents) == 0) to_chat(user, SPAN_DANGER("The processor is empty.")) return 1 for(var/O in src.contents) diff --git a/code/game/machinery/kitchen/smartfridge.dm b/code/game/machinery/kitchen/smartfridge.dm index 6d3e18933457..774153316baa 100644 --- a/code/game/machinery/kitchen/smartfridge.dm +++ b/code/game/machinery/kitchen/smartfridge.dm @@ -125,7 +125,7 @@ user.visible_message( \ SPAN_NOTICE("[user] loads \the [src] with \the [P]."), \ SPAN_NOTICE("You load \the [src] with \the [P].")) - if(P.contents.len > 0) + if(length(P.contents) > 0) to_chat(user, SPAN_NOTICE("Some items are refused.")) else if(!(O.flags_item & NOBLUDGEON)) //so we can spray, scan, c4 the machine. @@ -186,7 +186,7 @@ var/list/wire_descriptions = get_wire_descriptions() var/list/panel_wires = list() - for(var/wire = 1 to wire_descriptions.len) + for(var/wire = 1 to length(wire_descriptions)) panel_wires += list(list("desc" = wire_descriptions[wire], "cut" = isWireCut(wire))) .["electrical"] = list( diff --git a/code/game/machinery/medical_pod/autodoc.dm b/code/game/machinery/medical_pod/autodoc.dm index 937afa0cdb4d..ef335c6841e6 100644 --- a/code/game/machinery/medical_pod/autodoc.dm +++ b/code/game/machinery/medical_pod/autodoc.dm @@ -109,7 +109,7 @@ /obj/structure/machinery/medical_pod/autodoc/proc/heal_limb(mob/living/carbon/human/human, brute, burn) var/list/obj/limb/parts = human.get_damaged_limbs(brute,burn) - if(!parts.len) return + if(!length(parts)) return var/obj/limb/picked = pick(parts) if(picked.status & (LIMB_ROBOT|LIMB_SYNTHSKIN)) picked.heal_damage(brute, burn, TRUE) @@ -248,7 +248,7 @@ if(L.status & LIMB_DESTROYED) if(!(L.parent.status & LIMB_DESTROYED) && L.name != "head") surgery_list += create_autodoc_surgery(L,LIMB_SURGERY,"missing") - if(L.implants.len) + if(length(L.implants)) for(var/I in L.implants) if(!is_type_in_list(I,known_implants)) surgery_list += create_autodoc_surgery(L,LIMB_SURGERY,"shrapnel") @@ -294,7 +294,7 @@ var/list/surgery_todo_list = N.fields["autodoc_manual"] - if(!surgery_todo_list.len) + if(!length(surgery_todo_list)) visible_message("\The [src] buzzes, no surgical procedures were queued.") return @@ -320,7 +320,7 @@ surgery_todo_list -= A var/currentsurgery = 1 - while(surgery_todo_list.len > 0) + while(length(surgery_todo_list) > 0) if(!surgery) break; sleep(-1) @@ -508,7 +508,7 @@ open_incision(H,S.limb_ref) if(S.limb_ref.name == "chest" || S.limb_ref.name == "head") open_encased(H,S.limb_ref) - if(S.limb_ref.implants.len) + if(length(S.limb_ref.implants)) for(var/obj/item/I in S.limb_ref.implants) if(!surgery) break if(!is_type_in_list(I,known_implants)) @@ -893,7 +893,7 @@ var/known_implants = list(/obj/item/implant/chem, /obj/item/implant/death_alarm, /obj/item/implant/loyalty, /obj/item/implant/tracking, /obj/item/implant/neurostim) for(var/obj/limb/L in connected.occupant.limbs) if(L) - if(L.implants.len) + if(length(L.implants)) for(var/I in L.implants) if(!is_type_in_list(I,known_implants)) N.fields["autodoc_manual"] += create_autodoc_surgery(L,LIMB_SURGERY,"shrapnel") diff --git a/code/game/machinery/medical_pod/bodyscanner.dm b/code/game/machinery/medical_pod/bodyscanner.dm index 73e5a87b2304..54b454f945a8 100644 --- a/code/game/machinery/medical_pod/bodyscanner.dm +++ b/code/game/machinery/medical_pod/bodyscanner.dm @@ -333,7 +333,7 @@ open = "Open
    " var/unknown_body = 0 - if (e.implants.len) + if (length(e.implants)) for(var/I in e.implants) if(is_type_in_list(I,known_implants)) imp += "[I] implanted
    " diff --git a/code/game/machinery/nuclearbomb.dm b/code/game/machinery/nuclearbomb.dm index bb83261ae948..42b5d95694cb 100644 --- a/code/game/machinery/nuclearbomb.dm +++ b/code/game/machinery/nuclearbomb.dm @@ -345,7 +345,7 @@ GLOBAL_VAR_INIT(bomb_set, FALSE) var/datum/hive_status/hive for(var/hivenumber in GLOB.hive_datum) hive = GLOB.hive_datum[hivenumber] - if(!hive.totalXenos.len) + if(!length(hive.totalXenos)) return xeno_announcement(SPAN_XENOANNOUNCE(warning), hive.hivenumber, XENO_GENERAL_ANNOUNCE) return @@ -358,7 +358,7 @@ GLOBAL_VAR_INIT(bomb_set, FALSE) yautja_announcement(SPAN_YAUTJABOLDBIG("WARNING!
    A human purification device has been detected. You have approximately [t_left] to abandon the hunting grounds before it activates.")) for(var/hivenumber in GLOB.hive_datum) hive = GLOB.hive_datum[hivenumber] - if(!hive.totalXenos.len) + if(!length(hive.totalXenos)) continue xeno_announcement(SPAN_XENOANNOUNCE("The tallhosts have deployed a hive killer at [get_area_name(loc)]! Stop it at all costs!"), hive.hivenumber, XENO_GENERAL_ANNOUNCE) else @@ -367,7 +367,7 @@ GLOBAL_VAR_INIT(bomb_set, FALSE) yautja_announcement(SPAN_YAUTJABOLDBIG("WARNING!
    The human purification device's signature has disappeared.")) for(var/hivenumber in GLOB.hive_datum) hive = GLOB.hive_datum[hivenumber] - if(!hive.totalXenos.len) + if(!length(hive.totalXenos)) continue xeno_announcement(SPAN_XENOANNOUNCE("The hive killer has been disabled! Rejoice!"), hive.hivenumber, XENO_GENERAL_ANNOUNCE) return @@ -594,7 +594,7 @@ GLOBAL_VAR_INIT(bomb_set, FALSE) var/datum/hive_status/hive for(var/hivenumber in GLOB.hive_datum) hive = GLOB.hive_datum[hivenumber] - if(!hive.totalXenos.len) + if(!length(hive.totalXenos)) return xeno_announcement(SPAN_XENOANNOUNCE(warning), hive.hivenumber, XENO_GENERAL_ANNOUNCE) return diff --git a/code/game/machinery/rechargestation.dm b/code/game/machinery/rechargestation.dm index 2e98eb7e88e9..536ad72557d9 100644 --- a/code/game/machinery/rechargestation.dm +++ b/code/game/machinery/rechargestation.dm @@ -167,7 +167,7 @@ doing_stuff = TRUE if(!doing_stuff) for(var/obj/limb/current_limb in humanoid_occupant.limbs) - if(current_limb.implants.len) + if(length(current_limb.implants)) doing_stuff = TRUE to_chat(occupant, "Foreign material detected. Beginning removal process...") for(var/obj/item/current_implant in current_limb.implants) diff --git a/code/game/machinery/scoreboard.dm b/code/game/machinery/scoreboard.dm index 8fd5dd984e6f..0810ae26cbf4 100644 --- a/code/game/machinery/scoreboard.dm +++ b/code/game/machinery/scoreboard.dm @@ -16,8 +16,7 @@ update_display() /obj/structure/machinery/scoreboard/proc/update_display() - if(overlays.len) - overlays.Cut() + LAZYCLEARLIST(overlays) var/score_state = "s[( floor(scoreleft/10) > scoreleft/10 ? floor(scoreleft/10)-1 : floor(scoreleft/10) )]a" overlays += image('icons/obj/structures/machinery/scoreboard.dmi', icon_state=score_state) diff --git a/code/game/machinery/status_display.dm b/code/game/machinery/status_display.dm index 547dbba68e4f..db2e58cf325b 100644 --- a/code/game/machinery/status_display.dm +++ b/code/game/machinery/status_display.dm @@ -158,8 +158,7 @@ return "" /obj/structure/machinery/status_display/proc/remove_display() - if(overlays.len) - overlays.Cut() + LAZYCLEARLIST(overlays) if(maptext) maptext = "" @@ -241,8 +240,7 @@ /obj/structure/machinery/ai_status_display/proc/set_picture(state) picture_state = state - if(overlays.len) - overlays.Cut() + LAZYCLEARLIST(overlays) overlays += image('icons/obj/structures/machinery/status_display.dmi', icon_state=picture_state) #undef DEFAULT_FONT_COLOR diff --git a/code/game/machinery/telecomms/machine_interactions.dm b/code/game/machinery/telecomms/machine_interactions.dm index 87bfcd466766..9bffa8ebe450 100644 --- a/code/game/machinery/telecomms/machine_interactions.dm +++ b/code/game/machinery/telecomms/machine_interactions.dm @@ -69,7 +69,7 @@ to_chat(user, "You finish prying out the components.") // Drop all the component stuff - if(contents.len > 0) + if(length(contents) > 0) for(var/obj/x in src) x.forceMove(user.loc) else @@ -125,7 +125,7 @@ else dat += "
    Identification String: NULL" dat += "
    Network: [network]" - dat += "
    Prefabrication: [autolinkers.len ? "TRUE" : "FALSE"]" + dat += "
    Prefabrication: [length(autolinkers) ? "TRUE" : "FALSE"]" if(hide) dat += "
    Shadow Link: ACTIVE" //Show additional options for certain GLOB.machines. diff --git a/code/game/machinery/telecomms/portable_comms.dm b/code/game/machinery/telecomms/portable_comms.dm index f8f34133750f..c2a9bb1072ac 100644 --- a/code/game/machinery/telecomms/portable_comms.dm +++ b/code/game/machinery/telecomms/portable_comms.dm @@ -18,9 +18,9 @@ is_wired = 1 break if(components) - switch(components.len) + switch(length(components)) if(0 to 8) - icon_state = "construct_[contents.len]_[is_wired]" + icon_state = "construct_[length(contents)]_[is_wired]" else icon_state = "construct_8_1" else if(state) diff --git a/code/game/machinery/vending/cm_vending.dm b/code/game/machinery/vending/cm_vending.dm index afce800b0af4..217ed870cd75 100644 --- a/code/game/machinery/vending/cm_vending.dm +++ b/code/game/machinery/vending/cm_vending.dm @@ -247,7 +247,7 @@ GLOBAL_LIST_EMPTY(vending_products) //M94 flare packs handling else if(istype(item_to_stock, /obj/item/storage/box/m94)) var/obj/item/storage/box/m94/flare_pack = item_to_stock - if(flare_pack.contents.len < flare_pack.max_storage_space) + if(length(flare_pack.contents) < flare_pack.max_storage_space) to_chat(user, SPAN_WARNING("\The [item_to_stock] is not full.")) return var/flare_type @@ -272,7 +272,7 @@ GLOBAL_LIST_EMPTY(vending_products) //Machete holsters handling else if(istype(item_to_stock, /obj/item/clothing/suit/storage/marine)) var/obj/item/clothing/suit/storage/marine/AR = item_to_stock - if(AR.pockets && AR.pockets.contents.len) + if(AR.pockets && length(AR.pockets.contents)) if(user) to_chat(user, SPAN_WARNING("\The [AR] has something inside it. Empty it before restocking.")) return FALSE @@ -300,7 +300,7 @@ GLOBAL_LIST_EMPTY(vending_products) if(AM.current_rounds != AM.max_rounds) to_chat(user, SPAN_WARNING("\The [A] isn't full. You need to fill it before you can restock it.")) return - else if(A.contents.len < A.num_of_magazines) + else if(length(A.contents) < A.num_of_magazines) to_chat(user, SPAN_WARNING("[A] is not full.")) return else @@ -317,14 +317,14 @@ GLOBAL_LIST_EMPTY(vending_products) //Marine armor handling else if(istype(item_to_stock, /obj/item/clothing/suit/storage/marine)) var/obj/item/clothing/suit/storage/marine/AR = item_to_stock - if(AR.pockets && AR.pockets.contents.len) + if(AR.pockets && length(AR.pockets.contents)) if(user) to_chat(user, SPAN_WARNING("\The [AR] has something inside it. Empty it before restocking.")) return FALSE //Marine helmet handling else if(istype(item_to_stock, /obj/item/clothing/head/helmet/marine)) var/obj/item/clothing/head/helmet/marine/H = item_to_stock - if(H.pockets && H.pockets.contents.len) + if(H.pockets && length(H.pockets.contents)) if(user) to_chat(user, SPAN_WARNING("\The [H] has something inside it. Empty it before restocking.")) return FALSE @@ -541,7 +541,7 @@ GLOBAL_LIST_EMPTY(vending_products) var/turf/target_turf = get_appropriate_vend_turf(user) if(vend_flags & VEND_CLUTTER_PROTECTION) - if(target_turf.contents.len > 25) + if(length(target_turf.contents) > 25) to_chat(usr, SPAN_WARNING("The floor is too cluttered, make some space.")) vend_fail() return FALSE @@ -991,7 +991,7 @@ GLOBAL_LIST_EMPTY(vending_products) tmp_list += list(list(initial(IBP.box.name), floor(L[2] / IBP.items_in_box), IBP.box, VENDOR_ITEM_REGULAR)) //Putting Ammo and other boxes on the bottom of the list as per player preferences - if(tmp_list.len > 0) + if(length(tmp_list) > 0) listed_products += list(list("BOXES", -1, null, null)) for(var/list/L as anything in tmp_list) listed_products += list(L) diff --git a/code/game/machinery/vending/vending.dm b/code/game/machinery/vending/vending.dm index 8629ce2bb2be..a05245e4b185 100644 --- a/code/game/machinery/vending/vending.dm +++ b/code/game/machinery/vending/vending.dm @@ -728,7 +728,7 @@ GLOBAL_LIST_EMPTY_TYPED(total_vending_machines, /obj/structure/machinery/vending var/list/wire_descriptions = get_wire_descriptions() var/list/panel_wires = list() - for(var/wire = 1 to wire_descriptions.len) + for(var/wire = 1 to length(wire_descriptions)) panel_wires += list(list("desc" = wire_descriptions[wire], "cut" = isWireCut(wire))) .["electrical"] = list( @@ -898,7 +898,7 @@ GLOBAL_LIST_EMPTY_TYPED(total_vending_machines, /obj/structure/machinery/vending seconds_electrified-- //Pitch to the people! Really sell it! - if(((last_slogan + slogan_delay) <= world.time) && (slogan_list.len > 0) && (!shut_up) && prob(5)) + if(((last_slogan + slogan_delay) <= world.time) && (length(slogan_list) > 0) && (!shut_up) && prob(5)) var/slogan = pick(slogan_list) speak(slogan) last_slogan = world.time diff --git a/code/game/machinery/vending/vendor_types/dress.dm b/code/game/machinery/vending/vendor_types/dress.dm index 68809c10003f..6a4e76cda49c 100644 --- a/code/game/machinery/vending/vendor_types/dress.dm +++ b/code/game/machinery/vending/vendor_types/dress.dm @@ -197,11 +197,11 @@ if(findtext("[path]", item)) matches += path - if(matches.len==0) + if(length(matches)==0) return var/obj/item/chosen - if(matches.len==1) + if(length(matches)==1) chosen = matches[1] else //If we have multiple options, let them select which one they meant diff --git a/code/game/machinery/vending/vendor_types/requisitions.dm b/code/game/machinery/vending/vendor_types/requisitions.dm index f76b86228c61..1b35cbe238d2 100644 --- a/code/game/machinery/vending/vendor_types/requisitions.dm +++ b/code/game/machinery/vending/vendor_types/requisitions.dm @@ -438,13 +438,13 @@ //Marine armor handling if(istype(item_to_stock, /obj/item/clothing/suit/storage/marine)) var/obj/item/clothing/suit/storage/marine/AR = item_to_stock - if(AR.pockets && AR.pockets.contents.len) + if(AR.pockets && length(AR.pockets.contents)) to_chat(user, SPAN_WARNING("\The [AR] has something inside it. Empty it before restocking.")) return //Marine helmet handling else if(istype(item_to_stock, /obj/item/clothing/head/helmet/marine)) var/obj/item/clothing/head/helmet/marine/H = item_to_stock - if(H.pockets && H.pockets.contents.len) + if(H.pockets && length(H.pockets.contents)) to_chat(user, SPAN_WARNING("\The [H] has something inside it. Empty it before restocking.")) return diff --git a/code/game/machinery/washing_machine.dm b/code/game/machinery/washing_machine.dm index e32d4091c16e..1214b141da15 100644 --- a/code/game/machinery/washing_machine.dm +++ b/code/game/machinery/washing_machine.dm @@ -131,7 +131,7 @@ to_chat(user, "This item does not fit.") return - if(contents.len < 5) + if(length(contents) < 5) if ( state in list(1, 3) ) if(user.drop_inv_item_to_loc(W, src)) state = 3 diff --git a/code/game/objects/effects/decals/cleanable/blood/blood.dm b/code/game/objects/effects/decals/cleanable/blood/blood.dm index 918797608b7b..9fd5e79965af 100644 --- a/code/game/objects/effects/decals/cleanable/blood/blood.dm +++ b/code/game/objects/effects/decals/cleanable/blood/blood.dm @@ -112,7 +112,7 @@ /obj/effect/decal/cleanable/blood/writing/New() ..() - if(random_icon_states.len) + if(length(random_icon_states)) for(var/obj/effect/decal/cleanable/blood/writing/W in loc) random_icon_states.Remove(W.icon_state) icon_state = pick(random_icon_states) diff --git a/code/game/objects/effects/decals/posters.dm b/code/game/objects/effects/decals/posters.dm index 23f7b8c5296a..f13244cbc058 100644 --- a/code/game/objects/effects/decals/posters.dm +++ b/code/game/objects/effects/decals/posters.dm @@ -10,7 +10,7 @@ /obj/item/poster/New(turf/loc, given_serial = 0) if(given_serial == 0) - serial_number = rand(1, GLOB.poster_designs.len) + serial_number = rand(1, length(GLOB.poster_designs)) else serial_number = given_serial name += " - No. [serial_number]" @@ -33,7 +33,7 @@ serial_number = serial if(!isnum(serial_number)) - serial_number = rand(1, GLOB.poster_designs.len) + serial_number = rand(1, length(GLOB.poster_designs)) var/designtype = GLOB.poster_designs[serial_number] var/datum/poster/design=new designtype diff --git a/code/game/objects/effects/effect_system/chemsmoke.dm b/code/game/objects/effects/effect_system/chemsmoke.dm index eea302f29325..1b22ed6054eb 100644 --- a/code/game/objects/effects/effect_system/chemsmoke.dm +++ b/code/game/objects/effects/effect_system/chemsmoke.dm @@ -70,7 +70,7 @@ smokeFlow(location, targetTurfs, wallList) //set the density of the cloud - for diluting reagents - density = max(1, targetTurfs.len / 4) //clamp the cloud density minimum to 1 so it cant multiply the reagents + density = max(1, length(targetTurfs) / 4) //clamp the cloud density minimum to 1 so it cant multiply the reagents //Admin messaging var/contained = "" @@ -110,7 +110,7 @@ return //reagent application - only run if there are extra reagents in the smoke - if(chemholder.reagents.reagent_list.len) + if(length(chemholder.reagents.reagent_list)) for(var/datum/reagent/R in chemholder.reagents.reagent_list) var/proba = 100 var/runs = 5 @@ -197,7 +197,7 @@ //------------------------------------------ /datum/effect_system/smoke_spread/chem/proc/spawnSmoke(turf/T, icon/I, dist = 1) var/obj/effect/particle_effect/smoke/chem/smoke = new(location) - if(chemholder.reagents.reagent_list.len) + if(length(chemholder.reagents.reagent_list)) chemholder.reagents.copy_to(smoke, chemholder.reagents.total_volume / dist, safety = 1) //copy reagents to the smoke so mob/breathe() can handle inhaling the reagents smoke.icon = I smoke.layer = FLY_LAYER @@ -230,7 +230,7 @@ pending += location - while(pending.len) + while(length(pending)) for(var/turf/current in pending) for(var/D in GLOB.cardinals) var/turf/target = get_step(current, D) diff --git a/code/game/objects/effects/glowshroom.dm b/code/game/objects/effects/glowshroom.dm index 58e3b868f7e0..fdb481e0f2bc 100644 --- a/code/game/objects/effects/glowshroom.dm +++ b/code/game/objects/effects/glowshroom.dm @@ -65,7 +65,7 @@ if(direction & i) dirList += i - if(dirList.len) + if(length(dirList)) var/newDir = pick(dirList) if(newDir == 16) floor = 1 diff --git a/code/game/objects/effects/spawners/gibspawner.dm b/code/game/objects/effects/spawners/gibspawner.dm index 77b69f79e86f..a68afc1d42fa 100644 --- a/code/game/objects/effects/spawners/gibspawner.dm +++ b/code/game/objects/effects/spawners/gibspawner.dm @@ -43,7 +43,7 @@ qdel(src) /obj/effect/spawner/gibspawner/proc/Gib(list/viruses = list(), mob/living/ml = null) - if(gibtypes.len != gibamounts.len || gibamounts.len != gibdirections.len) + if(length(gibtypes) != length(gibamounts) || length(gibamounts) != length(gibdirections)) to_world(SPAN_DANGER("Gib list length mismatch!")) return @@ -58,7 +58,7 @@ s.set_up(2, 1, loc) s.start() - for(var/i = 1, i<= gibtypes.len, i++) + for(var/i = 1, i<= length(gibtypes), i++) if(gibamounts[i]) for(var/j = 1, j<= gibamounts[i], j++) var/gibType = gibtypes[i] @@ -72,7 +72,7 @@ gib.update_icon() - if(viruses.len > 0) + if(length(viruses) > 0) for(var/datum/disease/D in viruses) if(prob(virusProb)) var/datum/disease/viruus = D.Copy(1) @@ -80,7 +80,7 @@ viruus.holder = gib var/list/directions = gibdirections[i] - if(directions.len) + if(length(directions)) INVOKE_ASYNC(gib, /obj/effect/decal/cleanable/blood/gibs/proc/streak, directions) diff --git a/code/game/objects/effects/spawners/wo_spawners/supplies.dm b/code/game/objects/effects/spawners/wo_spawners/supplies.dm index 28f9936b972f..f2a502344660 100644 --- a/code/game/objects/effects/spawners/wo_spawners/supplies.dm +++ b/code/game/objects/effects/spawners/wo_spawners/supplies.dm @@ -6,7 +6,7 @@ /obj/effect/landmark/wo_supplies/New() ..() - if(stuff.len) + if(length(stuff)) for(var/s in stuff) var/amt = rand(amount[1], amount[2]) for(var/i = 1, i <= amt, i++) diff --git a/code/game/objects/effects/spiders.dm b/code/game/objects/effects/spiders.dm index 6a5d31010ef1..e22ab2cd1009 100644 --- a/code/game/objects/effects/spiders.dm +++ b/code/game/objects/effects/spiders.dm @@ -144,7 +144,7 @@ //================= if(prob(25)) var/list/nearby = oview(5, src) - if(nearby.len) + if(length(nearby)) var/target_atom = pick(nearby) walk_to(src, target_atom, 5) if(prob(25)) @@ -170,7 +170,7 @@ //================= if(prob(25)) var/list/nearby = oview(5, src) - if(nearby.len) + if(length(nearby)) var/target_atom = pick(nearby) walk_to(src, target_atom, 5) if(prob(25)) diff --git a/code/game/objects/items.dm b/code/game/objects/items.dm index 1a632569eccb..6c354faca0b0 100644 --- a/code/game/objects/items.dm +++ b/code/game/objects/items.dm @@ -244,9 +244,9 @@ cases. Override_icon_state should be a list.*/ var/new_icon_state var/new_protection var/new_item_state - if(override_icon_state && override_icon_state.len) + if(LAZYLEN(override_icon_state)) new_icon_state = override_icon_state[SSmapping.configs[GROUND_MAP].map_name] - if(override_protection && override_protection.len) + if(LAZYLEN(override_protection)) new_protection = override_protection[SSmapping.configs[GROUND_MAP].map_name] switch(SSmapping.configs[GROUND_MAP].camouflage_type) if("snow") diff --git a/code/game/objects/items/ashtray.dm b/code/game/objects/items/ashtray.dm index 540f3ac44e21..7d2dc00a9983 100644 --- a/code/game/objects/items/ashtray.dm +++ b/code/game/objects/items/ashtray.dm @@ -12,7 +12,7 @@ if (health < 1) return if (istype(W,/obj/item/trash/cigbutt) || istype(W,/obj/item/clothing/mask/cigarette) || istype(W, /obj/item/tool/match)) - if (contents.len >= max_butts) + if (length(contents) >= max_butts) to_chat(user, "This ashtray is full.") return var/drop = TRUE @@ -42,10 +42,10 @@ user.update_inv_l_hand(0) user.update_inv_r_hand() add_fingerprint(user) - if (contents.len == max_butts) + if (length(contents) == max_butts) icon_state = icon_full desc = empty_desc + " It's stuffed full." - else if (contents.len > max_butts/2) + else if (length(contents) > max_butts/2) icon_state = icon_half desc = empty_desc + " It's half-filled." else @@ -61,7 +61,7 @@ if (health < 1) die() return - if (contents.len) + if (length(contents)) src.visible_message(SPAN_DANGER("[src] slams into [hit_atom] spilling its contents!")) for (var/obj/item/clothing/mask/cigarette/O in contents) O.forceMove(src.loc) diff --git a/code/game/objects/items/bodybag.dm b/code/game/objects/items/bodybag.dm index 3b84d2433e88..9b0cf37299eb 100644 --- a/code/game/objects/items/bodybag.dm +++ b/code/game/objects/items/bodybag.dm @@ -137,7 +137,7 @@ continue dead_mobs += mob var/mob/living/mob_to_store - if(dead_mobs.len) + if(length(dead_mobs)) mob_to_store = pick(dead_mobs) mob_to_store.forceMove(src) stored_units += mob_size @@ -169,7 +169,7 @@ ..() if(over_object == usr && Adjacent(usr) && !roller_buckled) if(!ishuman(usr)) return - if(contents.len) return 0 + if(length(contents)) return 0 visible_message(SPAN_NOTICE("[usr] folds up [name].")) var/obj/item/I = new item_path(get_turf(src), src) usr.put_in_hands(I) @@ -271,7 +271,7 @@ continue mobs_can_store += H var/mob/living/carbon/human/mob_to_store - if(mobs_can_store.len) + if(length(mobs_can_store)) mob_to_store = pick(mobs_can_store) mob_to_store.forceMove(src) stored_units += mob_size diff --git a/code/game/objects/items/cards_ids.dm b/code/game/objects/items/cards_ids.dm index 31158d055327..80044e2fab3e 100644 --- a/code/game/objects/items/cards_ids.dm +++ b/code/game/objects/items/cards_ids.dm @@ -391,7 +391,7 @@ /obj/item/dogtag/attackby(obj/item/I, mob/user) if(istype(I, /obj/item/dogtag)) var/obj/item/dogtag/D = I - to_chat(user, SPAN_NOTICE("You join the [fallen_names.len>1 ? "tags":"two tags"] together.")) + to_chat(user, SPAN_NOTICE("You join the [length(fallen_names)>1 ? "tags":"two tags"] together.")) name = "information dog tags" if(D.fallen_names) fallen_names += D.fallen_names @@ -404,11 +404,11 @@ /obj/item/dogtag/get_examine_text(mob/user) . = ..() - if(ishuman(user) && fallen_names && fallen_names.len) - var/msg = "There [fallen_names.len>1 ? \ - "are [fallen_names.len] tags.
    They read":\ + if(ishuman(user) && LAZYLEN(fallen_names)) + var/msg = "There [length(fallen_names)>1 ? \ + "are [length(fallen_names)] tags.
    They read":\ "is one ID tag.
    It reads"]:" - for (var/i=1 to fallen_names.len) + for (var/i=1 to length(fallen_names)) msg += "
    [i]. \"[fallen_names[i]] - [fallen_assgns[i]] - [fallen_blood_types[i]]\"" . += SPAN_NOTICE("[msg]") diff --git a/code/game/objects/items/circuitboards/airlock.dm b/code/game/objects/items/circuitboards/airlock.dm index cc6a8e95af0e..07add70280ca 100644 --- a/code/game/objects/items/circuitboards/airlock.dm +++ b/code/game/objects/items/circuitboards/airlock.dm @@ -48,7 +48,7 @@ for (var/acc in accesses) var/aname = get_access_desc(acc) - if (!conf_access || !conf_access.len || !(acc in conf_access)) + if (!LAZYLEN(conf_access) || !(acc in conf_access)) t1 += "[aname]
    " else if(one_access) t1 += "[aname]
    " @@ -107,7 +107,7 @@ conf_access += req else conf_access -= req - if (!conf_access.len) + if (!length(conf_access)) conf_access = null diff --git a/code/game/objects/items/circuitboards/computer.dm b/code/game/objects/items/circuitboards/computer.dm index ecdfba00719d..43215faf0fbb 100644 --- a/code/game/objects/items/circuitboards/computer.dm +++ b/code/game/objects/items/circuitboards/computer.dm @@ -285,7 +285,7 @@ return var/list/tempnetwork = splittext(input, ",") tempnetwork = difflist(tempnetwork,GLOB.RESTRICTED_CAMERA_NETWORKS,1) - if(tempnetwork.len < 1) + if(length(tempnetwork) < 1) to_chat(usr, "No network found please hang up and try your call again.") return network = tempnetwork diff --git a/code/game/objects/items/devices/autopsy_scanner.dm b/code/game/objects/items/devices/autopsy_scanner.dm index 6703ead88147..581336f85337 100644 --- a/code/game/objects/items/devices/autopsy_scanner.dm +++ b/code/game/objects/items/devices/autopsy_scanner.dm @@ -46,7 +46,7 @@ return W /obj/item/device/autopsy_scanner/proc/add_data(obj/limb/O) - if(!O.autopsy_data.len && !O.trace_chemicals.len) return + if(!length(O.autopsy_data) && !length(O.trace_chemicals)) return for(var/V in O.autopsy_data) var/datum/autopsy_data/W = O.autopsy_data[V] @@ -133,7 +133,7 @@ if(30 to 1000) damage_desc = "severe" - if(!total_score) total_score = D.organs_scanned.len + if(!total_score) total_score = length(D.organs_scanned) scan_data += "Weapon #[n]
    " if(damaging_weapon) @@ -149,7 +149,7 @@ n++ - if(chemtraces.len) + if(length(chemtraces)) scan_data += "Trace Chemicals:
    " for(var/chemID in chemtraces) scan_data += chemID diff --git a/code/game/objects/items/devices/clue_scanner.dm b/code/game/objects/items/devices/clue_scanner.dm index d6b6d0d80a25..33cc2ab7d207 100644 --- a/code/game/objects/items/devices/clue_scanner.dm +++ b/code/game/objects/items/devices/clue_scanner.dm @@ -52,4 +52,4 @@ if(!newlyfound) to_chat(user, SPAN_INFO("No new print sets found!")) else - to_chat(user, SPAN_INFO("New print sets found: [newlyfound], total stored amount: [print_list.len]")) + to_chat(user, SPAN_INFO("New print sets found: [newlyfound], total stored amount: [length(print_list)]")) diff --git a/code/game/objects/items/devices/data_detector.dm b/code/game/objects/items/devices/data_detector.dm index fe4b9cde0ab5..27476f7a3872 100644 --- a/code/game/objects/items/devices/data_detector.dm +++ b/code/game/objects/items/devices/data_detector.dm @@ -70,7 +70,7 @@ if(M == loc) continue //device user isn't detected if((isxeno(M) || isyautja(M)) && M.stat == DEAD ) detected = TRUE - else if(ishuman(M) && M.stat == DEAD && M.contents.len) + else if(ishuman(M) && M.stat == DEAD && length(M.contents)) for(var/obj/I in M.contents_twice()) for(var/DT in objects_to_detect) if(istype(I, DT)) diff --git a/code/game/objects/items/devices/radio/radio.dm b/code/game/objects/items/devices/radio/radio.dm index 0c71ae847674..2e693987f99b 100644 --- a/code/game/objects/items/devices/radio/radio.dm +++ b/code/game/objects/items/devices/radio/radio.dm @@ -196,7 +196,7 @@ return radio_connection // Otherwise, if a channel is specified, look for it. - if(channels && channels.len) + if(LAZYLEN(channels)) if (message_mode == RADIO_CHANNEL_DEPARTMENT ) // Department radio shortcut message_mode = channels[1] diff --git a/code/game/objects/items/devices/scanners.dm b/code/game/objects/items/devices/scanners.dm index 778082fc46a4..309c7ff20f8b 100644 --- a/code/game/objects/items/devices/scanners.dm +++ b/code/game/objects/items/devices/scanners.dm @@ -276,7 +276,7 @@ FORENSIC SCANNER if(!QDELETED(O.reagents)) var/dat = "" - if(O.reagents.reagent_list.len > 0) + if(length(O.reagents.reagent_list) > 0) var/one_percent = O.reagents.total_volume / 100 for (var/datum/reagent/R in O.reagents.reagent_list) if(prob(reliability)) @@ -381,7 +381,7 @@ FORENSIC SCANNER /obj/item/device/demo_scanner/proc/scan(obj/O) if(QDELETED(O.reagents)) return - if(O.reagents.reagent_list.len > 0) + if(length(O.reagents.reagent_list) > 0) for(var/datum/reagent/R in O.reagents.reagent_list) dat += SPAN_BLUE("
    [R.name]: [R.volume]u") if(R.explosive) diff --git a/code/game/objects/items/devices/taperecorder.dm b/code/game/objects/items/devices/taperecorder.dm index 8410c72ee831..9521de9a039a 100644 --- a/code/game/objects/items/devices/taperecorder.dm +++ b/code/game/objects/items/devices/taperecorder.dm @@ -67,7 +67,7 @@ if(!playing && !recording) icons_available += list("Record" = image(radial_icon_file,"record")) icons_available += list("Play" = image(radial_icon_file,"play")) - if(canprint && mytape?.storedinfo.len) + if(canprint && length(mytape?.storedinfo)) icons_available += list("Print Transcript" = image(radial_icon_file,"print")) if(playing || recording) @@ -241,7 +241,7 @@ if(playing) return - if(mytape.storedinfo.len < 1) + if(length(mytape.storedinfo) < 1) audible_message(SPAN_MAROON("[icon2html(src, usr)] Tape has no data.")) return @@ -257,7 +257,7 @@ break if(playing == FALSE) break - if(mytape.storedinfo.len < i) + if(length(mytape.storedinfo) < i) audible_message(SPAN_MAROON("[icon2html(src, usr)] End of recording.")) break @@ -265,7 +265,7 @@ langchat_speech(mytape.storedinfo[i], heard, GLOB.all_languages, skip_language_check = TRUE, additional_styles = list("langchat_small")) audible_message(SPAN_MAROON("[icon2html(src, usr)] [mytape.storedinfo[i]]"))//We want to display this properly, don't double encode - if(mytape.storedinfo.len < i + 1) + if(length(mytape.storedinfo) < i + 1) playsleepseconds = 1 sleep(1 SECONDS) else @@ -310,7 +310,7 @@ set name = "Print Transcript" set category = "Object" - if(!mytape.storedinfo.len) + if(!length(mytape.storedinfo)) return if(!can_use(usr)) return @@ -326,7 +326,7 @@ playsound(src, 'sound/items/taperecorder/taperecorder_print.ogg', 50, FALSE) var/obj/item/paper/sheet_of_paper = new /obj/item/paper(get_turf(src)) var/t1 = "Transcript:

    " - for(var/i in 1 to mytape.storedinfo.len) + for(var/i in 1 to length(mytape.storedinfo)) t1 += "[mytape.storedinfo[i]]
    " sheet_of_paper.info = t1 var/tapename = mytape.name diff --git a/code/game/objects/items/devices/teleportation.dm b/code/game/objects/items/devices/teleportation.dm index 8dea3b872cd1..d64e717a3095 100644 --- a/code/game/objects/items/devices/teleportation.dm +++ b/code/game/objects/items/devices/teleportation.dm @@ -156,7 +156,7 @@ if(T.x>world.maxx-8 || T.x<8) continue //putting them at the edge is dumb if(T.y>world.maxy-8 || T.y<8) continue turfs += T - if(turfs.len) + if(length(turfs)) L["None (Dangerous)"] = pick(turfs) var/t1 = tgui_input_list(user, "Please select a teleporter to lock in on.", "Hand Teleporter", L) if ((user.get_active_hand() != src || user.stat || user.is_mob_restrained())) diff --git a/code/game/objects/items/devices/walkman.dm b/code/game/objects/items/devices/walkman.dm index 2bbcb802d426..42c03d757dbd 100644 --- a/code/game/objects/items/devices/walkman.dm +++ b/code/game/objects/items/devices/walkman.dm @@ -95,17 +95,17 @@ /obj/item/device/walkman/proc/play() if(!current_song) - if(current_playlist.len > 0) + if(length(current_playlist) > 0) current_song = sound(current_playlist[pl_index], 0, 0, SOUND_CHANNEL_WALKMAN, volume) current_song.status = SOUND_STREAM else return paused = FALSE if(current_song.status & SOUND_PAUSED) - to_chat(current_listener,SPAN_INFO("Resuming [pl_index] of [current_playlist.len]")) + to_chat(current_listener,SPAN_INFO("Resuming [pl_index] of [length(current_playlist)]")) update_song(current_song,current_listener) else - to_chat(current_listener,SPAN_INFO("Now playing [pl_index] of [current_playlist.len]")) + to_chat(current_listener,SPAN_INFO("Now playing [pl_index] of [length(current_playlist)]")) update_song(current_song,current_listener,0) update_song(current_song,current_listener) @@ -146,11 +146,11 @@ /obj/item/device/walkman/proc/next_song(mob/user) - if(user.is_mob_incapacitated() || current_playlist.len == 0) return + if(user.is_mob_incapacitated() || length(current_playlist) == 0) return break_sound() - if(pl_index + 1 <= current_playlist.len) + if(pl_index + 1 <= length(current_playlist)) pl_index++ else pl_index = 1 diff --git a/code/game/objects/items/explosives/explosive.dm b/code/game/objects/items/explosives/explosive.dm index cac5bd3d0b61..1bd6985bc015 100644 --- a/code/game/objects/items/explosives/explosive.dm +++ b/code/game/objects/items/explosives/explosive.dm @@ -74,13 +74,13 @@ detonator=null assembly_stage = ASSEMBLY_EMPTY icon_state = base_icon_state - else if(containers.len) + else if(length(containers)) for(var/obj/B in containers) if(istype(B)) containers -= B user.put_in_hands(B) current_container_volume = 0 - desc = initial(desc) + "\n Contains [containers.len] containers[detonator?" and detonator":""]" + desc = initial(desc) + "\n Contains [length(containers)] containers[detonator?" and detonator":""]" return cause_data = create_cause_data(initial(name), user) return TRUE @@ -128,11 +128,11 @@ det.forceMove(src) detonator = det assembly_stage = ASSEMBLY_UNLOCKED - desc = initial(desc) + "\n Contains [containers.len] containers[detonator?" and detonator":""]" + desc = initial(desc) + "\n Contains [length(containers)] containers[detonator?" and detonator":""]" update_icon() else if(HAS_TRAIT(W, TRAIT_TOOL_SCREWDRIVER)) if(assembly_stage == ASSEMBLY_UNLOCKED) - if(containers.len) + if(length(containers)) to_chat(user, SPAN_NOTICE("You lock the assembly.")) else to_chat(user, SPAN_NOTICE("You lock the empty assembly.")) @@ -143,7 +143,7 @@ else if(assembly_stage == ASSEMBLY_LOCKED) to_chat(user, SPAN_NOTICE("You unlock the assembly.")) playsound(loc, 'sound/items/Screwdriver.ogg', 25, 0, 6) - desc = initial(desc) + "\n Contains [containers.len] containers[detonator?" and detonator":""]" + desc = initial(desc) + "\n Contains [length(containers)] containers[detonator?" and detonator":""]" assembly_stage = ASSEMBLY_UNLOCKED update_icon() else if(is_type_in_list(W, allowed_containers) && (!assembly_stage || assembly_stage == ASSEMBLY_UNLOCKED)) @@ -161,7 +161,7 @@ containers += W current_container_volume += W.reagents.maximum_volume assembly_stage = ASSEMBLY_UNLOCKED - desc = initial(desc) + "\n Contains [containers.len] containers[detonator?" and detonator":""]" + desc = initial(desc) + "\n Contains [length(containers)] containers[detonator?" and detonator":""]" else to_chat(user, SPAN_DANGER("\the [W] is empty.")) @@ -210,7 +210,7 @@ reagents.source_mob = WEAKREF(cause_mob) msg_admin_niche("[key_name(cause_mob)] detonated custom explosive by [key_name(creator)]: [name] (REAGENTS: [reagent_list_text]) in [get_area(src)] [ADMIN_JMP(loc)]", loc.x, loc.y, loc.z) - if(containers.len < 2) + if(length(containers) < 2) reagents.trigger_volatiles = TRUE //Explode on the first transfer for(var/obj/item/reagent_container/glass/G in containers) diff --git a/code/game/objects/items/frames/camera.dm b/code/game/objects/items/frames/camera.dm index 6b6061df8af0..5283540ea358 100644 --- a/code/game/objects/items/frames/camera.dm +++ b/code/game/objects/items/frames/camera.dm @@ -89,7 +89,7 @@ return var/list/tempnetwork = splittext(input, ",") - if(tempnetwork.len < 1) + if(length(tempnetwork) < 1) to_chat(usr, "No network found please hang up and try your call again.") return @@ -133,7 +133,7 @@ return // Taking out upgrades - else if(HAS_TRAIT(W, TRAIT_TOOL_CROWBAR) && upgrades.len) + else if(HAS_TRAIT(W, TRAIT_TOOL_CROWBAR) && length(upgrades)) var/obj/U = locate(/obj) in upgrades if(U) to_chat(user, "You unattach an upgrade from the assembly.") diff --git a/code/game/objects/items/frames/matrix.dm b/code/game/objects/items/frames/matrix.dm index 3a8464f58568..46d121909068 100644 --- a/code/game/objects/items/frames/matrix.dm +++ b/code/game/objects/items/frames/matrix.dm @@ -18,7 +18,7 @@ /obj/item/frame/matrix_frame/attackby(obj/item/W, mob/user as mob) switch(state) if(ASSEMBLY_EMPTY) - if(istype(W, /obj/item/reagent_container/glass/beaker/vial) && W.reagents.total_volume == 30 && W.reagents.reagent_list.len == 1) + if(istype(W, /obj/item/reagent_container/glass/beaker/vial) && W.reagents.total_volume == 30 && length(W.reagents.reagent_list) == 1) user.drop_held_item(W) W.forceMove(src) state = ASSEMBLY_UNLOCKED @@ -45,7 +45,7 @@ else if(W.reagents.total_volume < 30) to_chat(user, SPAN_WARNING("The testing indicator lights up with red! The container requires to be fully filled!")) return - else if (W.reagents.reagent_list.len > 1) + else if (length(W.reagents.reagent_list) > 1) to_chat(user, SPAN_WARNING("The testing indicator lights up with red! The container requires a pure sample!")) if(ASSEMBLY_UNLOCKED) diff --git a/code/game/objects/items/implants/implantchair.dm b/code/game/objects/items/implants/implantchair.dm index 0969b2609331..bcec5100aae4 100644 --- a/code/game/objects/items/implants/implantchair.dm +++ b/code/game/objects/items/implants/implantchair.dm @@ -38,7 +38,7 @@ var/dat ="Implanter Status
    " dat +="Current occupant: [src.occupant ? "
    Name: [src.occupant]
    Health: [health_text]
    " : "None"]
    " - dat += "Implants: [src.implant_list.len ? "[implant_list.len]" : "Replenish"]
    " + dat += "Implants: [length(src.implant_list) ? "[length(implant_list)]" : "Replenish"]
    " if(src.occupant) dat += "[src.ready ? "Implant" : "Recharging"]
    " user.set_interaction(src) @@ -113,7 +113,7 @@ /obj/structure/machinery/implantchair/proc/implant(mob/M) if (!istype(M, /mob/living/carbon)) return - if(!implant_list.len) return + if(!length(implant_list)) return for(var/obj/item/implant/loyalty/imp in implant_list) if(!imp) continue if(istype(imp, /obj/item/implant/loyalty)) diff --git a/code/game/objects/items/misc.dm b/code/game/objects/items/misc.dm index 8c0f88ddb7ca..d73893e2671c 100644 --- a/code/game/objects/items/misc.dm +++ b/code/game/objects/items/misc.dm @@ -224,7 +224,7 @@ to_chat(user, SPAN_NOTICE("[I] won't fit in [src].")) return - if(contents.len) + if(length(contents)) to_chat(user, SPAN_NOTICE("[src] already has something inside it.")) return @@ -257,7 +257,7 @@ /obj/item/evidencebag/attack_self(mob/user) ..() - if(contents.len) + if(length(contents)) var/obj/item/I = contents[1] user.visible_message("[user] takes [I] out of [src]", "You take [I] out of [src].",\ "You hear someone rustle around in a plastic bag, and remove something.") diff --git a/code/game/objects/items/reagent_containers/autoinjectors.dm b/code/game/objects/items/reagent_containers/autoinjectors.dm index ff830318fda0..9c4726371f90 100644 --- a/code/game/objects/items/reagent_containers/autoinjectors.dm +++ b/code/game/objects/items/reagent_containers/autoinjectors.dm @@ -289,7 +289,7 @@ /obj/item/reagent_container/hypospray/autoinjector/skillless/get_examine_text(mob/user) . = ..() - if(reagents && reagents.reagent_list.len) + if(reagents && length(reagents.reagent_list)) . += SPAN_NOTICE("It is currently loaded.") else if(!uses_left) . += SPAN_NOTICE("It is spent.") diff --git a/code/game/objects/items/reagent_containers/food/condiment.dm b/code/game/objects/items/reagent_containers/food/condiment.dm index 35944e4422c4..45cfe9c2aa67 100644 --- a/code/game/objects/items/reagent_containers/food/condiment.dm +++ b/code/game/objects/items/reagent_containers/food/condiment.dm @@ -88,7 +88,7 @@ /obj/item/reagent_container/food/condiment/on_reagent_change() if(icon_state == "saltshakersmall" || icon_state == "peppermillsmall" || icon_state == "hotsauce_cholula" || icon_state == "hotsauce_franks" || icon_state == "hotsauce_sriracha" || icon_state == "hotsauce_tabasco" || icon_state == "coldsauce_cole") return - if(reagents.reagent_list.len > 0) + if(length(reagents.reagent_list) > 0) switch(reagents.get_master_reagent_id()) if("ketchup") name = "Ketchup" @@ -131,7 +131,7 @@ center_of_mass = "x=16;y=6" else name = "Misc Condiment Bottle" - if (reagents.reagent_list.len==1) + if (length(reagents.reagent_list)==1) desc = "Looks like it is [reagents.get_master_reagent_name()], but you are not sure." else desc = "A mixture of various condiments. [reagents.get_master_reagent_name()] is one of them." diff --git a/code/game/objects/items/reagent_containers/food/drinks/bottle.dm b/code/game/objects/items/reagent_containers/food/drinks/bottle.dm index b522d8d2ed81..75b5aadfc43b 100644 --- a/code/game/objects/items/reagent_containers/food/drinks/bottle.dm +++ b/code/game/objects/items/reagent_containers/food/drinks/bottle.dm @@ -93,7 +93,7 @@ /obj/item/reagent_container/food/drinks/bottle/attackby(obj/item/I, mob/living/user) if(!isGlass || !istype(I, /obj/item/paper)) return ..() - if(!reagents || !reagents.reagent_list.len) + if(!reagents || !length(reagents.reagent_list)) to_chat(user, SPAN_NOTICE("\The [src] is empty...")) return var/alcohol_potency = 0 diff --git a/code/game/objects/items/reagent_containers/food/drinks/drinkingglass.dm b/code/game/objects/items/reagent_containers/food/drinks/drinkingglass.dm index eea71cd1a4bc..59f27ab91728 100644 --- a/code/game/objects/items/reagent_containers/food/drinks/drinkingglass.dm +++ b/code/game/objects/items/reagent_containers/food/drinks/drinkingglass.dm @@ -10,14 +10,14 @@ center_of_mass = "x=16;y=10" /obj/item/reagent_container/food/drinks/drinkingglass/on_reagent_change() - /*if(reagents.reagent_list.len > 1 ) + /*if(length(reagents.reagent_list) > 1 ) icon_state = "glass_brown" name = "Glass of Hooch" desc = "Two or more drinks, mixed together."*/ - /*else if(reagents.reagent_list.len == 1) + /*else if(length(reagents.reagent_list) == 1) for(var/datum/reagent/R in reagents.reagent_list) switch(R.id)*/ - if (reagents.reagent_list.len > 0) + if (length(reagents.reagent_list) > 0) //mrid = R.get_master_reagent_id() var/datum/reagent/R = reagents.get_master_reagent() switch(R.id) diff --git a/code/game/objects/items/reagent_containers/food/drinks/jar.dm b/code/game/objects/items/reagent_containers/food/drinks/jar.dm index 987cfcedca5d..45a5137d0db5 100644 --- a/code/game/objects/items/reagent_containers/food/drinks/jar.dm +++ b/code/game/objects/items/reagent_containers/food/drinks/jar.dm @@ -10,7 +10,7 @@ center_of_mass = "x=15;y=8" /obj/item/reagent_container/food/drinks/jar/on_reagent_change() - if(reagents.reagent_list.len > 0) + if(length(reagents.reagent_list) > 0) icon_state ="jar_what" name = "jar of something" desc = "You can't really tell what this is." diff --git a/code/game/objects/items/reagent_containers/food/sandwich.dm b/code/game/objects/items/reagent_containers/food/sandwich.dm index 9370b643fc98..fd71c20e48ff 100644 --- a/code/game/objects/items/reagent_containers/food/sandwich.dm +++ b/code/game/objects/items/reagent_containers/food/sandwich.dm @@ -26,7 +26,7 @@ if(istype(O,/obj/item/reagent_container/food/snacks/breadslice)) sandwich_limit += 4 - if(src.contents.len > sandwich_limit) + if(length(src.contents) > sandwich_limit) to_chat(user, SPAN_DANGER("If you put anything else on \the [src] it's going to collapse.")) return else if(istype(W,/obj/item/shard)) @@ -56,7 +56,7 @@ i++ if(i == 1) fullname += "[O.name]" - else if(i == ingredients.len) + else if(i == length(ingredients)) fullname += " and [O.name]" else fullname += ", [O.name]" @@ -69,12 +69,12 @@ var/image/T = new(src.icon, "sandwich_top") T.pixel_x = pick(list(-1,0,1)) - T.pixel_y = (ingredients.len * 2)+1 + T.pixel_y = (length(ingredients) * 2)+1 overlays += T name = lowertext("[fullname] sandwich") if(length(name) > 80) name = "[pick(list("absurd","colossal","enormous","ridiculous"))] sandwich" - w_class = ceil(clamp((ingredients.len/2),1,3)) + w_class = ceil(clamp((length(ingredients)/2),1,3)) /obj/item/reagent_container/food/snacks/csandwich/Destroy() QDEL_NULL_LIST(ingredients) @@ -82,7 +82,7 @@ /obj/item/reagent_container/food/snacks/csandwich/get_examine_text(mob/user) . = ..() - if(contents && contents.len) + if(LAZYLEN(contents)) var/obj/item/O = pick(contents) . += SPAN_NOTICE("You think you can see [O.name] in there.") diff --git a/code/game/objects/items/reagent_containers/food/snacks.dm b/code/game/objects/items/reagent_containers/food/snacks.dm index 09b4379e7bb7..4e00f32a9b13 100644 --- a/code/game/objects/items/reagent_containers/food/snacks.dm +++ b/code/game/objects/items/reagent_containers/food/snacks.dm @@ -2755,10 +2755,10 @@ // Set appropriate description if( open && pizza ) desc = "A box suited for pizzas. It appears to have a [pizza.name] inside." - else if( boxes.len > 0 ) - desc = "A pile of boxes suited for pizzas. There appears to be [boxes.len + 1] boxes in the pile." + else if( length(boxes) > 0 ) + desc = "A pile of boxes suited for pizzas. There appears to be [length(boxes) + 1] boxes in the pile." - var/obj/item/pizzabox/topbox = boxes[boxes.len] + var/obj/item/pizzabox/topbox = boxes[length(boxes)] var/toptag = topbox.boxtag if( toptag != "" ) desc = "[desc] The box on top has a tag, it reads: '[toptag]'." @@ -2784,8 +2784,8 @@ else // Stupid code because byondcode sucks var/doimgtag = 0 - if( boxes.len > 0 ) - var/obj/item/pizzabox/topbox = boxes[boxes.len] + if( length(boxes) > 0 ) + var/obj/item/pizzabox/topbox = boxes[length(boxes)] if( topbox.boxtag != "" ) doimgtag = 1 else @@ -2794,10 +2794,10 @@ if( doimgtag ) var/image/tagimg = image("food.dmi", icon_state = "pizzabox_tag") - tagimg.pixel_y = boxes.len * 3 + tagimg.pixel_y = length(boxes) * 3 overlays += tagimg - icon_state = "pizzabox[boxes.len+1]" + icon_state = "pizzabox[length(boxes)+1]" /obj/item/pizzabox/attack_hand( mob/user as mob ) @@ -2809,12 +2809,12 @@ update_icon() return - if( boxes.len > 0 ) + if( length(boxes) > 0 ) if( user.get_inactive_hand() != src ) ..() return - var/obj/item/pizzabox/box = boxes[boxes.len] + var/obj/item/pizzabox/box = boxes[length(boxes)] boxes -= box user.put_in_hands( box ) @@ -2847,7 +2847,7 @@ for(var/obj/item/pizzabox/i in box.boxes) boxestoadd += i - if( (boxes.len+1) + boxestoadd.len <= 5 ) + if( (length(boxes)+1) + length(boxestoadd) <= 5 ) user.drop_inv_item_to_loc(box, src) box.boxes = list() // Clear the box boxes so we don't have boxes inside boxes. - Xzibit src.boxes.Add( boxestoadd ) @@ -2884,8 +2884,8 @@ var/t = stripped_input(user,"Enter what you want to add to the tag:", "Write", "", 30) var/obj/item/pizzabox/boxtotagto = src - if( boxes.len > 0 ) - boxtotagto = boxes[boxes.len] + if( length(boxes) > 0 ) + boxtotagto = boxes[length(boxes)] boxtotagto.boxtag = "[boxtotagto.boxtag][t]" playsound(src, "paper_writing", 15, TRUE) diff --git a/code/game/objects/items/reagent_containers/food/snacks/grown.dm b/code/game/objects/items/reagent_containers/food/snacks/grown.dm index 68b617d6a476..55ed8c8d34f0 100644 --- a/code/game/objects/items/reagent_containers/food/snacks/grown.dm +++ b/code/game/objects/items/reagent_containers/food/snacks/grown.dm @@ -591,7 +591,7 @@ if(T.x>world.maxx-outer_teleport_radius || T.xworld.maxy-outer_teleport_radius || T.yConstructions from []Amount Left: []
    ", src, src.amount) - for(var/i = 1; i <= recipe_list.len, i++) + for(var/i = 1; i <= length(recipe_list), i++) var/E = recipe_list[i] if(isnull(E)) t1 += "
    " diff --git a/code/game/objects/items/storage/belt.dm b/code/game/objects/items/storage/belt.dm index 23f8c884f41c..d68dc4dea753 100644 --- a/code/game/objects/items/storage/belt.dm +++ b/code/game/objects/items/storage/belt.dm @@ -1084,11 +1084,11 @@ if(ammo_dumping.flags_magazine & AMMUNITION_HANDFUL_BOX) var/handfuls = round(ammo_dumping.current_rounds / amount_to_dump, 1) //The number of handfuls, we round up because we still want the last one that isn't full if(ammo_dumping.current_rounds != 0) - if(contents.len < storage_slots - 1) //this is because it's a gunbelt and the final slot is reserved for the gun + if(length(contents) < storage_slots - 1) //this is because it's a gunbelt and the final slot is reserved for the gun to_chat(user, SPAN_NOTICE("You start refilling [src] with [ammo_dumping].")) if(!do_after(user, 1.5 SECONDS, INTERRUPT_ALL, BUSY_ICON_GENERIC)) return for(var/i = 1 to handfuls) - if(contents.len < storage_slots - 1) + if(length(contents) < storage_slots - 1) var/obj/item/ammo_magazine/handful/new_handful = new /obj/item/ammo_magazine/handful var/transferred_handfuls = min(ammo_dumping.current_rounds, amount_to_dump) new_handful.generate_handful(ammo_dumping.default_ammo, ammo_dumping.caliber, amount_to_dump, transferred_handfuls, ammo_dumping.gun_type) @@ -1383,7 +1383,7 @@ set name = "Detach revolver holster" set src in usr if(ishuman(usr)) - if(contents.len) + if(length(contents)) to_chat(usr, SPAN_WARNING("The belt needs to be fully empty to remove the holster!")) return to_chat(usr, SPAN_NOTICE("You detach the holster from the belt.")) diff --git a/code/game/objects/items/storage/firstaid.dm b/code/game/objects/items/storage/firstaid.dm index f9f5983c925d..52fd50e9b022 100644 --- a/code/game/objects/items/storage/firstaid.dm +++ b/code/game/objects/items/storage/firstaid.dm @@ -383,7 +383,7 @@ /obj/item/storage/pill_bottle/get_examine_text(mob/user) . = ..() - var/pills_amount = contents.len + var/pills_amount = length(contents) if(pills_amount) var/percentage_filled = floor(pills_amount/max_storage_space * 100) switch(percentage_filled) @@ -409,7 +409,7 @@ if(skilllock && !skillcheck(user, SKILL_MEDICAL, SKILL_MEDICAL_MEDIC)) error_idlock(user) return - if(contents.len) + if(length(contents)) var/obj/item/I = contents[1] if(user.put_in_inactive_hand(I)) playsound(loc, use_sound, 10, TRUE, 3) @@ -464,7 +464,7 @@ if(C.is_mob_restrained()) to_chat(user, SPAN_WARNING("You are restrained!")) return FALSE - if(!contents.len) + if(!length(contents)) to_chat(user, SPAN_WARNING("The [name] is empty.")) return FALSE var/obj/item/I = contents[1] diff --git a/code/game/objects/items/storage/large_holster.dm b/code/game/objects/items/storage/large_holster.dm index 220bf4e86d1e..02983e1552ed 100644 --- a/code/game/objects/items/storage/large_holster.dm +++ b/code/game/objects/items/storage/large_holster.dm @@ -332,7 +332,7 @@ /obj/item/storage/large_holster/fuelpack/get_examine_text(mob/user) . = ..() - if(contents.len) + if(length(contents)) . += "It is storing a M240-T incinerator unit." if (get_dist(user, src) <= 1) if(fuel) diff --git a/code/game/objects/items/storage/misc.dm b/code/game/objects/items/storage/misc.dm index e8da7936ddb6..c3fd647853d6 100644 --- a/code/game/objects/items/storage/misc.dm +++ b/code/game/objects/items/storage/misc.dm @@ -30,7 +30,7 @@ to_chat(user, message) open = !open update_icon() - if(!contents.len) + if(!length(contents)) ..() return @@ -100,7 +100,7 @@ new /obj/item/reagent_container/food/drinks/cans/aspen(src) /obj/item/storage/beer_pack/update_icon() - if(contents.len == 1) + if(length(contents) == 1) var/turf/T = get_turf(src) var/obj/item/reagent_container/food/drinks/cans/aspen/B = new(T) if(ishuman(loc)) @@ -109,7 +109,7 @@ H.put_in_inactive_hand(B) qdel(src) else - icon_state = "6_pack_[contents.len]" + icon_state = "6_pack_[length(contents)]" /obj/item/storage/box/clf name = "D18-storing box" diff --git a/code/game/objects/items/storage/pouch.dm b/code/game/objects/items/storage/pouch.dm index 7fa32cc21eaa..63516ac20aa0 100644 --- a/code/game/objects/items/storage/pouch.dm +++ b/code/game/objects/items/storage/pouch.dm @@ -871,13 +871,13 @@ inner = new /obj/item/reagent_container/glass/pressurized_canister() //Only add an autoinjector if the canister is empty //Important for the snowflake /obj/item/storage/pouch/pressurized_reagent_canister/oxycodone - if(contents.len == 0) + if(length(contents) == 0) new /obj/item/reagent_container/hypospray/autoinjector/empty/medic(src) update_icon() /obj/item/storage/pouch/pressurized_reagent_canister/proc/fill_with(ragent) inner.reagents.add_reagent(ragent, inner.volume) - if(contents.len > 0) + if(length(contents) > 0) var/obj/item/reagent_container/hypospray/autoinjector/empty/A = contents[1] A.reagents.add_reagent(ragent, A.volume) A.update_uses_left() @@ -903,7 +903,7 @@ inner.reagents.add_reagent("adrenaline", inner.volume/3) inner.reagents.add_reagent("inaprovaline", inner.volume/3) inner.reagents.add_reagent("tricordrazine", inner.volume/3) - if(contents.len > 0) + if(length(contents) > 0) var/obj/item/reagent_container/hypospray/autoinjector/empty/medic/A = contents[1] A.reagents.add_reagent("adrenaline", A.volume/3) A.reagents.add_reagent("inaprovaline", A.volume/3) @@ -973,7 +973,7 @@ var/obj/O = target - if(!O.reagents || O.reagents.reagent_list.len < 1) + if(!O.reagents || length(O.reagents.reagent_list) < 1) to_chat(user, SPAN_WARNING("[O] is empty!")) return @@ -986,7 +986,7 @@ O.reagents.trans_to(inner, amt_to_remove) //Refill our autoinjector - if(contents.len > 0) + if(length(contents) > 0) fill_autoinjector(contents[1]) //Top up our inner reagent canister after filling up the injector @@ -1032,14 +1032,14 @@ //returns a text listing the reagents (and their volume) in the atom. Used by Attack logs for reagents in pills /obj/item/storage/pouch/pressurized_reagent_canister/proc/get_reagent_list_text() - if(inner && inner.reagents && inner.reagents.reagent_list && inner.reagents.reagent_list.len) + if(inner && inner.reagents && LAZYLEN(inner.reagents.reagent_list)) var/datum/reagent/R = inner.reagents.reagent_list[1] . = "[R.name]([R.volume]u)" - if(inner.reagents.reagent_list.len < 2) + if(length(inner.reagents.reagent_list) < 2) return - for(var/i in 2 to inner.reagents.reagent_list.len) + for(var/i in 2 to length(inner.reagents.reagent_list)) R = inner.reagents.reagent_list[i] if(!R) diff --git a/code/game/objects/items/storage/storage.dm b/code/game/objects/items/storage/storage.dm index 7b616b275793..047163713e80 100644 --- a/code/game/objects/items/storage/storage.dm +++ b/code/game/objects/items/storage/storage.dm @@ -366,7 +366,7 @@ GLOBAL_LIST_EMPTY_TYPED(item_storage_box_cache, /datum/item_storage_box) //This proc determins the size of the inventory to be displayed. Please touch it only if you know what you're doing. /obj/item/storage/proc/orient2hud() - var/adjusted_contents = contents.len + var/adjusted_contents = length(contents) //Numbered contents display var/list/datum/numbered_display/numbered_contents @@ -396,7 +396,7 @@ GLOBAL_LIST_EMPTY_TYPED(item_storage_box_cache, /datum/item_storage_box) ///Returns TRUE if there is room for the given item. W_class_override allows checking for just a generic W_class, meant for checking shotgun handfuls without having to spawn and delete one just to check. /obj/item/storage/proc/has_room(obj/item/new_item, W_class_override = null) - if(storage_slots != null && contents.len < storage_slots) + if(storage_slots != null && length(contents) < storage_slots) return TRUE //At least one open slot. //calculate storage space only for containers that don't have slots if (storage_slots == null) @@ -458,7 +458,7 @@ GLOBAL_LIST_EMPTY_TYPED(item_storage_box_cache, /datum/item_storage_box) return var/w_limit_bypassed = 0 - if(bypass_w_limit.len) + if(length(bypass_w_limit)) for(var/A in bypass_w_limit) if(istype(W, A)) w_limit_bypassed = 1 @@ -585,7 +585,7 @@ W is always an item. stop_warning prevents messaging. user may be null.**/ if(storage_flags & STORAGE_USING_FIFO_DRAWING) I = contents[1] else - I = contents[contents.len] + I = contents[length(contents)] I.attack_hand(user) else open(user) @@ -707,7 +707,7 @@ W is always an item. stop_warning prevents messaging. user may be null.**/ if(storage_flags & STORAGE_USING_FIFO_DRAWING) item_obj = contents[1] else - item_obj = contents[contents.len] + item_obj = contents[length(contents)] if(!istype(item_obj)) return remove_from_storage(item_obj, tile) @@ -725,11 +725,11 @@ W is always an item. stop_warning prevents messaging. user may be null.**/ if(ammo_dumping.flags_magazine & AMMUNITION_HANDFUL_BOX) var/handfuls = round(ammo_dumping.current_rounds / amount_to_dump, 1) //The number of handfuls, we round up because we still want the last one that isn't full if(ammo_dumping.current_rounds != 0) - if(contents.len < storage_slots) + if(length(contents) < storage_slots) to_chat(user, SPAN_NOTICE("You start refilling [src] with [ammo_dumping].")) if(!do_after(user, 1.5 SECONDS, INTERRUPT_ALL, BUSY_ICON_GENERIC)) return for(var/i = 1 to handfuls) - if(contents.len < storage_slots) + if(length(contents) < storage_slots) //Hijacked from /obj/item/ammo_magazine/proc/create_handful because it had to be handled differently //All this because shell types are instances and not their own objects :) @@ -754,7 +754,7 @@ W is always an item. stop_warning prevents messaging. user may be null.**/ if(user.action_busy) return - if(!origin_storage.contents.len) + if(!length(origin_storage.contents)) to_chat(user, SPAN_WARNING("[origin_storage] is empty.")) return if(!has_room(origin_storage.contents[1])) //Does it have room for the first item to be inserted? @@ -857,7 +857,7 @@ W is always an item. stop_warning prevents messaging. user may be null.**/ ..() //Clicking on itself will empty it, if it has contents and the verb to do that. Contents but no verb means nothing happens. - if(contents.len) + if(length(contents)) empty(user) return diff --git a/code/game/objects/items/storage/surgical_tray.dm b/code/game/objects/items/storage/surgical_tray.dm index 16c0d1352961..61f56c35b555 100644 --- a/code/game/objects/items/storage/surgical_tray.dm +++ b/code/game/objects/items/storage/surgical_tray.dm @@ -34,7 +34,7 @@ new /obj/item/tool/surgery/synthgraft(src) /obj/item/storage/surgical_tray/update_icon() - if(!contents.len) + if(!length(contents)) icon_state = "surgical_tray_e" else icon_state = "surgical_tray" diff --git a/code/game/objects/items/tools/experimental_tools.dm b/code/game/objects/items/tools/experimental_tools.dm index fc58f95909c9..140a05a534b7 100644 --- a/code/game/objects/items/tools/experimental_tools.dm +++ b/code/game/objects/items/tools/experimental_tools.dm @@ -379,5 +379,5 @@ arms_to_damage -= l_arm if(r_arm.status & LIMB_DESTROYED) arms_to_damage -= r_arm - if(arms_to_damage.len) + if(length(arms_to_damage)) human_to_damage.apply_damage(3, BRUTE, pick(arms_to_damage)) diff --git a/code/game/objects/items/tools/extinguisher.dm b/code/game/objects/items/tools/extinguisher.dm index cdd7f31f19f0..723d34c64f7e 100644 --- a/code/game/objects/items/tools/extinguisher.dm +++ b/code/game/objects/items/tools/extinguisher.dm @@ -153,7 +153,7 @@ var/list/unpicked_targets = list() for(var/a in 0 to (EXTINGUISHER_WATER_USE_AMT-1)) - if (!unpicked_targets.len) + if (!length(unpicked_targets)) unpicked_targets += targets var/turf/TT = pick(unpicked_targets) unpicked_targets -= TT diff --git a/code/game/objects/items/weapons/weaponry.dm b/code/game/objects/items/weapons/weaponry.dm index 89f5d2186271..6e94961de15e 100644 --- a/code/game/objects/items/weapons/weaponry.dm +++ b/code/game/objects/items/weapons/weaponry.dm @@ -248,7 +248,7 @@ showname = "." var/used_verb = "attacked" - if(attack_verb && attack_verb.len) + if(LAZYLEN(attack_verb)) used_verb = pick(attack_verb) user.visible_message(SPAN_DANGER("[M] has been [used_verb] with [src][showname]."),\ SPAN_DANGER("You [used_verb] [M] with [src]."), null, 5) diff --git a/code/game/objects/structures/bedsheet_bin.dm b/code/game/objects/structures/bedsheet_bin.dm index a4666c633aae..ed18c28de6f7 100644 --- a/code/game/objects/structures/bedsheet_bin.dm +++ b/code/game/objects/structures/bedsheet_bin.dm @@ -128,8 +128,8 @@ LINEN BINS amount-- var/obj/item/bedsheet/B - if(sheets.len > 0) - B = sheets[sheets.len] + if(length(sheets) > 0) + B = sheets[length(sheets)] sheets.Remove(B) else diff --git a/code/game/objects/structures/bookcase.dm b/code/game/objects/structures/bookcase.dm index a6fc95fa0d73..56b69e4a32a4 100644 --- a/code/game/objects/structures/bookcase.dm +++ b/code/game/objects/structures/bookcase.dm @@ -54,7 +54,7 @@ ..() /obj/structure/bookcase/attack_hand(mob/user as mob) - if(contents.len) + if(length(contents)) var/obj/item/book/choice = input("Which book would you like to remove from the shelf?") as null|obj in contents if(choice) if(user.is_mob_incapacitated() || !in_range(loc, user)) @@ -84,8 +84,8 @@ return /obj/structure/bookcase/update_icon() - if(contents.len < 5) - icon_state = "book-[contents.len]" + if(length(contents) < 5) + icon_state = "book-[length(contents)]" else icon_state = "book-5" diff --git a/code/game/objects/structures/crates_lockers/largecrate_supplies.dm b/code/game/objects/structures/crates_lockers/largecrate_supplies.dm index 9ff84376a762..28f5f5cb3b81 100644 --- a/code/game/objects/structures/crates_lockers/largecrate_supplies.dm +++ b/code/game/objects/structures/crates_lockers/largecrate_supplies.dm @@ -10,7 +10,7 @@ var/list/T = list() for(var/turf/open/O in range(1)) T += O - if(supply.len) + if(length(supply)) for(var/s in supply) var/amount = supply[s] for(var/i = 1, i <= amount, i++) @@ -92,7 +92,7 @@ /obj/structure/largecrate/supply/Initialize() . = ..() - if(supplies.len) + if(length(supplies)) for(var/s in supplies) var/amount = supplies[s] for(var/i = 1, i <= amount, i++) diff --git a/code/game/objects/structures/morgue.dm b/code/game/objects/structures/morgue.dm index f1717f5bf0f5..c69a570e4923 100644 --- a/code/game/objects/structures/morgue.dm +++ b/code/game/objects/structures/morgue.dm @@ -31,7 +31,7 @@ if(morgue_open) icon_state = "[morgue_type]0" else - if(contents.len > 1) //not counting the morgue tray + if(length(contents) > 1) //not counting the morgue tray icon_state = "[morgue_type]2" else icon_state = "[morgue_type]1" @@ -217,7 +217,7 @@ if(cremating) return - if(contents.len <= 1) //1 because the tray is inside. + if(length(contents) <= 1) //1 because the tray is inside. visible_message(SPAN_DANGER("You hear a hollow crackle.")) else visible_message(SPAN_DANGER("You hear a roar as the crematorium activates.")) diff --git a/code/game/objects/structures/reagent_dispensers.dm b/code/game/objects/structures/reagent_dispensers.dm index aeab625857d5..0dab5e55c004 100644 --- a/code/game/objects/structures/reagent_dispensers.dm +++ b/code/game/objects/structures/reagent_dispensers.dm @@ -34,7 +34,7 @@ . = ..() if(get_dist(user, src) > 2 && user != loc) return . += SPAN_NOTICE("It contains:") - if(reagents && reagents.reagent_list.len) + if(reagents && length(reagents.reagent_list)) for(var/datum/reagent/R in reagents.reagent_list) . += SPAN_NOTICE(" [R.volume] units of [R.name]") else diff --git a/code/game/objects/structures/safe.dm b/code/game/objects/structures/safe.dm index 011fa2a17f48..6cefadd88a12 100644 --- a/code/game/objects/structures/safe.dm +++ b/code/game/objects/structures/safe.dm @@ -124,7 +124,7 @@ FLOOR SAFES dat += "Dial 2: - [tumbler_2_pos] +
    " if(open) dat += "" - for(var/i = contents.len, i>=1, i--) + for(var/i = length(contents), i>=1, i--) var/obj/item/P = contents[i] dat += "" dat += "
    [P.name]
    " diff --git a/code/game/objects/structures/tank_dispenser.dm b/code/game/objects/structures/tank_dispenser.dm index 8df4359aa5f8..129e03b7179c 100644 --- a/code/game/objects/structures/tank_dispenser.dm +++ b/code/game/objects/structures/tank_dispenser.dm @@ -95,7 +95,7 @@ if(href_list["oxygen"]) if(oxygentanks > 0) var/obj/item/tank/oxygen/O - if(oxytanks.len == oxygentanks) + if(length(oxytanks) == oxygentanks) O = oxytanks[1] oxytanks.Remove(O) else @@ -107,7 +107,7 @@ if(href_list["phoron"]) if(phorontanks > 0) var/obj/item/tank/phoron/P - if(platanks.len == phorontanks) + if(length(platanks) == phorontanks) P = platanks[1] platanks.Remove(P) else diff --git a/code/game/sound.dm b/code/game/sound.dm index d63e4a1b0c18..49ccb4eb9331 100644 --- a/code/game/sound.dm +++ b/code/game/sound.dm @@ -407,4 +407,4 @@ set category = "Debug" for(var/sound/S in SoundQuery()) - UNLINT(to_chat(src, "channel#[S.channel]: [S.status] - [S.file] - len=[S.len], wait=[S.wait], offset=[S.offset], repeat=[S.repeat]")) // unlint until spacemandmm suite-1.7 + UNLINT(to_chat(src, "channel#[S.channel]: [S.status] - [S.file] - len=[length(S)], wait=[S.wait], offset=[S.offset], repeat=[S.repeat]")) // unlint until spacemandmm suite-1.7 diff --git a/code/game/supplyshuttle.dm b/code/game/supplyshuttle.dm index c1d0352766a6..c5a675b531d2 100644 --- a/code/game/supplyshuttle.dm +++ b/code/game/supplyshuttle.dm @@ -472,7 +472,7 @@ GLOBAL_DATUM_INIT(supply_controller, /datum/controller/supply, new()) return for(var/pool in base_random_crate_intervals) var/interval = base_random_crate_intervals[pool] - if(interval && iteration % interval == 0 && shoppinglist.len <= 20) + if(interval && iteration % interval == 0 && length(shoppinglist) <= 20) add_random_crates(pool) crate_iteration++ @@ -539,7 +539,7 @@ GLOBAL_DATUM_INIT(supply_controller, /datum/controller/supply, new()) if(istype(A,/mob/living) && !black_market_enabled) return TRUE - for(var/i=1, i<=A.contents.len, i++) + for(var/i=1, i<=length(A.contents), i++) var/atom/B = A.contents[i] if(.(B)) return 1 @@ -560,7 +560,7 @@ GLOBAL_DATUM_INIT(supply_controller, /datum/controller/supply, new()) for(var/atom/movable/movable_atom in area_shuttle) if(istype(movable_atom, /obj/item/paper/manifest)) var/obj/item/paper/manifest/M = movable_atom - if(M.stamped && M.stamped.len) + if(LAZYLEN(M.stamped)) points += points_per_slip //black market points @@ -601,19 +601,19 @@ GLOBAL_DATUM_INIT(supply_controller, /datum/controller/supply, new()) //Buyin /datum/controller/supply/proc/buy() var/area/area_shuttle = shuttle?.get_location_area() - if(!area_shuttle || !shoppinglist.len) + if(!area_shuttle || !length(shoppinglist)) return // Try to find an available turf to place our package var/list/turf/clear_turfs = list() for(var/turf/T in area_shuttle) - if(T.density || T.contents?.len) + if(T.density || LAZYLEN(T.contents)) continue clear_turfs += T for(var/datum/supply_order/order in shoppinglist) // No space! Forget buying, it's no use. - if(!clear_turfs.len) + if(!length(clear_turfs)) shoppinglist.Cut() return @@ -716,7 +716,7 @@ GLOBAL_DATUM_INIT(supply_controller, /datum/controller/supply, new()) Approved by: \ [approvedby] \ # packages: \ - [packages.len] \ + [length(packages)] \

    Contents

    \
      " @@ -1050,11 +1050,11 @@ GLOBAL_DATUM_INIT(supply_controller, /datum/controller/supply, new()) temp = "Invalid Request" temp += "
      Back|Main Menu" - if(GLOB.supply_controller.shoppinglist.len > 20) + if(length(GLOB.supply_controller.shoppinglist) > 20) to_chat(usr, SPAN_DANGER("Current retrieval load has reached maximum capacity.")) return - for(var/i=1, i<=GLOB.supply_controller.requestlist.len, i++) + for(var/i=1, i<=length(GLOB.supply_controller.requestlist), i++) var/datum/supply_order/SO = GLOB.supply_controller.requestlist[i] if(SO.ordernum == ordernum) supply_order = SO @@ -1115,7 +1115,7 @@ GLOBAL_DATUM_INIT(supply_controller, /datum/controller/supply, new()) else if (href_list["rreq"]) var/ordernum = text2num(href_list["rreq"]) temp = "Invalid Request.
      " - for(var/i=1, i<=GLOB.supply_controller.requestlist.len, i++) + for(var/i=1, length(i<=GLOB.supply_controller.requestlist), i++) var/datum/supply_order/SO = GLOB.supply_controller.requestlist[i] if(SO.ordernum == ordernum) GLOB.supply_controller.requestlist.Cut(i,i+1) @@ -1259,7 +1259,7 @@ GLOBAL_DATUM_INIT(supply_controller, /datum/controller/supply, new()) if(!area_shuttle) return for(var/turf/elevator_turfs in area_shuttle) - if(elevator_turfs.density || elevator_turfs.contents?.len) + if(elevator_turfs.density || LAZYLEN(elevator_turfs.contents)) continue clear_turfs |= elevator_turfs var/turf/chosen_turf = pick(clear_turfs) diff --git a/code/game/turfs/turf.dm b/code/game/turfs/turf.dm index 8240f40f8e9b..59a9d6d69315 100644 --- a/code/game/turfs/turf.dm +++ b/code/game/turfs/turf.dm @@ -370,7 +370,7 @@ next_target = initial(current_target.baseturfs) baseturfs = new_baseturfs - created_baseturf_lists[new_baseturfs[new_baseturfs.len]] = new_baseturfs.Copy() + created_baseturf_lists[new_baseturfs[length(new_baseturfs)]] = new_baseturfs.Copy() return new_baseturfs // Creates a new turf @@ -456,14 +456,14 @@ return if(length(baseturfs)) var/list/new_baseturfs = baseturfs.Copy() - var/turf_type = new_baseturfs[max(1, new_baseturfs.len - amount + 1)] + var/turf_type = new_baseturfs[max(1, length(new_baseturfs) - amount + 1)] while(ispath(turf_type, /turf/baseturf_skipover)) amount++ - if(amount > new_baseturfs.len) + if(amount > length(new_baseturfs)) CRASH("The bottomost baseturf of a turf is a skipover [src]([type])") - turf_type = new_baseturfs[max(1, new_baseturfs.len - amount + 1)] - new_baseturfs.len -= min(amount, new_baseturfs.len - 1) // No removing the very bottom - if(new_baseturfs.len == 1) + turf_type = new_baseturfs[max(1, length(new_baseturfs) - amount + 1)] + new_baseturfs.len -= min(amount, length(new_baseturfs) - 1) // No removing the very bottom + if(length(new_baseturfs) == 1) new_baseturfs = new_baseturfs[1] return ChangeTurf(turf_type, new_baseturfs, flags) @@ -774,9 +774,9 @@ GLOBAL_LIST_INIT(blacklisted_automated_baseturfs, typecacheof(list( insert_self_into_baseturfs() var/turf/change_type if(length(new_baseturfs)) - change_type = new_baseturfs[new_baseturfs.len] + change_type = new_baseturfs[length(new_baseturfs)] new_baseturfs.len-- - if(new_baseturfs.len) + if(length(new_baseturfs)) baseturfs += new_baseturfs else change_type = new_baseturfs @@ -817,7 +817,7 @@ GLOBAL_LIST_INIT(blacklisted_automated_baseturfs, typecacheof(list( var/static/list/ignored_atoms = typecacheof(list(/mob/dead, /obj/effect/landmark, /obj/docking_port)) var/list/removable_contents = typecache_filter_list_reverse(GetAllContentsIgnoring(ignore_typecache), ignored_atoms) removable_contents -= src - for(var/i in 1 to removable_contents.len) + for(var/i in 1 to length(removable_contents)) var/thing = removable_contents[i] qdel(thing, force=TRUE) @@ -834,9 +834,9 @@ GLOBAL_LIST_INIT(blacklisted_automated_baseturfs, typecacheof(list( if(depth) var/list/target_baseturfs if(length(copytarget.baseturfs)) - // with default inputs this would be Copy(clamp(2, -INFINITY, baseturfs.len)) + // with default inputs this would be Copy(clamp(2, -INFINITY, length(baseturfs))) // Don't forget a lower index is lower in the baseturfs stack, the bottom is baseturfs[1] - target_baseturfs = copytarget.baseturfs.Copy(clamp(1 + ignore_bottom, 1 + copytarget.baseturfs.len - depth, copytarget.baseturfs.len)) + target_baseturfs = copytarget.baseturfs.Copy(clamp(1 + ignore_bottom, 1 + length(copytarget.baseturfs) - depth, length(copytarget.baseturfs))) else if(!ignore_bottom) target_baseturfs = list(copytarget.baseturfs) if(target_baseturfs) diff --git a/code/game/turfs/walls/wall_icon.dm b/code/game/turfs/walls/wall_icon.dm index 600878ac5963..8552063b586f 100644 --- a/code/game/turfs/walls/wall_icon.dm +++ b/code/game/turfs/walls/wall_icon.dm @@ -31,9 +31,9 @@ overlays += I if(damage) - var/current_dmg_overlay = floor(damage / damage_cap * damage_overlays.len) + 1 - if(current_dmg_overlay > damage_overlays.len) - current_dmg_overlay = damage_overlays.len + var/current_dmg_overlay = floor(damage / damage_cap * length(damage_overlays)) + 1 + if(current_dmg_overlay > length(damage_overlays)) + current_dmg_overlay = length(damage_overlays) damage_overlay = current_dmg_overlay overlays += damage_overlays[damage_overlay] @@ -52,9 +52,9 @@ #undef cur_increment /turf/closed/wall/proc/generate_damage_overlays() - var/alpha_inc = 256 / damage_overlays.len + var/alpha_inc = 256 / length(damage_overlays) - for(var/i = 1; i <= damage_overlays.len; i++) + for(var/i = 1; i <= length(damage_overlays); i++) var/image/img = image(icon = 'icons/turf/walls/walls.dmi', icon_state = "overlay_damage") img.blend_mode = BLEND_MULTIPLY img.appearance_flags = NO_CLIENT_COLOR @@ -118,7 +118,7 @@ var/list/ret = list(NORTHWEST, SOUTHEAST, NORTHEAST, SOUTHWEST) - for(var/i = 1 to ret.len) + for(var/i = 1 to length(ret)) var/dir = ret[i] . = CORNER_NONE if(dir in dirs) diff --git a/code/game/verbs/who.dm b/code/game/verbs/who.dm index a73a3b96e5e4..3a9274dbec62 100644 --- a/code/game/verbs/who.dm +++ b/code/game/verbs/who.dm @@ -188,7 +188,7 @@ dat += "
      Current [category] ([length(listings[category])]):
      \n" for(var/client/entry in listings[category]) dat += "\t[entry.key] is \a [entry.admin_holder.rank]" - if(entry.admin_holder.extra_titles?.len) + if(LAZYLEN(entry.admin_holder.extra_titles)) for(var/srank in entry.admin_holder.extra_titles) dat += " & [srank]" if(CLIENT_IS_STAFF(src)) diff --git a/code/game/world.dm b/code/game/world.dm index 350117eccf7b..bf9534e5f926 100644 --- a/code/game/world.dm +++ b/code/game/world.dm @@ -269,7 +269,7 @@ GLOBAL_LIST_INIT(reboot_sfx, file2list("config/reboot_sfx.txt")) /world/proc/load_tm_message() var/datum/getrev/revdata = GLOB.revdata - if(revdata.testmerge.len) + if(length(revdata.testmerge)) GLOB.current_tms = revdata.GetTestMergeInfo() /world/proc/update_status() diff --git a/code/modules/admin/IsBanned.dm b/code/modules/admin/IsBanned.dm index 85a1028c2296..c7d4b6fbbc53 100644 --- a/code/modules/admin/IsBanned.dm +++ b/code/modules/admin/IsBanned.dm @@ -22,7 +22,7 @@ if(GLOB.admin_datums[ckey] && (GLOB.admin_datums[ckey].rights & R_MOD)) return ..() - if(CONFIG_GET(number/limit_players) && CONFIG_GET(number/limit_players) < GLOB.clients.len) + if(CONFIG_GET(number/limit_players) && CONFIG_GET(number/limit_players) < length(GLOB.clients)) return list("reason"="POP CAPPED", "desc"="\nReason: Server is pop capped at the moment at [CONFIG_GET(number/limit_players)] players. Attempt reconnection in 2-3 minutes.") var/datum/entity/player/P = get_player_from_key(ckey) diff --git a/code/modules/admin/STUI.dm b/code/modules/admin/STUI.dm index 96307cd91b86..0d143f63c8af 100644 --- a/code/modules/admin/STUI.dm +++ b/code/modules/admin/STUI.dm @@ -85,31 +85,31 @@ GLOBAL_DATUM_INIT(STUI, /datum/STUI, new) . = list() .["logs"] = list() if(user.client.admin_holder.rights & R_MOD) - if(attack.len > stui_length+1) - attack.Cut(,attack.len-stui_length) + if(length(attack) > stui_length+1) + attack.Cut(,length(attack)-stui_length) .["logs"][STUI_TEXT_ATTACK] = attack - if(admin.len > stui_length+1) - admin.Cut(,admin.len-stui_length) + if(length(admin) > stui_length+1) + admin.Cut(,length(admin)-stui_length) .["logs"][STUI_TEXT_STAFF] = admin - if(staff.len > stui_length+1) - staff.Cut(,staff.len-stui_length) + if(length(staff) > stui_length+1) + staff.Cut(,length(staff)-stui_length) .["logs"][STUI_TEXT_STAFF_CHAT] = staff - if(ooc.len > stui_length+1) - ooc.Cut(,ooc.len-stui_length) + if(length(ooc) > stui_length+1) + ooc.Cut(,length(ooc)-stui_length) .["logs"][STUI_TEXT_OOC] = ooc if((user.client.admin_holder.rights & R_MOD) || (user.client.admin_holder.rights & R_DEBUG)) - if(game.len > stui_length+1) - game.Cut(,game.len-stui_length) + if(length(game) > stui_length+1) + game.Cut(,length(game)-stui_length) .["logs"][STUI_TEXT_GAME] = game if(user.client.admin_holder.rights & R_DEBUG) - if(debug.len > stui_length+1) - debug.Cut(,debug.len-stui_length) + if(length(debug) > stui_length+1) + debug.Cut(,length(debug)-stui_length) .["logs"][STUI_TEXT_DEBUG] = debug - if(runtime.len > stui_length+1) - runtime.Cut(,runtime.len-stui_length) + if(length(runtime) > stui_length+1) + runtime.Cut(,length(runtime)-stui_length) .["logs"][STUI_TEXT_RUNTIME] = runtime - if(tgui.len > stui_length+1) - tgui.Cut(,tgui.len-stui_length) + if(length(tgui) > stui_length+1) + tgui.Cut(,length(tgui)-stui_length) .["logs"][STUI_TEXT_TGUI] = tgui /client/proc/open_STUI() diff --git a/code/modules/admin/admin.dm b/code/modules/admin/admin.dm index 9fbdcdae1f93..fdd94938ce74 100644 --- a/code/modules/admin/admin.dm +++ b/code/modules/admin/admin.dm @@ -67,7 +67,7 @@ var/savefile/info = new("data/player_saves/[copytext(key, 1, 2)]/[key]/info.sav") var/list/infos info >> infos - if(!infos || !infos.len) return 0 + if(!LAZYLEN(infos)) return 0 else return 1 /datum/admins/proc/player_notes_all(key as text) @@ -179,11 +179,11 @@ if(findtext("[path]", object)) matches += path - if(matches.len==0) + if(length(matches)==0) return var/chosen - if(matches.len==1) + if(length(matches)==1) chosen = matches[1] else chosen = tgui_input_list(usr, "Select an atom type", "Spawn Atom", matches) diff --git a/code/modules/admin/admin_ranks.dm b/code/modules/admin/admin_ranks.dm index 5bb9692b0368..94793f3b9479 100644 --- a/code/modules/admin/admin_ranks.dm +++ b/code/modules/admin/admin_ranks.dm @@ -15,7 +15,7 @@ GLOBAL_LIST_EMPTY(admin_ranks) //list of all ranks with associated rights if(copytext(line,1,2) == "#") continue var/list/List = splittext(line,"+") - if(!List.len) continue + if(!length(List)) continue var/rank = ckeyEx(List[1]) switch(rank) @@ -23,7 +23,7 @@ GLOBAL_LIST_EMPTY(admin_ranks) //list of all ranks with associated rights if("Removed") continue //Reserved var/rights = 0 - for(var/i=2, i<=List.len, i++) + for(var/i=2, i<=length(List), i++) switch(ckey(List[i])) if("@","prev") rights |= previous_rights if("buildmode","build") rights |= R_BUILDMODE @@ -93,7 +93,7 @@ GLOBAL_LIST_EMPTY(admin_ranks) //list of all ranks with associated rights //Split the line at every "-" var/list/List = splittext(line, "-") - if(!List.len) return + if(!length(List)) return //ckey is before the first "-" var/ckey = ckey(List[1]) @@ -101,11 +101,11 @@ GLOBAL_LIST_EMPTY(admin_ranks) //list of all ranks with associated rights //rank follows the first "-" var/rank = "" - if(List.len >= 2) + if(length(List) >= 2) rank = ckeyEx(List[2]) var/list/extra_titles = list() - if(List.len >= 3) + if(length(List) >= 3) extra_titles = List.Copy(3) if(mentor) diff --git a/code/modules/admin/callproc.dm b/code/modules/admin/callproc.dm index 36ed859a210f..72e4f792607d 100644 --- a/code/modules/admin/callproc.dm +++ b/code/modules/admin/callproc.dm @@ -140,7 +140,7 @@ GLOBAL_PROTECT(LastAdminCalledProc) if (!length(proclist)) return - var/procname = proclist[proclist.len] + var/procname = proclist[length(proclist)] var/proctype = ("verb" in proclist) ? "verb" :"proc" if(targetselected) @@ -161,15 +161,15 @@ GLOBAL_PROTECT(LastAdminCalledProc) if(!target) to_chat(usr, "Error: callproc(): owner of proc no longer exists.", confidential = TRUE) return - var/msg = "[key_name(src)] called [target]'s [procname]() with [lst.len ? "the arguments [list2params(lst)]":"no arguments"]." + var/msg = "[key_name(src)] called [target]'s [procname]() with [length(lst) ? "the arguments [list2params(lst)]":"no arguments"]." log_admin(msg) message_admins(msg) //Proccall announce removed. admin_ticket_log(target, msg) returnval = WrapAdminProcCall(target, procname, 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. - log_admin("[key_name(src)] called [procname]() with [lst.len ? "the arguments [list2params(lst)]":"no arguments"].") - message_admins("[key_name(src)] called [procname]() with [lst.len ? "the arguments [list2params(lst)]":"no arguments"].") //Proccall announce removed. + log_admin("[key_name(src)] called [procname]() with [length(lst) ? "the arguments [list2params(lst)]":"no arguments"].") + message_admins("[key_name(src)] called [procname]() with [length(lst) ? "the arguments [list2params(lst)]":"no arguments"].") //Proccall announce removed. returnval = WrapAdminProcCall(GLOBAL_PROC, procname, lst) // Pass the lst as an argument list to the proc if(get_retval) get_retval += returnval @@ -251,8 +251,8 @@ GLOBAL_PROTECT(LastAdminCalledProc) if(!called_datum || !is_valid_src(called_datum)) to_chat(usr, SPAN_WARNING("Error: callproc_datum(): owner of proc no longer exists."), confidential = TRUE) return - log_admin("[key_name(src)] called [called_datum]'s [procname]() with [lst.len ? "the arguments [list2params(lst)]":"no arguments"].") - var/msg = "[key_name(src)] called [called_datum]'s [procname]() with [lst.len ? "the arguments [list2params(lst)]":"no arguments"]." + log_admin("[key_name(src)] called [called_datum]'s [procname]() with [length(lst) ? "the arguments [list2params(lst)]":"no arguments"].") + var/msg = "[key_name(src)] called [called_datum]'s [procname]() with [length(lst) ? "the arguments [list2params(lst)]":"no arguments"]." message_admins(msg) admin_ticket_log(called_datum, msg) @@ -285,7 +285,7 @@ GLOBAL_PROTECT(LastAdminCalledProc) if(islist(returnval)) var/list/returnedlist = returnval . = "" - if(returnedlist.len) + if(length(returnedlist)) var/assoc_check = returnedlist[1] if(istext(assoc_check) && (returnedlist[assoc_check] != null)) . += "[procname] returned an associative list:" diff --git a/code/modules/admin/medal_panel/medals_panel_tgui.dm b/code/modules/admin/medal_panel/medals_panel_tgui.dm index 49c4bb5f96ad..253f08efd68f 100644 --- a/code/modules/admin/medal_panel/medals_panel_tgui.dm +++ b/code/modules/admin/medal_panel/medals_panel_tgui.dm @@ -25,14 +25,14 @@ GLOBAL_DATUM_INIT(medals_panel, /datum/medals_panel_tgui, new) var/datum/recipient_awards/recipient_award = GLOB.medal_awards[recipient_name] uscm_awards[recipient_name] = list() uscm_award_ckeys[recipient_name] = recipient_award.recipient_ckey ? " ([recipient_award.recipient_ckey])" : "" - for(var/i in 1 to recipient_award.medal_names.len) // We're assuming everything is same length + for(var/i in 1 to length(recipient_award.medal_names)) // We're assuming everything is same length uscm_awards[recipient_name] += "[recipient_award.medal_names[i]]: \'[recipient_award.medal_citations[i]]\' by [recipient_award.giver_rank[i] ? "[recipient_award.giver_rank[i]] " : ""][recipient_award.giver_name[i] ? "[recipient_award.giver_name[i]] " : ""]([recipient_award.giver_ckey[i]])." for(var/recipient_name as anything in GLOB.jelly_awards) var/datum/recipient_awards/recipient_award = GLOB.jelly_awards[recipient_name] xeno_awards[recipient_name] = list() xeno_award_ckeys[recipient_name] = recipient_award.recipient_ckey ? " ([recipient_award.recipient_ckey])" : "" - for(var/i in 1 to recipient_award.medal_names.len) // We're assuming everything is same length + for(var/i in 1 to length(recipient_award.medal_names)) // We're assuming everything is same length xeno_awards[recipient_name] += "[recipient_award.medal_names[i]]: \'[recipient_award.medal_citations[i]]\' by [recipient_award.giver_rank[i] ? "[recipient_award.giver_rank[i]] " : ""][recipient_award.giver_name[i] ? "[recipient_award.giver_name[i]] " : ""]([recipient_award.giver_ckey[i]])." data["uscm_awards"] = uscm_awards diff --git a/code/modules/admin/player_notes.dm b/code/modules/admin/player_notes.dm index d8caa58f1e97..31e43cb26a93 100644 --- a/code/modules/admin/player_notes.dm +++ b/code/modules/admin/player_notes.dm @@ -57,7 +57,7 @@ var/savefile/info = new("data/player_saves/[copytext(key, 1, 2)]/[key]/info.sav") var/list/infos info >> infos - if(!infos || infos.len < index) return + if(LAZYLEN(infos) < index) return var/datum/player_info/item = infos[index] infos.Remove(item) diff --git a/code/modules/admin/player_panel/player_panel.dm b/code/modules/admin/player_panel/player_panel.dm index 424ed1f74232..3b39fd21ca5d 100644 --- a/code/modules/admin/player_panel/player_panel.dm +++ b/code/modules/admin/player_panel/player_panel.dm @@ -338,7 +338,7 @@ dat += "PP" dat += "" - if(SSticker.mode.survivors.len) + if(length(SSticker.mode.survivors)) dat += "
      " for(var/datum/mind/L in SSticker.mode.survivors) var/mob/M = L.current @@ -350,7 +350,7 @@ dat += "" dat += "
      Survivors
      PP
      " - if(SSticker.mode.xenomorphs.len) + if(length(SSticker.mode.xenomorphs)) dat += "
      " for(var/datum/mind/L in SSticker.mode.xenomorphs) var/mob/M = L.current @@ -362,7 +362,7 @@ dat += "" dat += "
      Aliens
      PP
      " - if(SSticker.mode.survivors.len) + if(length(SSticker.mode.survivors)) dat += "
      " for(var/datum/mind/L in SSticker.mode.survivors) var/mob/M = L.current diff --git a/code/modules/admin/tabs/debug_tab.dm b/code/modules/admin/tabs/debug_tab.dm index 03068c577045..9adc59c6f209 100644 --- a/code/modules/admin/tabs/debug_tab.dm +++ b/code/modules/admin/tabs/debug_tab.dm @@ -32,7 +32,7 @@ var/value = SStechtree.trees[1] - if(trees.len > 1) + if(length(trees) > 1) value = tgui_input_list(src, "Choose which tree to enter", "Enter Tree", trees) if(!value) @@ -60,7 +60,7 @@ var/value = SStechtree.trees[1] - if(trees.len > 1) + if(length(trees) > 1) value = tgui_input_list(src, "Choose which tree to give points to", "Give Points", trees) if(!value) diff --git a/code/modules/admin/tabs/event_tab.dm b/code/modules/admin/tabs/event_tab.dm index 69395e6e69e9..a155f2a37614 100644 --- a/code/modules/admin/tabs/event_tab.dm +++ b/code/modules/admin/tabs/event_tab.dm @@ -445,7 +445,7 @@ var/datum/hive_status/hive for(var/hivenumber in GLOB.hive_datum) hive = GLOB.hive_datum[hivenumber] - if(hive.totalXenos.len > 0 || hive.total_dead_xenos.len > 0) + if(length(hive.totalXenos) > 0 || length(hive.total_dead_xenos) > 0) hives += list("[hive.name]" = hive.hivenumber) last_hive_checked = hive diff --git a/code/modules/admin/topic/topic.dm b/code/modules/admin/topic/topic.dm index f3af6ed440e9..029eda204f3a 100644 --- a/code/modules/admin/topic/topic.dm +++ b/code/modules/admin/topic/topic.dm @@ -73,7 +73,7 @@ else if(task == "rank") var/new_rank - if(GLOB.admin_ranks.len) + if(length(GLOB.admin_ranks)) new_rank = tgui_input_list(usr, "Please select a rank", "New rank", (GLOB.admin_ranks|"*New Rank*")) else new_rank = tgui_input_list(usr, "Please select a rank", "New rank", list("Game Master","Game Admin", "Trial Admin", "Admin Observer","*New Rank*")) @@ -91,7 +91,7 @@ to_chat(usr, "Error: Topic 'editrights': Invalid rank") return if(CONFIG_GET(flag/admin_legacy_system)) - if(GLOB.admin_ranks.len) + if(length(GLOB.admin_ranks)) if(new_rank in GLOB.admin_ranks) rights = GLOB.admin_ranks[new_rank] //we typed a rank which already exists, use its rights else @@ -553,7 +553,7 @@ notbannedlist += job //Banning comes first - if(notbannedlist.len) + if(length(notbannedlist)) if(!check_rights(R_BAN)) return var/reason = input(usr,"Reason?","Please State Reason","") as text|null if(reason) @@ -565,7 +565,7 @@ //Unbanning joblist //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(length(joblist)) //at least 1 banned job exists in joblist so we have stuff to unban. for(var/job in joblist) var/reason = jobban_isbanned(M, job, P1) if(!reason) continue //skip if it isn't jobbanned anyway @@ -1951,9 +1951,9 @@ var/list/offset = splittext(href_list["offset"],",") var/number = clamp(text2num(href_list["object_count"]), 1, 100) - var/X = offset.len > 0 ? text2num(offset[1]) : 0 - var/Y = offset.len > 1 ? text2num(offset[2]) : 0 - var/Z = offset.len > 2 ? text2num(offset[3]) : 0 + var/X = length(offset) > 0 ? text2num(offset[1]) : 0 + var/Y = length(offset) > 1 ? text2num(offset[2]) : 0 + var/Z = length(offset) > 2 ? text2num(offset[3]) : 0 var/tmp_dir = href_list["object_dir"] var/obj_dir = tmp_dir ? text2num(tmp_dir) : 2 if(!obj_dir || !(obj_dir in list(1,2,4,8,5,6,9,10))) diff --git a/code/modules/admin/topic/topic_chems.dm b/code/modules/admin/topic/topic_chems.dm index 77e1c0c6d1b8..4da2c55cb5ad 100644 --- a/code/modules/admin/topic/topic_chems.dm +++ b/code/modules/admin/topic/topic_chems.dm @@ -286,7 +286,7 @@ response = alert(usr,"What do you want customized?","Custom reaction [target]","Add component","Add catalyst","Finish") else return - if(R.required_reagents.len < 3) + if(length(R.required_reagents) < 3) to_chat(usr,SPAN_WARNING("You need to add at least 3 components excluding catalysts. The reaction has not been saved.")) return //Save our reaction diff --git a/code/modules/admin/topic/topic_events.dm b/code/modules/admin/topic/topic_events.dm index 264b91d982de..6529dea20670 100644 --- a/code/modules/admin/topic/topic_events.dm +++ b/code/modules/admin/topic/topic_events.dm @@ -259,7 +259,7 @@ var/datum/emergency_call/custom/em_call = new() var/name = input(usr, "Please name your ERT", "ERT Name", "Admin spawned humans") em_call.name = name - em_call.mob_max = humans.len + em_call.mob_max = length(humans) em_call.players_to_offer = humans em_call.owner = owner @@ -347,7 +347,7 @@ var/datum/emergency_call/custom/em_call = new() var/name = input(usr, "Please name your ERT", "ERT Name", "Admin spawned xenos") em_call.name = name - em_call.mob_max = xenos.len + em_call.mob_max = length(xenos) em_call.players_to_offer = xenos em_call.owner = owner diff --git a/code/modules/admin/topic/topic_teleports.dm b/code/modules/admin/topic/topic_teleports.dm index 8a5360169999..d90aa736b9f6 100644 --- a/code/modules/admin/topic/topic_teleports.dm +++ b/code/modules/admin/topic/topic_teleports.dm @@ -83,10 +83,10 @@ for(var/mob/living/M in range(collect_range, owner.mob)) if(M.stat != DEAD) targets.Add(M) - if(targets.len < 1) + if(length(targets) < 1) to_chat(owner, SPAN_ALERT("No alive /living mobs found. Aborting.")) return - if(alert(owner, "[targets.len] mobs were marked for teleportation. Pressing \"TELEPORT\" will teleport them to your location at the moment of pressing button.", "Confirmation", "Teleport", "Cancel") == "Cancel") + if(alert(owner, "[length(targets)] mobs were marked for teleportation. Pressing \"TELEPORT\" will teleport them to your location at the moment of pressing button.", "Confirmation", "Teleport", "Cancel") == "Cancel") return for(var/mob/M in targets) if(!M) @@ -94,7 +94,7 @@ M.on_mob_jump() M.forceMove(get_turf(owner.mob)) - message_admins(WRAP_STAFF_LOG(owner.mob, "mass-teleported [targets.len] mobs in [collect_range] tiles range to themselves in [get_area(owner.mob)] ([owner.mob.x],[owner.mob.y],[owner.mob.z])."), owner.mob.x, owner.mob.y, owner.mob.z) + message_admins(WRAP_STAFF_LOG(owner.mob, "mass-teleported [length(targets)] mobs in [collect_range] tiles range to themselves in [get_area(owner.mob)] ([owner.mob.x],[owner.mob.y],[owner.mob.z])."), owner.mob.x, owner.mob.y, owner.mob.z) if("teleport_mobs_by_faction") var/faction = tgui_input_list(owner, "Choose between humanoids and xenomorphs.", "Mobs Choice", list("Humanoids", "Xenomorphs")) @@ -109,10 +109,10 @@ var/area/AR = get_area(H) if(H.faction != faction || AR.statistic_exempt) targets.Remove(H) - if(targets.len < 1) + if(length(targets) < 1) to_chat(owner, SPAN_ALERT("No alive /human mobs of [faction] faction were found. Aborting.")) return - if(alert(owner, "[targets.len] humanoids of [faction] faction were marked for teleportation. Pressing \"TELEPORT\" will teleport them to your location at the moment of pressing button.", "Confirmation", "Teleport", "Cancel") == "Cancel") + if(alert(owner, "[length(targets)] humanoids of [faction] faction were marked for teleportation. Pressing \"TELEPORT\" will teleport them to your location at the moment of pressing button.", "Confirmation", "Teleport", "Cancel") == "Cancel") return for(var/mob/M in targets) @@ -121,7 +121,7 @@ M.on_mob_jump() M.forceMove(get_turf(owner.mob)) - message_admins(WRAP_STAFF_LOG(owner.mob, "mass-teleported [targets.len] human mobs of [faction] faction to themselves in [get_area(owner.mob)] ([owner.mob.x],[owner.mob.y],[owner.mob.z])."), owner.mob.x, owner.mob.y, owner.mob.z) + message_admins(WRAP_STAFF_LOG(owner.mob, "mass-teleported [length(targets)] human mobs of [faction] faction to themselves in [get_area(owner.mob)] ([owner.mob.x],[owner.mob.y],[owner.mob.z])."), owner.mob.x, owner.mob.y, owner.mob.z) else if(faction == "Xenomorphs") faction = null @@ -141,10 +141,10 @@ var/area/AR = get_area(X) if(X.stat == DEAD || AR.statistic_exempt) targets.Remove(X) - if(targets.len < 1) + if(length(targets) < 1) to_chat(owner, SPAN_ALERT("No alive xenomorphs of [faction] Hive were found. Aborting.")) return - if(alert(owner, "[targets.len] xenomorphs of [faction] Hive were marked for teleportation. Pressing \"TELEPORT\" will teleport them to your location at the moment of pressing button.", "Confirmation", "Teleport", "Cancel") == "Cancel") + if(alert(owner, "[length(targets)] xenomorphs of [faction] Hive were marked for teleportation. Pressing \"TELEPORT\" will teleport them to your location at the moment of pressing button.", "Confirmation", "Teleport", "Cancel") == "Cancel") return for(var/mob/M in targets) @@ -153,25 +153,25 @@ M.on_mob_jump() M.forceMove(get_turf(owner.mob)) - message_admins(WRAP_STAFF_LOG(owner.mob, "mass-teleported [targets.len] xenomorph mobs of [faction] Hive to themselves in [get_area(owner.mob)] ([owner.mob.x],[owner.mob.y],[owner.mob.z])."), owner.mob.x, owner.mob.y, owner.mob.z) + message_admins(WRAP_STAFF_LOG(owner.mob, "mass-teleported [length(targets)] xenomorph mobs of [faction] Hive to themselves in [get_area(owner.mob)] ([owner.mob.x],[owner.mob.y],[owner.mob.z])."), owner.mob.x, owner.mob.y, owner.mob.z) else to_chat(owner, SPAN_ALERT("Mobs choice error. Aborting.")) return if("teleport_corpses") - if(GLOB.dead_mob_list.len < 0) + if(length(GLOB.dead_mob_list) < 0) to_chat(owner, SPAN_ALERT("No corpses found. Aborting.")) return - if(alert(owner, "[GLOB.dead_mob_list.len] corpses are marked for teleportation. Pressing \"TELEPORT\" will teleport them to your location at the moment of pressing button.", "Confirmation", "Teleport", "Cancel") == "Cancel") + if(alert(owner, "[length(GLOB.dead_mob_list)] corpses are marked for teleportation. Pressing \"TELEPORT\" will teleport them to your location at the moment of pressing button.", "Confirmation", "Teleport", "Cancel") == "Cancel") return for(var/mob/M in GLOB.dead_mob_list) if(!M) continue M.on_mob_jump() M.forceMove(get_turf(owner.mob)) - message_admins(WRAP_STAFF_LOG(owner.mob, "mass-teleported [GLOB.dead_mob_list.len] corpses to themselves in [get_area(owner.mob)] ([owner.mob.x],[owner.mob.y],[owner.mob.z])."), owner.mob.x, owner.mob.y, owner.mob.z) + message_admins(WRAP_STAFF_LOG(owner.mob, "mass-teleported [length(GLOB.dead_mob_list)] corpses to themselves in [get_area(owner.mob)] ([owner.mob.x],[owner.mob.y],[owner.mob.z])."), owner.mob.x, owner.mob.y, owner.mob.z) if("teleport_items_by_type") var/item = input(owner,"What item?", "Item Fetcher","") as text|null @@ -186,11 +186,11 @@ if(findtext("[path]", item)) matches += path - if(matches.len==0) + if(length(matches)==0) return var/chosen - if(matches.len==1) + if(length(matches)==1) chosen = matches[1] else //If we have multiple options, let them select which one they meant @@ -205,11 +205,11 @@ if(istype(M, chosen)) targets += M - if(targets.len < 1) + if(length(targets) < 1) to_chat(owner, SPAN_ALERT("No items of type [chosen] were found. Aborting.")) return - if(alert(owner, "[targets.len] items are marked for teleportation. Pressing \"TELEPORT\" will teleport them to your location at the moment of pressing button.", "Confirmation", "Teleport", "Cancel") == "Cancel") + if(alert(owner, "[length(targets)] items are marked for teleportation. Pressing \"TELEPORT\" will teleport them to your location at the moment of pressing button.", "Confirmation", "Teleport", "Cancel") == "Cancel") return //Fetch the items @@ -218,4 +218,4 @@ continue M.forceMove(get_turf(owner.mob)) - message_admins(WRAP_STAFF_LOG(owner.mob, "mass-teleported [targets.len] items of type [chosen] to themselves in [get_area(owner.mob)] ([owner.mob.x],[owner.mob.y],[owner.mob.z])."), owner.mob.x, owner.mob.y, owner.mob.z) + message_admins(WRAP_STAFF_LOG(owner.mob, "mass-teleported [length(targets)] items of type [chosen] to themselves in [get_area(owner.mob)] ([owner.mob.x],[owner.mob.y],[owner.mob.z])."), owner.mob.x, owner.mob.y, owner.mob.z) diff --git a/code/modules/admin/verbs/SDQL2/SDQL_2.dm b/code/modules/admin/verbs/SDQL2/SDQL_2.dm index 2b8bc66652f6..71b288dcda8f 100644 --- a/code/modules/admin/verbs/SDQL2/SDQL_2.dm +++ b/code/modules/admin/verbs/SDQL2/SDQL_2.dm @@ -595,7 +595,7 @@ GLOBAL_DATUM_INIT(sdql2_vv_statobj, /obj/effect/statclick/sdql2_vv_all, new(null // 1 and 2 are type and FROM. var/i = 3 - while (i <= tree.len) + while (i <= length(tree)) var/key = tree[i++] var/list/expression = tree[i++] switch (key) @@ -805,7 +805,7 @@ GLOBAL_DATUM_INIT(sdql2_vv_statobj, /obj/effect/statclick/sdql2_vv_all, new(null out += d SDQL2_TICK_CHECK SDQL2_HALT_CHECK - obj_count_all = out.len + obj_count_all = length(out) return out /datum/sdql2_query/proc/Execute(list/found) @@ -1092,7 +1092,7 @@ GLOBAL_DATUM_INIT(sdql2_vv_statobj, /obj/effect/statclick/sdql2_vv_all, new(null for(var/val in query_list) if(val == ";") do_parse = 1 - else if(pos >= query_list.len) + else if(pos >= length(query_list)) query_tree += val do_parse = 1 @@ -1192,7 +1192,7 @@ GLOBAL_DATUM_INIT(sdql2_vv_statobj, /obj/effect/statclick/sdql2_vv_all, new(null else if(expression[start + 1] == "\[" && islist(v)) var/list/L = v var/index = query.SDQL_expression(source, expression[start + 2]) - if(isnum(index) && ((floor(index) != index) || L.len < index)) + if(isnum(index) && ((floor(index) != index) || length(L) < index)) to_chat(usr, SPAN_DANGER("Invalid list index: [index]"), confidential = TRUE) return null return L[index] diff --git a/code/modules/admin/verbs/SDQL2/SDQL_2_parser.dm b/code/modules/admin/verbs/SDQL2/SDQL_2_parser.dm index 2caea998a11d..27a4e961be05 100644 --- a/code/modules/admin/verbs/SDQL2/SDQL_2_parser.dm +++ b/code/modules/admin/verbs/SDQL2/SDQL_2_parser.dm @@ -61,7 +61,7 @@ /datum/sdql_parser/proc/parse_error(error_message) error = 1 to_chat(usr, SPAN_WARNING("SDQL2 Parsing Error: [error_message]"), confidential = TRUE) - return query.len + 1 + return length(query) + 1 /datum/sdql_parser/proc/parse() tree = list() @@ -73,14 +73,14 @@ return tree /datum/sdql_parser/proc/token(i) - if(i <= query.len) + if(i <= length(query)) return query[i] else return null /datum/sdql_parser/proc/tokens(i, num) - if(i + num <= query.len) + if(i + num <= length(query)) return query.Copy(i, i + num) else @@ -473,7 +473,7 @@ if (tok == ":") temp_expression_list = list() i = expression(i + 1, temp_expression_list) - expression_list[expression_list[expression_list.len]] = temp_expression_list + expression_list[expression_list[length(expression_list)]] = temp_expression_list temp_expression_list = null tok = token(i) if (tok != ",") diff --git a/code/modules/admin/verbs/SDQL2/SDQL_2_wrappers.dm b/code/modules/admin/verbs/SDQL2/SDQL_2_wrappers.dm index 57b707a8ebf0..64e6bb85bed6 100644 --- a/code/modules/admin/verbs/SDQL2/SDQL_2_wrappers.dm +++ b/code/modules/admin/verbs/SDQL2/SDQL_2_wrappers.dm @@ -179,7 +179,7 @@ sleep(Delay) /proc/_list_add(list/L, ...) - if (args.len < 2) + if (length(args) < 2) return L += args.Copy(2) @@ -199,7 +199,7 @@ return L.Join(Glue, Start, End) /proc/_list_remove(list/L, ...) - if (args.len < 2) + if (length(args) < 2) return L -= args.Copy(2) diff --git a/code/modules/admin/verbs/adminhelp.dm b/code/modules/admin/verbs/adminhelp.dm index 84298faaa3a1..3dfba42032b3 100644 --- a/code/modules/admin/verbs/adminhelp.dm +++ b/code/modules/admin/verbs/adminhelp.dm @@ -58,7 +58,7 @@ GLOBAL_DATUM_INIT(ahelp_tickets, /datum/admin_help_tickets, new) ticket_list = resolved_tickets else CRASH("Invalid ticket state: [new_ticket.state]") - var/num_closed = ticket_list.len + var/num_closed = length(ticket_list) if(num_closed) for(var/I in 1 to num_closed) var/datum/admin_help/AH = ticket_list[I] @@ -97,8 +97,8 @@ GLOBAL_DATUM_INIT(ahelp_tickets, /datum/admin_help_tickets, new) SHOULD_NOT_SLEEP(TRUE) var/list/L = list() var/num_disconnected = 0 - L[++L.len] = list("Active Tickets:", "[astatclick.update("[active_tickets.len]")]", null, REF(astatclick)) - astatclick.update("[active_tickets.len]") + L[++L.len] = list("Active Tickets:", "[astatclick.update("[length(active_tickets)]")]", null, REF(astatclick)) + astatclick.update("[length(active_tickets)]") for(var/I in active_tickets) var/datum/admin_help/AH = I if(AH.initiator) @@ -108,8 +108,8 @@ GLOBAL_DATUM_INIT(ahelp_tickets, /datum/admin_help_tickets, new) ++num_disconnected if(num_disconnected) L[++L.len] = list("Disconnected:", "[astatclick.update("[num_disconnected]")]", null, REF(astatclick)) - L[++L.len] = list("Closed Tickets:", "[cstatclick.update("[closed_tickets.len]")]", null, REF(cstatclick)) - L[++L.len] = list("Resolved Tickets:", "[rstatclick.update("[resolved_tickets.len]")]", null, REF(rstatclick)) + L[++L.len] = list("Closed Tickets:", "[cstatclick.update("[length(closed_tickets)]")]", null, REF(cstatclick)) + L[++L.len] = list("Resolved Tickets:", "[rstatclick.update("[length(resolved_tickets)]")]", null, REF(rstatclick)) return L //Reassociate still open ticket if one exists @@ -300,7 +300,7 @@ GLOBAL_DATUM_INIT(ahelp_tickets, /datum/admin_help_tickets, new) webhook_sent = WEBHOOK_URGENT var/list/adm = get_admin_counts(R_BAN) var/list/activemins = adm["present"] - var/admin_number_present = activemins.len + var/admin_number_present = length(activemins) log_admin_private("Ticket #[id]: [key_name(initiator)]: [name] - heard by [admin_number_present] non-AFK admins who have +BAN.") if(admin_number_present <= 0) @@ -660,7 +660,7 @@ GLOBAL_DATUM_INIT(ahelp_tickets, /datum/admin_help_tickets, new) // Append any tickets also opened by this user if relevant var/list/related_tickets = GLOB.ahelp_tickets.TicketsByCKey(initiator_ckey) - if (related_tickets.len > 1) + if (length(related_tickets) > 1) dat += "
      Other Tickets by User
      " for (var/datum/admin_help/related_ticket in related_tickets) if (related_ticket.id == id) diff --git a/code/modules/admin/verbs/adminpanelweapons.dm b/code/modules/admin/verbs/adminpanelweapons.dm index 9fde4e96ebee..a8062e59eea8 100644 --- a/code/modules/admin/verbs/adminpanelweapons.dm +++ b/code/modules/admin/verbs/adminpanelweapons.dm @@ -108,13 +108,13 @@ picked_area = pick(GLOB.ship_areas) for(var/turf/my_turf in picked_area) turfs_of_area += my_turf - if(turfs_of_area.len > 0) + if(length(turfs_of_area) > 0) picked_atom = pick(turfs_of_area) if (picked_atom != null) targets += picked_atom break - if(targets.len < turfquantity) + if(length(targets) < turfquantity) return null else return targets diff --git a/code/modules/admin/verbs/autoreplace.dm b/code/modules/admin/verbs/autoreplace.dm index a896c751f5ed..4e6ec6fdd4be 100644 --- a/code/modules/admin/verbs/autoreplace.dm +++ b/code/modules/admin/verbs/autoreplace.dm @@ -32,7 +32,7 @@ GLOBAL_LIST_INIT_TYPED(admin_runtime_decorators, /datum/decorator/manual/admin_r GLOB.admin_runtime_decorators.Add(SSdecorator.add_decorator(/datum/decorator/manual/admin_runtime, types, subtypes, field, value)) - message_admins("[src] activated new decorator id: [GLOB.admin_runtime_decorators.len] set for [hint_text] `[types]` for field `[field]` set value `[value]`") + message_admins("[src] activated new decorator id: [length(GLOB.admin_runtime_decorators)] set for [hint_text] `[types]` for field `[field]` set value `[value]`") /client/proc/deactivate_autoreplacer() set category = "Admin.Events" diff --git a/code/modules/admin/verbs/debug.dm b/code/modules/admin/verbs/debug.dm index 83e12be9c574..5228c2d80fba 100644 --- a/code/modules/admin/verbs/debug.dm +++ b/code/modules/admin/verbs/debug.dm @@ -277,7 +277,7 @@ remembered_info += "Your account pin is: [generated_account.remote_access_pin]
      " remembered_info += "Your account funds are: $[generated_account.money]
      " - if(generated_account.transaction_log.len) + if(length(generated_account.transaction_log)) var/datum/transaction/T = generated_account.transaction_log[1] remembered_info += "Your account was created: [T.time], [T.date] at [T.source_terminal]
      " account_user.mind.store_memory(remembered_info) diff --git a/code/modules/admin/view_variables/debug_variables.dm b/code/modules/admin/view_variables/debug_variables.dm index 90178160e591..f099db67c717 100644 --- a/code/modules/admin/view_variables/debug_variables.dm +++ b/code/modules/admin/view_variables/debug_variables.dm @@ -69,8 +69,8 @@ var/list/L = value var/list/items = list() - if (L.len > 0 && !(name == "underlays" || name == "overlays" || L.len > (IS_NORMAL_LIST(L) ? VV_NORMAL_LIST_NO_EXPAND_THRESHOLD : VV_SPECIAL_LIST_NO_EXPAND_THRESHOLD))) - for (var/i in 1 to L.len) + if (length(L) > 0 && !(name == "underlays" || name == "overlays" || length(L) > (IS_NORMAL_LIST(L) ? VV_NORMAL_LIST_NO_EXPAND_THRESHOLD : VV_SPECIAL_LIST_NO_EXPAND_THRESHOLD))) + for (var/i in 1 to length(L)) var/key = L[i] var/val if (IS_NORMAL_LIST(L) && !isnum(key)) @@ -81,9 +81,9 @@ items += debug_variable(key, val, level + 1, sanitize = sanitize) - item = "[name_part] = /list ([L.len])
        [items.Join()]
      " + item = "[name_part] = /list ([length(L)])
        [items.Join()]
      " else - item = "[name_part] = /list ([L.len])" + item = "[name_part] = /list ([length(L)])" else if (name in GLOB.bitfields) var/list/flags = list() diff --git a/code/modules/admin/view_variables/get_variables.dm b/code/modules/admin/view_variables/get_variables.dm index 9ec449e4c3f6..a29fe52ba58f 100644 --- a/code/modules/admin/view_variables/get_variables.dm +++ b/code/modules/admin/view_variables/get_variables.dm @@ -390,7 +390,7 @@ var/list/matches = new var/end_len = -1 var/list/endcheck = splittext(filter, "!") - if(endcheck.len > 1) + if(length(endcheck) > 1) filter = endcheck[1] end_len = length_char(filter) diff --git a/code/modules/admin/view_variables/mass_edit_variables.dm b/code/modules/admin/view_variables/mass_edit_variables.dm index 4d1b5581aac0..d72337a3a7fe 100644 --- a/code/modules/admin/view_variables/mass_edit_variables.dm +++ b/code/modules/admin/view_variables/mass_edit_variables.dm @@ -101,7 +101,7 @@ if(VV_RESTORE_DEFAULT) to_chat(src, "Finding items...", confidential = TRUE) var/list/items = get_all_of_type(O.type, method) - to_chat(src, "Changing [items.len] items...", confidential = TRUE) + to_chat(src, "Changing [length(items)] items...", confidential = TRUE) for(var/thing in items) if (!thing) continue @@ -116,7 +116,7 @@ var/list/varsvars = vv_parse_text(O, new_value) var/pre_processing = new_value var/unique - if (varsvars?.len) + if (LAZYLEN(varsvars)) unique = tgui_alert(usr, "Process vars unique to each instance, or same for all?", "Variable Association", list("Unique", "Same")) if(unique == "Unique") unique = TRUE @@ -127,7 +127,7 @@ to_chat(src, "Finding items...", confidential = TRUE) var/list/items = get_all_of_type(O.type, method) - to_chat(src, "Changing [items.len] items...", confidential = TRUE) + to_chat(src, "Changing [length(items)] items...", confidential = TRUE) for(var/thing in items) if (!thing) continue @@ -155,7 +155,7 @@ var/type = value["type"] to_chat(src, "Finding items...", confidential = TRUE) var/list/items = get_all_of_type(O.type, method) - to_chat(src, "Changing [items.len] items...", confidential = TRUE) + to_chat(src, "Changing [length(items)] items...", confidential = TRUE) for(var/thing in items) if (!thing) continue @@ -173,7 +173,7 @@ else to_chat(src, "Finding items...", confidential = TRUE) var/list/items = get_all_of_type(O.type, method) - to_chat(src, "Changing [items.len] items...", confidential = TRUE) + to_chat(src, "Changing [length(items)] items...", confidential = TRUE) for(var/thing in items) if (!thing) continue diff --git a/code/modules/admin/view_variables/modify_variables.dm b/code/modules/admin/view_variables/modify_variables.dm index 5b2ec3f0e5c5..06e724a0028b 100644 --- a/code/modules/admin/view_variables/modify_variables.dm +++ b/code/modules/admin/view_variables/modify_variables.dm @@ -21,16 +21,15 @@ GLOBAL_PROTECT(VVpixelmovement) if (!ispath(type)) return var/list/subtypes = subtypesof(type) - if (!subtypes || !subtypes.len) + if (!LAZYLEN(subtypes)) return FALSE - if (subtypes?.len) - switch(tgui_alert(usr,"Strict object type detection?", "Type detection", list("Strictly this type","This type and subtypes", "Cancel"))) - if("Strictly this type") - return FALSE - if("This type and subtypes") - return TRUE - else - return + switch(tgui_alert(usr,"Strict object type detection?", "Type detection", list("Strictly this type","This type and subtypes", "Cancel"))) + if("Strictly this type") + return FALSE + if("This type and subtypes") + return TRUE + else + return /client/proc/vv_reference_list(type, subtypes) . = list() @@ -115,14 +114,14 @@ GLOBAL_PROTECT(VVpixelmovement) to_chat(src, "Not a List.", confidential = TRUE) return - if(L.len > 1000) + if(length(L) > 1000) var/confirm = tgui_alert(usr, "The list you're trying to edit is very long, continuing may crash the server.", "Warning", list("Continue", "Abort")) if(confirm != "Continue") return var/is_normal_list = IS_NORMAL_LIST(L) var/list/names = list() - for (var/i in 1 to L.len) + for (var/i in 1 to length(L)) var/key = L[i] var/value if (is_normal_list && !isnum(key)) diff --git a/code/modules/admin/view_variables/reference_tracking.dm b/code/modules/admin/view_variables/reference_tracking.dm index 35f464354c72..8658c9e30602 100644 --- a/code/modules/admin/view_variables/reference_tracking.dm +++ b/code/modules/admin/view_variables/reference_tracking.dm @@ -130,7 +130,7 @@ #endif log_reftracker("Found [type] [text_ref(src)] in list [container_name].") var/msg - for(var/i in 1 to min(10, potential_cache.len)) + for(var/i in 1 to min(10, length(potential_cache))) msg += "[potential_cache[i]]," if(msg) log_reftracker("List contents: [msg]") @@ -148,7 +148,7 @@ #endif log_reftracker("Found [type] [text_ref(src)] in list [container_name]\[[element_in_list]\]") var/msg - for(var/i in 1 to min(10, potential_cache.len)) + for(var/i in 1 to min(10, length(potential_cache))) msg += "[potential_cache[i]]," if(msg) log_reftracker("List contents: [msg]") diff --git a/code/modules/admin/view_variables/topic_list.dm b/code/modules/admin/view_variables/topic_list.dm index 21b534d3d4ed..e0040efc2f74 100644 --- a/code/modules/admin/view_variables/topic_list.dm +++ b/code/modules/admin/view_variables/topic_list.dm @@ -30,12 +30,12 @@ message_admins("[key_name_admin(src)] modified list's contents: CLEAR NULLS") if(href_list[VV_HK_LIST_SET_LENGTH]) var/value = vv_get_value(VV_NUM) - if (value["class"] != VV_NUM || value["value"] > max(50000, target.len)) //safety - would rather someone not put an extra 0 and erase the server's memory lmao. + if (value["class"] != VV_NUM || value["value"] > max(50000, length(target))) //safety - would rather someone not put an extra 0 and erase the server's memory lmao. return target.len = value["value"] - log_world("### ListVarEdit by [src]: /list len: [target.len]") - log_admin("[key_name(src)] modified list's len: [target.len]") - message_admins("[key_name_admin(src)] modified list's len: [target.len]") + log_world("### ListVarEdit by [src]: /list len: [length(target)]") + log_admin("[key_name(src)] modified list's len: [length(target)]") + message_admins("[key_name_admin(src)] modified list's len: [length(target)]") if(href_list[VV_HK_LIST_SHUFFLE]) shuffle_inplace(target) log_world("### ListVarEdit by [src]: /list contents: SHUFFLE") diff --git a/code/modules/admin/view_variables/view_variables.dm b/code/modules/admin/view_variables/view_variables.dm index 0ed09039c990..74132771c268 100644 --- a/code/modules/admin/view_variables/view_variables.dm +++ b/code/modules/admin/view_variables/view_variables.dm @@ -86,7 +86,7 @@ var/list/variable_html = list() if(islist) var/list/L = D - for(var/i in 1 to L.len) + for(var/i in 1 to length(L)) var/key = L[i] var/value if(IS_NORMAL_LIST(L) && IS_VALID_ASSOC_KEY(key)) diff --git a/code/modules/almayer/machinery.dm b/code/modules/almayer/machinery.dm index 76eef40c081f..47c17436c52f 100644 --- a/code/modules/almayer/machinery.dm +++ b/code/modules/almayer/machinery.dm @@ -222,8 +222,8 @@ . = ..() if((isobserver(user) || ishuman(user)) && GLOB.fallen_list) var/faltext = "" - for(var/i = 1 to GLOB.fallen_list.len) - if(i != GLOB.fallen_list.len) + for(var/i = 1 to length(GLOB.fallen_list)) + if(i != length(GLOB.fallen_list)) faltext += "[GLOB.fallen_list[i]], " else faltext += GLOB.fallen_list[i] diff --git a/code/modules/asset_cache/asset_list.dm b/code/modules/asset_cache/asset_list.dm index cb3bed635940..828472ad9573 100644 --- a/code/modules/asset_cache/asset_list.dm +++ b/code/modules/asset_cache/asset_list.dm @@ -203,7 +203,7 @@ GLOBAL_LIST_EMPTY(asset_datums) for (var/icon_state_name in icon_states(I)) for (var/direction in directions) - var/prefix2 = (directions.len > 1) ? "[dir2text(direction)]-" : "" + var/prefix2 = (length(directions) > 1) ? "[dir2text(direction)]-" : "" Insert("[prefix][prefix2][icon_state_name]", I, icon_state=icon_state_name, dir=direction) /datum/asset/spritesheet/proc/css_tag() @@ -260,7 +260,7 @@ GLOBAL_LIST_EMPTY(asset_datums) if (!asset) continue asset = fcopy_rsc(asset) //dedupe - var/prefix2 = (directions.len > 1) ? "[dir2text(direction)]." : "" + var/prefix2 = (length(directions) > 1) ? "[dir2text(direction)]." : "" var/asset_name = sanitize_filename("[prefix].[prefix2][icon_state_name].png") if (generic_icon_names) asset_name = "[generate_asset_name(asset)].png" diff --git a/code/modules/asset_cache/transports/asset_transport.dm b/code/modules/asset_cache/transports/asset_transport.dm index 2e165229f19b..3db4f0f33297 100644 --- a/code/modules/asset_cache/transports/asset_transport.dm +++ b/code/modules/asset_cache/transports/asset_transport.dm @@ -113,8 +113,8 @@ continue unreceived[asset_name] = ACI - if (unreceived.len) - if (unreceived.len >= ASSET_CACHE_TELL_CLIENT_AMOUNT) + if (length(unreceived)) + if (length(unreceived) >= ASSET_CACHE_TELL_CLIENT_AMOUNT) to_chat(client, "Sending Resources...") for (var/asset_name in unreceived) diff --git a/code/modules/clans/client.dm b/code/modules/clans/client.dm index 6e3e728fb1ee..b31a2c06f9c9 100644 --- a/code/modules/clans/client.dm +++ b/code/modules/clans/client.dm @@ -145,7 +145,7 @@ player_move_clans = (clan_info.permissions & CLAN_PERMISSION_ADMIN_MOVE) ) - var/list/clan_members[CPV.len] + var/list/clan_members[length(CPV)] var/index = 1 for(var/datum/view_record/clan_playerbase_view/CP in CPV) @@ -361,7 +361,7 @@ for(var/datum/view_record/clan_view/CV in CPV) clans += list("[CV.name]" = CV.clan_id) - if(is_clan_manager && clans.len >= 1) + if(is_clan_manager && length(clans) >= 1) if(target.permissions & CLAN_PERMISSION_ADMIN_ANCIENT) clans += list("Remove from Ancient") else @@ -431,7 +431,7 @@ if(chosen_rank.limit_type) var/list/datum/view_record/clan_playerbase_view/CPV = DB_VIEW(/datum/view_record/clan_playerbase_view/, DB_AND(DB_COMP("clan_id", DB_EQUALS, target.clan_id), DB_COMP("rank", DB_EQUALS, GLOB.clan_ranks_ordered[input]))) - var/players_in_rank = CPV.len + var/players_in_rank = length(CPV) switch(chosen_rank.limit_type) if(CLAN_LIMIT_NUMBER) @@ -440,7 +440,7 @@ return if(CLAN_LIMIT_SIZE) var/list/datum/view_record/clan_playerbase_view/clan_players = DB_VIEW(/datum/view_record/clan_playerbase_view/, DB_COMP("clan_id", DB_EQUALS, target.clan_id)) - var/available_slots = ceil(clan_players.len / chosen_rank.limit) + var/available_slots = ceil(length(clan_players) / chosen_rank.limit) if(players_in_rank >= available_slots) to_chat(src, SPAN_DANGER("This slot is full! (Maximum of [chosen_rank.limit] per player in the clan, currently [available_slots])")) diff --git a/code/modules/client/client_procs.dm b/code/modules/client/client_procs.dm index cd70f62a80d6..4d0ef56b9fdd 100644 --- a/code/modules/client/client_procs.dm +++ b/code/modules/client/client_procs.dm @@ -297,7 +297,7 @@ GLOBAL_LIST_INIT(whitelisted_client_procs, list( var/static/next_external_rsc = 0 var/list/external_rsc_urls = CONFIG_GET(keyed_list/external_rsc_urls) if(length(external_rsc_urls)) - next_external_rsc = WRAP(next_external_rsc+1, 1, external_rsc_urls.len+1) + next_external_rsc = WRAP(next_external_rsc+1, 1, length(external_rsc_urls)+1) preload_rsc = external_rsc_urls[next_external_rsc] player_entity = setup_player_entity(ckey) diff --git a/code/modules/client/player_details.dm b/code/modules/client/player_details.dm index 634fd8fb627e..12e50647536b 100644 --- a/code/modules/client/player_details.dm +++ b/code/modules/client/player_details.dm @@ -17,7 +17,7 @@ GLOBAL_LIST_EMPTY(player_details) // ckey -> /datum/player_details /proc/log_played_names(ckey, ...) if(!ckey) return - if(args.len < 2) + if(length(args) < 2) return var/list/names = args.Copy(2) var/datum/player_details/P = GLOB.player_details[ckey] diff --git a/code/modules/client/preferences.dm b/code/modules/client/preferences.dm index 1971deba6356..b4ee572d8d2d 100644 --- a/code/modules/client/preferences.dm +++ b/code/modules/client/preferences.dm @@ -404,7 +404,7 @@ GLOBAL_LIST_INIT(bgstate_options, list( if(length(gear)) dat += "
      " - for(var/i = 1; i <= gear.len; i++) + for(var/i = 1; i <= length(gear); i++) var/datum/gear/G = GLOB.gear_datums_by_name[gear[i]] if(G) total_cost += G.cost @@ -416,7 +416,7 @@ GLOBAL_LIST_INIT(bgstate_options, list( if(total_cost < MAX_GEAR_COST) dat += " Add" - if(gear && gear.len) + if(LAZYLEN(gear)) dat += " Clear" dat += "" @@ -1041,7 +1041,7 @@ GLOBAL_LIST_INIT(bgstate_options, list( var/datum/gear/G if(isnull(gear) || !islist(gear)) gear = list() - if(gear.len) + if(length(gear)) for(var/gear_name in gear) G = GLOB.gear_datums_by_name[gear_name] total_cost += G?.cost @@ -1056,7 +1056,7 @@ GLOBAL_LIST_INIT(bgstate_options, list( if("remove") var/i_remove = text2num(href_list["gear"]) - if(i_remove < 1 || i_remove > gear.len) return + if(i_remove < 1 || i_remove > length(gear)) return gear.Cut(i_remove, i_remove + 1) if("clear") diff --git a/code/modules/client/preferences_savefile.dm b/code/modules/client/preferences_savefile.dm index e261595d300f..54e98aceea94 100644 --- a/code/modules/client/preferences_savefile.dm +++ b/code/modules/client/preferences_savefile.dm @@ -57,9 +57,8 @@ if(savefile_version < 17) //remove omniglots var/list/language_traits = list() S["traits"] >> language_traits - if(language_traits) - if(language_traits.len > 1) - language_traits = null + if(LAZYLEN(language_traits) > 1) + language_traits = null S["traits"] << language_traits if(savefile_version < 18) // adds ambient occlusion by default @@ -594,7 +593,7 @@ b_eyes = sanitize_integer(b_eyes, 0, 255, initial(b_eyes)) underwear = sanitize_inlist(underwear, gender == MALE ? GLOB.underwear_m : GLOB.underwear_f, initial(underwear)) undershirt = sanitize_inlist(undershirt, gender == MALE ? GLOB.undershirt_m : GLOB.undershirt_f, initial(undershirt)) - backbag = sanitize_integer(backbag, 1, GLOB.backbaglist.len, initial(backbag)) + backbag = sanitize_integer(backbag, 1, length(GLOB.backbaglist), initial(backbag)) preferred_armor = sanitize_inlist(preferred_armor, GLOB.armor_style_list, "Random") //b_type = sanitize_text(b_type, initial(b_type)) diff --git a/code/modules/clothing/clothing.dm b/code/modules/clothing/clothing.dm index 91f42fbafe79..323b5ead1df2 100644 --- a/code/modules/clothing/clothing.dm +++ b/code/modules/clothing/clothing.dm @@ -26,9 +26,9 @@ for(var/obj/item/clothing/accessory/accessory in accessories) if(accessory.high_visibility) ties += "\a [accessory.get_examine_line(user)]" - if(ties.len) + if(length(ties)) .+= " with [english_list(ties)] attached" - if(LAZYLEN(accessories) > ties.len) + if(LAZYLEN(accessories) > length(ties)) .+= ". \[See accessories\]" /obj/item/clothing/Topic(href, href_list) @@ -284,7 +284,7 @@ tankcheck = list(C.r_hand, C.l_hand, C.back) var/best = 0 var/bestpressure = 0 - for(var/i=1, i 2)// max 3 xenos in a tunnel + if(length(T.contents) > 2)// max 3 xenos in a tunnel to_chat(X, SPAN_WARNING("The tunnel is too crowded, wait for others to exit!")) return FALSE if(!T.loc) @@ -236,11 +236,11 @@ to_chat(M, SPAN_XENOWARNING("We can't climb through a tunnel while immobile.")) return XENO_NO_DELAY_ACTION - if(!hive.tunnels.len) + if(!length(hive.tunnels)) to_chat(M, SPAN_WARNING("[src] doesn't seem to lead anywhere.")) return XENO_NO_DELAY_ACTION - if(contents.len > 2) + if(length(contents) > 2) to_chat(M, SPAN_WARNING("The tunnel is too crowded, wait for others to exit!")) return XENO_NO_DELAY_ACTION @@ -263,7 +263,7 @@ to_chat(M, SPAN_WARNING("Our crawling was interrupted!")) return XENO_NO_DELAY_ACTION - if(hive.tunnels.len) //Make sure other tunnels exist + if(length(hive.tunnels)) //Make sure other tunnels exist M.forceMove(src) //become one with the tunnel to_chat(M, SPAN_HIGHDANGER("Alt + Click the tunnel to exit, Ctrl + Click to choose a destination.")) pick_tunnel(M) diff --git a/code/modules/cm_marines/dropship_equipment.dm b/code/modules/cm_marines/dropship_equipment.dm index f5865c05bbd4..c4ac1ac98cad 100644 --- a/code/modules/cm_marines/dropship_equipment.dm +++ b/code/modules/cm_marines/dropship_equipment.dm @@ -1216,7 +1216,7 @@ var/list/possible_fultons = get_targets() - if(!possible_fultons.len) + if(!length(possible_fultons)) to_chat(user, SPAN_WARNING("No active balloons detected.")) return diff --git a/code/modules/cm_marines/equipment/gear.dm b/code/modules/cm_marines/equipment/gear.dm index 00f956fdd4ed..9e5352621e32 100644 --- a/code/modules/cm_marines/equipment/gear.dm +++ b/code/modules/cm_marines/equipment/gear.dm @@ -108,7 +108,7 @@ continue mobs_can_store += H var/mob/living/carbon/human/mob_to_store - if(mobs_can_store.len) + if(length(mobs_can_store)) mob_to_store = pick(mobs_can_store) mob_to_store.forceMove(src) mob_to_store.unset_interaction() diff --git a/code/modules/cm_marines/equipment/kit_boxes.dm b/code/modules/cm_marines/equipment/kit_boxes.dm index cbc7deffcd07..8d5a478fa620 100644 --- a/code/modules/cm_marines/equipment/kit_boxes.dm +++ b/code/modules/cm_marines/equipment/kit_boxes.dm @@ -323,7 +323,7 @@ overlays += image('icons/obj/items/storage.dmi', "+[pro_case_overlay]") /obj/item/storage/box/kit/update_icon() - if(!contents.len) + if(!length(contents)) qdel(src) /obj/item/storage/box/kit/mou53_sapper name = "\improper M-OU53 Field Test Kit" diff --git a/code/modules/cm_marines/equipment/weapons.dm b/code/modules/cm_marines/equipment/weapons.dm index 50ad5dcaf385..9a84c84125d5 100644 --- a/code/modules/cm_marines/equipment/weapons.dm +++ b/code/modules/cm_marines/equipment/weapons.dm @@ -21,9 +21,8 @@ update_icon() /obj/item/storage/box/m56_system/update_icon() - if(overlays.len) - overlays.Cut() - if(contents.len) + LAZYCLEARLIST(overlays) + if(length(contents)) icon_state = "kit_case" overlays += image(icon, "smartgun") else @@ -50,9 +49,8 @@ update_icon() /obj/item/storage/box/m56c_system/update_icon() - if(overlays.len) - overlays.Cut() - if(contents.len) + LAZYCLEARLIST(overlays) + if(length(contents)) icon_state = "kit_case" overlays += image(icon, "smartgun") else @@ -80,9 +78,8 @@ update_icon() /obj/item/storage/box/m56_dirty_system/update_icon() - if(overlays.len) - overlays.Cut() - if(contents.len) + LAZYCLEARLIST(overlays) + if(length(contents)) icon_state = "kit_case" overlays += image(icon, "smartgun") else diff --git a/code/modules/cm_marines/marines_consoles.dm b/code/modules/cm_marines/marines_consoles.dm index 93ef0e21e8cb..7225556584de 100644 --- a/code/modules/cm_marines/marines_consoles.dm +++ b/code/modules/cm_marines/marines_consoles.dm @@ -805,7 +805,7 @@ GLOBAL_LIST_EMPTY_TYPED(crewmonitor, /datum/crewmonitor) ui.open() /datum/crewmonitor/proc/show(mob/M, source) - if(!ui_sources.len) + if(!length(ui_sources)) START_PROCESSING(SSprocessing, src) ui_sources[M] = source tgui_interact(M) @@ -823,7 +823,7 @@ GLOBAL_LIST_EMPTY_TYPED(crewmonitor, /datum/crewmonitor) /datum/crewmonitor/ui_close(mob/M) . = ..() ui_sources -= M - if(!ui_sources.len) + if(!length(ui_sources)) STOP_PROCESSING(SSprocessing, src) /datum/crewmonitor/ui_host(mob/user) diff --git a/code/modules/cm_marines/shuttle_backend.dm b/code/modules/cm_marines/shuttle_backend.dm index 6974e078e2de..905bde3b4483 100644 --- a/code/modules/cm_marines/shuttle_backend.dm +++ b/code/modules/cm_marines/shuttle_backend.dm @@ -107,7 +107,7 @@ DOCUMENTATION ON HOW TO ADD A NEW SHUTTLE: Fourkhan, 6/7/19 /proc/rotate_shuttle_turfs(list/L, deg = 0) if((deg % 90) != 0) return //Not a right or straight angle, don't do anything - if(!istype(L) || !L.len) return null + if(!istype(L) || !length(L)) return null var/i //iterator var/x //Placeholder while we do math diff --git a/code/modules/cm_preds/yaut_items.dm b/code/modules/cm_preds/yaut_items.dm index db0153c4d504..27edf559d3ca 100644 --- a/code/modules/cm_preds/yaut_items.dm +++ b/code/modules/cm_preds/yaut_items.dm @@ -944,7 +944,7 @@ new /obj/item/tool/surgery/healing_gel/(src) /obj/item/storage/medicomp/update_icon() - if(!contents.len) + if(!length(contents)) icon_state = "medicomp_open" else icon_state = "medicomp" diff --git a/code/modules/customitems/item_spawning.dm b/code/modules/customitems/item_spawning.dm index b2d6b34f51c9..e9733d0635ed 100644 --- a/code/modules/customitems/item_spawning.dm +++ b/code/modules/customitems/item_spawning.dm @@ -10,10 +10,10 @@ GLOBAL_LIST_FILE_LOAD(custom_items, "config/custom_items.txt") for(var/line in GLOB.custom_items) // split & clean up var/list/Entry = splittext(line, ":") - for(var/i = 1 to Entry.len) + for(var/i = 1 to length(Entry)) Entry[i] = trim(Entry[i]) - if(Entry.len < 2) + if(length(Entry) < 2) continue; if(Entry[1] == M.ckey) diff --git a/code/modules/decorators/cassette_decorator.dm b/code/modules/decorators/cassette_decorator.dm index 4968f4cc1b17..0b8558a693e9 100644 --- a/code/modules/decorators/cassette_decorator.dm +++ b/code/modules/decorators/cassette_decorator.dm @@ -3,7 +3,7 @@ /datum/decorator/cassette/is_active_decor() cassette_data = file2list("sound/music/walkman/playlist.txt") - return cassette_data.len > 0 + return length(cassette_data) > 0 /datum/decorator/cassette/get_decor_types() return typesof(/obj/item/device/cassette_tape) diff --git a/code/modules/defenses/sentry.dm b/code/modules/defenses/sentry.dm index 492482f19416..695b3387d909 100644 --- a/code/modules/defenses/sentry.dm +++ b/code/modules/defenses/sentry.dm @@ -85,7 +85,7 @@ if(!targets) return FALSE - if(!target && targets.len) + if(!target && length(targets)) target = pick(targets) get_target(target) @@ -290,7 +290,7 @@ if(actual_fire(A)) break - if(targets.len) + if(length(targets)) addtimer(CALLBACK(src, PROC_REF(get_target)), fire_delay) if(!engaged_timer) @@ -350,7 +350,7 @@ if(!targets.Find(new_target)) targets.Add(new_target) - if(!targets.len) + if(!length(targets)) return var/list/conscious_targets = list() @@ -405,7 +405,7 @@ continue var/list/turf/path = get_line(src, A, include_start_atom = FALSE) - if(!path.len || get_dist(src, A) > sentry_range) + if(!length(path) || get_dist(src, A) > sentry_range) if(A == target) target = null targets.Remove(A) @@ -457,9 +457,9 @@ else conscious_targets += M - if(conscious_targets.len) + if(length(conscious_targets)) target = pick(conscious_targets) - else if(unconscious_targets.len) + else if(length(unconscious_targets)) target = pick(unconscious_targets) if(!target) //No targets, don't bother firing diff --git a/code/modules/droppod/droppod_ui.dm b/code/modules/droppod/droppod_ui.dm index 6493e9ec6c21..118422a791a6 100644 --- a/code/modules/droppod/droppod_ui.dm +++ b/code/modules/droppod/droppod_ui.dm @@ -90,7 +90,7 @@ GLOBAL_LIST_INIT(droppod_target_mode, list( var/list/acceptableTurfs = list() for (var/t in ordered_area) //Go through the orderedArea list var/turf/unchecked_turf = t - if (typecache_filter_list_reverse(unchecked_turf.contents, ignored_atoms).len != 0) //if there is something in this turf that isn't in the blacklist, we consider this turf "acceptable" and add it to the acceptableTurfs list + if (length(typecache_filter_list_reverse(unchecked_turf.contents, ignored_atoms)) != 0) //if there is something in this turf that isn't in the blacklist, we consider this turf "acceptable" and add it to the acceptableTurfs list acceptableTurfs.Add(unchecked_turf) //Because orderedArea was an ordered linear list, acceptableTurfs will be as well. launch_list = list() //Anything in launch_list will go into the supplypod when it is launched diff --git a/code/modules/dropships/cas/fire_mission_record.dm b/code/modules/dropships/cas/fire_mission_record.dm index 2887ec92c24a..3b3b48fe6b0a 100644 --- a/code/modules/dropships/cas/fire_mission_record.dm +++ b/code/modules/dropships/cas/fire_mission_record.dm @@ -31,7 +31,7 @@ var/used = 0 var/max_ammo = 0 if(weapon.ammo_equipped) - for(var/step = 1; step<=offsets.len; step++) + for(var/step = 1; step<=length(offsets); step++) if(offsets[step]!=null && offsets[step]!="-") used += weapon.ammo_equipped.ammo_used_per_firing max_ammo = weapon.ammo_equipped.max_ammo_count diff --git a/code/modules/economy/economy_misc.dm b/code/modules/economy/economy_misc.dm index 6e22fd12d58a..d65799f8f96f 100644 --- a/code/modules/economy/economy_misc.dm +++ b/code/modules/economy/economy_misc.dm @@ -77,8 +77,8 @@ GLOBAL_VAR_INIT(economy_init, FALSE) for(var/loc_type in typesof(/datum/trade_destination) - /datum/trade_destination) var/datum/trade_destination/D = new loc_type - GLOB.weighted_randomevent_locations[D] = D.viable_random_events.len - GLOB.weighted_mundaneevent_locations[D] = D.viable_mundane_events.len + GLOB.weighted_randomevent_locations[D] = length(D.viable_random_events) + GLOB.weighted_mundaneevent_locations[D] = length(D.viable_mundane_events) create_station_account() diff --git a/code/modules/flufftext/Hallucination.dm b/code/modules/flufftext/Hallucination.dm index ceff47b5b63c..4573052c29df 100644 --- a/code/modules/flufftext/Hallucination.dm +++ b/code/modules/flufftext/Hallucination.dm @@ -54,7 +54,7 @@ Gunshots/explosions/opening doors/less rare audio (done) slots_free += ui_datum.ui_storage1 if(!H.r_store) slots_free += ui_datum.ui_storage2 - if(slots_free.len) + if(length(slots_free)) halitem.screen_loc = pick(slots_free) halitem.layer = 50 switch(rand(1,6)) @@ -97,7 +97,7 @@ Gunshots/explosions/opening doors/less rare audio (done) var/list/possible_points = list() for(var/turf/open/floor/F in view(src,GLOB.world_view_size)) possible_points += F - if(possible_points.len) + if(length(possible_points)) var/turf/open/floor/target = pick(possible_points) switch(rand(1,3)) @@ -161,7 +161,7 @@ Gunshots/explosions/opening doors/less rare audio (done) var/list/possible_points = list() for(var/turf/open/floor/F in view(src,GLOB.world_view_size)) possible_points += F - if(possible_points.len) + if(length(possible_points)) var/turf/open/floor/target = pick(possible_points) switch(rand(1,3)) if(1) @@ -203,12 +203,12 @@ Gunshots/explosions/opening doors/less rare audio (done) "Play Charades","Oxygen","Inject BeAcOs","Ninja Lizards","Limit Break","Build Sentry") if(mid_txts) - while(mid_txts.len) + while(length(mid_txts)) var/mid_txt = pick(mid_txts) mocktxt += mid_txt mid_txts -= mid_txt - while(buttons.len) + while(length(buttons)) var/button = pick(buttons) @@ -356,7 +356,7 @@ GLOBAL_LIST_INIT(non_fakeattack_weapons, list(/obj/item/device/aicard,\ clone = H break //changed the code a bit. Less randomised, but less work to do. Should be ok, world.contents aren't stored in any particular order. -// if(!possible_clones.len) return +// if(!length(possible_clones)) return // clone = pick(possible_clones) if(!clone) return diff --git a/code/modules/flufftext/TextFilters.dm b/code/modules/flufftext/TextFilters.dm index f6b5c43384ee..2389d50fdc83 100644 --- a/code/modules/flufftext/TextFilters.dm +++ b/code/modules/flufftext/TextFilters.dm @@ -30,10 +30,10 @@ var/list/unstuttered_words = split_phrase.Copy() var/i = rand(1,3) - if(stunned) i = split_phrase.len + if(stunned) i = length(split_phrase) for(,i > 0,i--) //Pick a few words to stutter on. - if (!unstuttered_words.len) + if (!length(unstuttered_words)) break var/word = pick(unstuttered_words) unstuttered_words -= word //Remove from unstuttered words so we don't stutter it again. diff --git a/code/modules/hydroponics/grown_inedible.dm b/code/modules/hydroponics/grown_inedible.dm index 66478536b77b..0bc77ed2130f 100644 --- a/code/modules/hydroponics/grown_inedible.dm +++ b/code/modules/hydroponics/grown_inedible.dm @@ -24,7 +24,7 @@ for(var/rid in S.chems) var/list/reagent_data = S.chems[rid] var/rtotal = reagent_data[1] - if(reagent_data.len > 1 && potency > 0) + if(length(reagent_data) > 1 && potency > 0) rtotal += floor(potency/reagent_data[2]) reagents.add_reagent(rid,max(1,rtotal)) diff --git a/code/modules/hydroponics/hydro_tools.dm b/code/modules/hydroponics/hydro_tools.dm index 3603448a4f4f..570652a4195c 100644 --- a/code/modules/hydroponics/hydro_tools.dm +++ b/code/modules/hydroponics/hydro_tools.dm @@ -48,7 +48,7 @@ dat += "" dat += "
      Survivors
      Potency[grown_seed.potency]
      " - if(grown_reagents && grown_reagents.reagent_list && grown_reagents.reagent_list.len) + if(grown_reagents && LAZYLEN(grown_reagents.reagent_list)) dat += "

      Reagent Data

      " dat += "
      This sample contains: " for(var/datum/reagent/R in grown_reagents.reagent_list) @@ -64,8 +64,8 @@ else if(grown_seed.immutable > 0) dat += "This plant does not possess genetics that are alterable.
      " - if(grown_seed.products && grown_seed.products.len) - dat += "The mature plant will produce [grown_seed.products.len == 1 ? "fruit" : "[grown_seed.products.len] varieties of fruit"].
      " + if(LAZYLEN(grown_seed.products)) + dat += "The mature plant will produce [length(grown_seed.products) == 1 ? "fruit" : "[length(grown_seed.products)] varieties of fruit"].
      " if(grown_seed.requires_nutrients) if(grown_seed.nutrient_consumption < 0.05) @@ -83,7 +83,7 @@ else dat += "It requires a stable supply of water.
      " - if(grown_seed.mutants && grown_seed.mutants.len) + if(LAZYLEN(grown_seed.mutants)) dat += "It exhibits a high degree of potential subspecies shift.
      " dat += "It thrives in a temperature of [grown_seed.ideal_heat] Kelvin." diff --git a/code/modules/hydroponics/hydro_tray.dm b/code/modules/hydroponics/hydro_tray.dm index a3b75d0b21aa..98b7ff13b9a1 100644 --- a/code/modules/hydroponics/hydro_tray.dm +++ b/code/modules/hydroponics/hydro_tray.dm @@ -262,7 +262,7 @@ pestlevel = 0 // If enough time (in cycles, not ticks) has passed since the plant was harvested, we're ready to harvest again. - else if(seed.products && seed.products.len && age > seed.production && (age - lastproduce) > seed.production && (!harvest && !dead)) + else if(LAZYLEN(seed.products) && age > seed.production && (age - lastproduce) > seed.production && (!harvest && !dead)) harvest = 1 lastproduce = age @@ -448,7 +448,7 @@ return // Check if we should even bother working on the current seed datum. - if(seed.mutants && seed.mutants.len && severity > 1) + if(LAZYLEN(seed.mutants) && severity > 1) mutate_species() return diff --git a/code/modules/hydroponics/seed_datums.dm b/code/modules/hydroponics/seed_datums.dm index 7723052d2b3b..033bad3681d0 100644 --- a/code/modules/hydroponics/seed_datums.dm +++ b/code/modules/hydroponics/seed_datums.dm @@ -27,7 +27,7 @@ GLOBAL_LIST_EMPTY(gene_tag_masks) // Gene obfuscation for delicious trial and for(var/type in typesof(/datum/seed)-/datum/seed) var/datum/seed/S = new type GLOB.seed_types[S.name] = S - S.uid = "[GLOB.seed_types.len]" + S.uid = "[length(GLOB.seed_types)]" S.roundstart = 1 // Make sure any seed packets that were mapped in are updated @@ -45,7 +45,7 @@ GLOBAL_LIST_EMPTY(gene_tag_masks) // Gene obfuscation for delicious trial and var/list/gene_tags = list("products","consumption","environment","resistance","vigour","flowers") var/list/used_masks = list() - while(gene_tags && gene_tags.len) + while(LAZYLEN(gene_tags)) var/gene_tag = pick(gene_tags) var/gene_mask = "[num2hex(rand(0,255))] - [gene_tag]" @@ -250,7 +250,7 @@ GLOBAL_LIST_EMPTY(gene_tag_masks) // Gene obfuscation for delicious trial and ) for(var/x=1;x<=additional_chems;x++) - if(!possible_chems.len) + if(!length(possible_chems)) break var/new_chem = pick(possible_chems) possible_chems -= new_chem @@ -311,7 +311,7 @@ GLOBAL_LIST_EMPTY(gene_tag_masks) // Gene obfuscation for delicious trial and //Returns a key corresponding to an entry in the global seed list. /datum/seed/proc/get_mutant_variant() - if(!mutants || !mutants.len || immutable > 0) return 0 + if(!LAZYLEN(mutants) || immutable > 0) return 0 return pick(mutants) //Mutates the plant overall (randomly). @@ -400,7 +400,7 @@ GLOBAL_LIST_EMPTY(gene_tag_masks) // Gene obfuscation for delicious trial and //Splicing products has some detrimental effects on yield and lifespan. if("products") - if(gene.values.len < 6) return + if(length(gene.values) < 6) return if(yield > 0) yield = max(1,floor(yield*0.85)) if(endurance > 0) endurance = max(1,floor(endurance*0.85)) @@ -420,7 +420,7 @@ GLOBAL_LIST_EMPTY(gene_tag_masks) // Gene obfuscation for delicious trial and chems[rid] = gene_chem.Copy() continue - for(var/i=1;i<=gene_chem.len;i++) + for(var/i=1;i<=length(gene_chem);i++) if(isnull(gene_chem[i])) gene_chem[i] = 0 @@ -442,7 +442,7 @@ GLOBAL_LIST_EMPTY(gene_tag_masks) // Gene obfuscation for delicious trial and if("consumption") - if(gene.values.len < 7) return + if(length(gene.values) < 7) return consume_gasses = gene.values[1] requires_nutrients = gene.values[2] @@ -454,7 +454,7 @@ GLOBAL_LIST_EMPTY(gene_tag_masks) // Gene obfuscation for delicious trial and if("environment") - if(gene.values.len < 6) return + if(length(gene.values) < 6) return ideal_heat = gene.values[1] heat_tolerance = gene.values[2] @@ -465,7 +465,7 @@ GLOBAL_LIST_EMPTY(gene_tag_masks) // Gene obfuscation for delicious trial and if("resistance") - if(gene.values.len < 3) return + if(length(gene.values) < 3) return toxins_tolerance = gene.values[1] pest_tolerance = gene.values[2] @@ -473,7 +473,7 @@ GLOBAL_LIST_EMPTY(gene_tag_masks) // Gene obfuscation for delicious trial and if("vigour") - if(gene.values.len < 6) return + if(length(gene.values) < 6) return endurance = gene.values[1] yield = gene.values[2] @@ -484,7 +484,7 @@ GLOBAL_LIST_EMPTY(gene_tag_masks) // Gene obfuscation for delicious trial and if("flowers") - if(gene.values.len < 7) return + if(length(gene.values) < 7) return product_icon = gene.values[1] product_color = gene.values[2] @@ -571,7 +571,7 @@ GLOBAL_LIST_EMPTY(gene_tag_masks) // Gene obfuscation for delicious trial and return var/got_product - if(!isnull(products) && products.len && yield > 0) + if(LAZYLEN(products) && yield > 0) got_product = 1 if(!got_product && !harvest_sample) @@ -581,7 +581,7 @@ GLOBAL_LIST_EMPTY(gene_tag_masks) // Gene obfuscation for delicious trial and //This may be a new line. Update the global if it is. if(name == "new line" || !(name in GLOB.seed_types)) - uid = GLOB.seed_types.len + 1 + uid = length(GLOB.seed_types) + 1 name = "[uid]" GLOB.seed_types[name] = src diff --git a/code/modules/hydroponics/seed_machines/seed_editor.dm b/code/modules/hydroponics/seed_machines/seed_editor.dm index 37e25fb3508a..bfc059188d85 100644 --- a/code/modules/hydroponics/seed_machines/seed_editor.dm +++ b/code/modules/hydroponics/seed_machines/seed_editor.dm @@ -17,7 +17,7 @@ data["disk"] = loaded_disk - if(loaded_disk && loaded_disk.genes.len) + if(loaded_disk && length(loaded_disk.genes)) data["sourceName"] = loaded_disk.genesource for(var/datum/plantgene/P in loaded_disk.genes) diff --git a/code/modules/hydroponics/seed_machines/seed_machines.dm b/code/modules/hydroponics/seed_machines/seed_machines.dm index ad3fbed4625f..4bb07f590f4b 100644 --- a/code/modules/hydroponics/seed_machines/seed_machines.dm +++ b/code/modules/hydroponics/seed_machines/seed_machines.dm @@ -31,7 +31,7 @@ seed.forceMove(get_turf(src)) if(seed.seed.name == "new line" || isnull(GLOB.seed_types[seed.seed.name])) - seed.seed.uid = GLOB.seed_types.len + 1 + seed.seed.uid = length(GLOB.seed_types) + 1 seed.seed.name = "[seed.seed.uid]" GLOB.seed_types[seed.seed.name] = seed.seed @@ -75,7 +75,7 @@ else var/obj/item/disk/botany/B = W - if(B.genes && B.genes.len) + if(LAZYLEN(B.genes)) if(!disk_needs_genes) to_chat(user, SPAN_WARNING("That disk already has gene data loaded.")) return diff --git a/code/modules/hydroponics/vines.dm b/code/modules/hydroponics/vines.dm index 55c4908050e5..5e309919481c 100644 --- a/code/modules/hydroponics/vines.dm +++ b/code/modules/hydroponics/vines.dm @@ -156,7 +156,7 @@ H.updatehealth() // Inject some chems. - if(seed.chems && seed.chems.len && istype(H)) + if(LAZYLEN(seed.chems) && istype(H)) to_chat(H, SPAN_DANGER("You feel something seeping into your skin!")) for(var/rid in seed.chems) var/injecting = min(5,max(1,seed.potency/5)) @@ -175,7 +175,7 @@ // Update flower/product overlay. overlays.Cut() if(age >= seed.maturation) - if(prob(20) && seed.products && seed.products.len && !harvest && ((age-lastproduce) > seed.production)) + if(prob(20) && LAZYLEN(seed.products) && !harvest && ((age-lastproduce) > seed.production)) harvest = 1 lastproduce = age @@ -319,9 +319,9 @@ return // Check if we're too big for our own good. - if(vines.len >= (seed ? seed.potency * collapse_limit : 250) && !reached_collapse_size) + if(length(vines) >= (seed ? seed.potency * collapse_limit : 250) && !reached_collapse_size) reached_collapse_size = 1 - if(vines.len >= (seed ? seed.potency * slowdown_limit : 30) && !reached_slowdown_size ) + if(length(vines) >= (seed ? seed.potency * slowdown_limit : 30) && !reached_slowdown_size ) reached_slowdown_size = 1 var/length = 0 @@ -335,7 +335,7 @@ else length = 1 - length = min(30, max(length, vines.len/5)) + length = min(30, max(length, length(vines)/5)) // Update as many pieces of vine as we're allowed to. // Append updated vines to the end of the growth queue. diff --git a/code/modules/mapping/preloader.dm b/code/modules/mapping/preloader.dm index bd89d0e030a2..3f03522a2463 100644 --- a/code/modules/mapping/preloader.dm +++ b/code/modules/mapping/preloader.dm @@ -9,7 +9,7 @@ GLOBAL_LIST_INIT(_preloader_path, null) var/target_path /world/proc/preloader_setup(list/the_attributes, path) - if(the_attributes.len) + if(length(the_attributes)) GLOB.use_preloader = TRUE GLOB._preloader_attributes = the_attributes GLOB._preloader_path = path diff --git a/code/modules/mapping/reader.dm b/code/modules/mapping/reader.dm index 95e75d2d487e..d15e478f9488 100644 --- a/code/modules/mapping/reader.dm +++ b/code/modules/mapping/reader.dm @@ -795,8 +795,8 @@ GLOBAL_LIST_EMPTY(map_model_default) // We can skip calling this proc every time we see XXX if(!set_space \ && no_changeturf \ - && members_attributes.len == 2 \ - && members.len == 2 \ + && length(members_attributes) == 2 \ + && length(members) == 2 \ && members_attributes[1] == default_list \ && members_attributes[2] == default_list \ && members[2] == world.area \ @@ -878,8 +878,8 @@ GLOBAL_LIST_EMPTY(map_model_default) // We can skip calling this proc every time we see XXX if(!set_space \ && no_changeturf \ - && members.len == 2 \ - && members_attributes.len == 2 \ + && length(members) == 2 \ + && length(members_attributes) == 2 \ && length(members_attributes[1]) == 0 \ && length(members_attributes[2]) == 0 \ && (world.area in members) \ @@ -911,7 +911,7 @@ GLOBAL_LIST_EMPTY(map_model_default) //The next part of the code assumes there's ALWAYS an /area AND a /turf on a given tile //first instance the /area and remove it from the members list - index = members.len + index = length(members) var/area/old_area if(members[index] != /area/template_noop) if(members_attributes[index] != default_list) diff --git a/code/modules/mapping/space_management/traits.dm b/code/modules/mapping/space_management/traits.dm index 16eac0a98cf2..057511d9abaa 100644 --- a/code/modules/mapping/space_management/traits.dm +++ b/code/modules/mapping/space_management/traits.dm @@ -3,15 +3,15 @@ if (!isnum(z) || z < 1) return null if (z_list) - if (z > z_list.len) - stack_trace("Unmanaged z-level [z]! maxz = [world.maxz], z_list.len = [z_list.len]") + if (z > length(z_list)) + stack_trace("Unmanaged z-level [z]! maxz = [world.maxz], length(z_list) = [length(z_list)]") return list() var/datum/space_level/S = get_level(z) return S.traits[trait] else var/list/default = DEFAULT_MAP_TRAITS - if (z > default.len) - stack_trace("Unmanaged z-level [z]! maxz = [world.maxz], default.len = [default.len]") + if (z > length(default)) + stack_trace("Unmanaged z-level [z]! maxz = [world.maxz], length(default) = [length(default)]") return list() return default[z][DL_TRAITS][trait] diff --git a/code/modules/mapping/space_management/zlevel_manager.dm b/code/modules/mapping/space_management/zlevel_manager.dm index 2b96065929f8..1e3c3a1c42c4 100644 --- a/code/modules/mapping/space_management/zlevel_manager.dm +++ b/code/modules/mapping/space_management/zlevel_manager.dm @@ -6,12 +6,12 @@ z_list = list() var/list/default_map_traits = DEFAULT_MAP_TRAITS - if (default_map_traits.len != world.maxz) - WARNING("More or less map attributes pre-defined ([default_map_traits.len]) than existent z-levels ([world.maxz]). Ignoring the larger.") - if (default_map_traits.len > world.maxz) + if (length(default_map_traits) != world.maxz) + WARNING("More or less map attributes pre-defined ([length(default_map_traits)]) than existent z-levels ([world.maxz]). Ignoring the larger.") + if (length(default_map_traits) > world.maxz) default_map_traits.Cut(world.maxz + 1) - for (var/I in 1 to default_map_traits.len) + for (var/I in 1 to length(default_map_traits)) var/list/features = default_map_traits[I] var/datum/space_level/S = new(I, features[DL_NAME], features[DL_TRAITS]) manage_z_level(S, filled_with_space = FALSE) @@ -20,7 +20,7 @@ /datum/controller/subsystem/mapping/proc/add_new_zlevel(name, traits = list(), z_type = /datum/space_level, contain_turfs = TRUE) UNTIL(!adding_new_zlevel) adding_new_zlevel = TRUE - var/new_z = z_list.len + 1 + var/new_z = length(z_list) + 1 if (world.maxz < new_z) world.incrementMaxZ() CHECK_TICK @@ -34,6 +34,6 @@ return S /datum/controller/subsystem/mapping/proc/get_level(z) - if (z_list && z >= 1 && z <= z_list.len) + if (z_list && z >= 1 && z <= length(z_list)) return z_list[z] - CRASH("Unmanaged z-level [z]! maxz = [world.maxz], z_list.len = [z_list ? z_list.len : "null"]") + CRASH("Unmanaged z-level [z]! maxz = [world.maxz], length(z_list) = [z_list ? length(z_list) : "null"]") diff --git a/code/modules/mapping/verify.dm b/code/modules/mapping/verify.dm index 6c9d0318ef24..f3fdd61b0f5b 100644 --- a/code/modules/mapping/verify.dm +++ b/code/modules/mapping/verify.dm @@ -21,19 +21,19 @@ if(!loadable) html += "

      Not loadable: some tiles are missing their turfs or areas.

      " - if(bad_paths.len) + if(length(bad_paths)) html += "

      Bad paths:

        " for(var/path in bad_paths) var/list/keys = bad_paths[path] - html += "
      1. [path]: used in ([keys.len]): [keys.Join(", ")]" + html += "
      2. [path]: used in ([length(keys)]): [keys.Join(", ")]" html += "

      " - if(bad_keys.len) + if(length(bad_keys)) html += "

      Bad keys:

        " for(var/key in bad_keys) var/list/messages = bad_keys[key] html += "
      • [key]" - if(messages.len == 1) + if(length(messages) == 1) html += ": [bad_keys[key][1]]" else html += "
        • [messages.Join("
        • ")]
        " @@ -74,7 +74,7 @@ var/turfs = 0 var/areas = 0 - for(var/i in 1 to members.len) + for(var/i in 1 to length(members)) var/atom/path = members[i] turfs += ispath(path, /turf) @@ -91,7 +91,7 @@ LAZYADD(report.bad_keys[key], "[areas] areas instead of 1") // return the report - if(report.bad_paths.len || report.bad_keys.len || !report.loadable) + if(length(report.bad_paths) || length(report.bad_keys) || !report.loadable) // keep the report around so it can be referenced later report.tag = "mapreport_[++report.tag_number]" report.crashed = FALSE diff --git a/code/modules/mob/dead/observer/observer.dm b/code/modules/mob/dead/observer/observer.dm index 1112247380dd..d4db6bccde83 100644 --- a/code/modules/mob/dead/observer/observer.dm +++ b/code/modules/mob/dead/observer/observer.dm @@ -628,7 +628,7 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp var/value = SStechtree.trees[1] - if(trees.len > 1) + if(length(trees) > 1) value = tgui_input_list(src, "Choose which tree to enter", "Enter Tree", trees) if(!value) @@ -655,7 +655,7 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp for(var/turf/T in get_area_turfs(thearea.type)) L+=T - if(!L || !L.len) + if(!LAZYLEN(L)) to_chat(src, "No area available.") return @@ -879,7 +879,7 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp var/datum/hive_status/hive for(var/hivenumber in GLOB.hive_datum) hive = GLOB.hive_datum[hivenumber] - if(hive.totalXenos.len > 0) + if(length(hive.totalXenos) > 0) hives += list("[hive.name]" = hive.hivenumber) last_hive_checked = hive diff --git a/code/modules/mob/hear_say.dm b/code/modules/mob/hear_say.dm index 0d8d1ff0dc48..ef9ac4b6cfcc 100644 --- a/code/modules/mob/hear_say.dm +++ b/code/modules/mob/hear_say.dm @@ -18,7 +18,7 @@ if(!say_understands(speaker,language)) if(istype(speaker,/mob/living/simple_animal)) var/mob/living/simple_animal/S = speaker - if(S.speak.len) + if(length(S.speak)) message = pick(S.speak) else message = stars(message) @@ -189,7 +189,7 @@ var/list/punctuation = list(",", "!", ".", ";", "?") var/list/messages = splittext(message, " ") - var/R = rand(1, messages.len) + var/R = rand(1, length(messages)) var/heardword = messages[R] if(copytext(heardword,1, 1) in punctuation) heardword = copytext(heardword,2) diff --git a/code/modules/mob/holder.dm b/code/modules/mob/holder.dm index bcee5b81a100..cb8bbc11303b 100644 --- a/code/modules/mob/holder.dm +++ b/code/modules/mob/holder.dm @@ -15,7 +15,7 @@ /obj/item/holder/process() - if(istype(loc,/turf) || !(contents.len)) + if(istype(loc,/turf) || !(length(contents))) for(var/mob/M in contents) diff --git a/code/modules/mob/inventory.dm b/code/modules/mob/inventory.dm index c9837e144c1b..e1c3bf49af8a 100644 --- a/code/modules/mob/inventory.dm +++ b/code/modules/mob/inventory.dm @@ -340,7 +340,7 @@ if(WEAR_IN_BACK) if (src.back && isstorage(src.back)) var/obj/item/storage/B = src.back - if(B.contents.len < B.storage_slots && W.w_class <= B.max_w_class) + if(length(B.contents) < B.storage_slots && W.w_class <= B.max_w_class) W.forceMove(B) equipped = 1 if(WEAR_IN_SHOES) @@ -353,7 +353,7 @@ if(WEAR_IN_SCABBARD) if(src.back && istype(src.back, /obj/item/storage/large_holster)) var/obj/item/storage/large_holster/B = src.back - if(B.contents.len < B.storage_slots && W.w_class <= B.max_w_class) + if(length(B.contents) < B.storage_slots && W.w_class <= B.max_w_class) W.forceMove(B) equipped = 1 if(WEAR_IN_ACCESSORY) @@ -377,25 +377,25 @@ if(WEAR_IN_BELT) if(src.belt && isstorage(src.belt)) var/obj/item/storage/B = src.belt - if(B.contents.len < B.storage_slots && W.w_class <= B.max_w_class) + if(length(B.contents) < B.storage_slots && W.w_class <= B.max_w_class) W.forceMove(B) equipped = 1 if(WEAR_IN_J_STORE) if(src.s_store && isstorage(src.s_store)) var/obj/item/storage/B = src.s_store - if(B.contents.len < B.storage_slots && W.w_class <= B.max_w_class) + if(length(B.contents) < B.storage_slots && W.w_class <= B.max_w_class) W.forceMove(B) equipped = 1 if(WEAR_IN_L_STORE) if(src.l_store && istype(src.l_store, /obj/item/storage/pouch)) var/obj/item/storage/pouch/P = src.l_store - if(P.contents.len < P.storage_slots && W.w_class <= P.max_w_class) + if(length(P.contents) < P.storage_slots && W.w_class <= P.max_w_class) W.forceMove(P) equipped = 1 if(WEAR_IN_R_STORE) if(src.r_store && istype(src.r_store, /obj/item/storage/pouch)) var/obj/item/storage/pouch/P = src.r_store - if(P.contents.len < P.storage_slots && W.w_class <= P.max_w_class) + if(length(P.contents) < P.storage_slots && W.w_class <= P.max_w_class) W.forceMove(P) equipped = 1 diff --git a/code/modules/mob/language/language.dm b/code/modules/mob/language/language.dm index 0a2fbca787d6..45086aaeba8b 100644 --- a/code/modules/mob/language/language.dm +++ b/code/modules/mob/language/language.dm @@ -60,12 +60,12 @@ /datum/language/proc/add_to_cache(input, scrambled_text) // Add it to cache, cutting old entries if the list is too long scramble_cache[input] = scrambled_text - if(scramble_cache.len > SCRAMBLE_CACHE_LEN) - scramble_cache.Cut(1, scramble_cache.len-SCRAMBLE_CACHE_LEN-1) + if(length(scramble_cache) > SCRAMBLE_CACHE_LEN) + scramble_cache.Cut(1, length(scramble_cache)-SCRAMBLE_CACHE_LEN-1) /datum/language/proc/scramble(input) - if(!syllables || !syllables.len) + if(!LAZYLEN(syllables)) return stars(input) // If the input is cached already, move it to the end of the cache and return it diff --git a/code/modules/mob/language/language_handling.dm b/code/modules/mob/language/language_handling.dm index d9df36681261..c45ced8ad150 100644 --- a/code/modules/mob/language/language_handling.dm +++ b/code/modules/mob/language/language_handling.dm @@ -18,7 +18,7 @@ return 0 /mob/proc/get_default_language() - if (languages.len > 0) + if (length(languages) > 0) return languages[1] return null diff --git a/code/modules/mob/living/blood.dm b/code/modules/mob/living/blood.dm index 27d6f5ee4ccf..c2d0c63e3307 100644 --- a/code/modules/mob/living/blood.dm +++ b/code/modules/mob/living/blood.dm @@ -110,9 +110,9 @@ //An even amount of each plasma and blood type if(plasma == PLASMA_EGG) //Preserve hive_number for the possible larva - O.reagents.add_reagent(plasma, amount / plasmas.len, list("hive_number" = hivenumber)) + O.reagents.add_reagent(plasma, amount / length(plasmas), list("hive_number" = hivenumber)) else - O.reagents.add_reagent(plasma, amount / plasmas.len) + O.reagents.add_reagent(plasma, amount / length(plasmas)) blood_volume = max(0, blood_volume - amount) return 1 @@ -142,7 +142,7 @@ for(var/datum/disease/D in viruses) blood_data["viruses"] += D.Copy() - if(resistances && resistances.len) + if(LAZYLEN(resistances)) blood_data["resistances"] = resistances.Copy() return blood_data diff --git a/code/modules/mob/living/carbon/carbon.dm b/code/modules/mob/living/carbon/carbon.dm index 974312fc42f7..36d2518d7e75 100644 --- a/code/modules/mob/living/carbon/carbon.dm +++ b/code/modules/mob/living/carbon/carbon.dm @@ -482,7 +482,7 @@ /mob/living/carbon/on_stored_atom_del(atom/movable/AM) ..() - if(stomach_contents.len && ismob(AM)) + if(length(stomach_contents) && ismob(AM)) for(var/X in stomach_contents) if(AM == X) stomach_contents -= AM diff --git a/code/modules/mob/living/carbon/human/examine.dm b/code/modules/mob/living/carbon/human/examine.dm index dcbab12c7291..c8820ec3b97d 100644 --- a/code/modules/mob/living/carbon/human/examine.dm +++ b/code/modules/mob/living/carbon/human/examine.dm @@ -263,7 +263,7 @@ wound_flavor_text["[temp.display_name]"] += SPAN_WARNING(pick(" a lot of burns"," severe melting")) if(wound_flavor_text["[temp.display_name]"]) wound_flavor_text["[temp.display_name]"] += SPAN_WARNING("!\n") - else if(temp.wounds.len > 0) + else if(length(temp.wounds) > 0) var/list/wound_descriptors = list() for(var/datum/wound/W as anything in temp.wounds) if(W.internal && incision_depths[temp.name] == SURGERY_DEPTH_SURFACE) @@ -286,37 +286,37 @@ wound_descriptors[this_wound_desc] += W.amount continue wound_descriptors[this_wound_desc] = W.amount - if(wound_descriptors.len) + if(length(wound_descriptors)) var/list/flavor_text = list() var/list/no_exclude = list("gaping wound", "big gaping wound", "massive wound", "large bruise",\ "huge bruise", "massive bruise", "severe burn", "large burn", "deep burn", "carbonised area") for(var/wound in wound_descriptors) switch(wound_descriptors[wound]) if(1) - if(!flavor_text.len) + if(!length(flavor_text)) flavor_text += SPAN_WARNING("[t_He] has[prob(10) && !(wound in no_exclude) ? " what might be" : ""] a [wound]") else flavor_text += "[prob(10) && !(wound in no_exclude) ? " what might be" : ""] a [wound]" if(2) - if(!flavor_text.len) + if(!length(flavor_text)) flavor_text += SPAN_WARNING("[t_He] has[prob(10) && !(wound in no_exclude) ? " what might be" : ""] a pair of [wound]s") else flavor_text += "[prob(10) && !(wound in no_exclude) ? " what might be" : ""] a pair of [wound]s" if(3 to 5) - if(!flavor_text.len) + if(!length(flavor_text)) flavor_text += SPAN_WARNING("[t_He] has several [wound]s") else flavor_text += " several [wound]s" if(6 to INFINITY) - if(!flavor_text.len) + if(!length(flavor_text)) flavor_text += SPAN_WARNING("[t_He] has a bunch of [wound]s") else flavor_text += " a ton of [wound]\s" var/flavor_text_string = "" - for(var/text = 1, text <= flavor_text.len, text++) - if(text == flavor_text.len && flavor_text.len > 1) + for(var/text = 1, text <= length(flavor_text), text++) + if(text == length(flavor_text) && length(flavor_text) > 1) flavor_text_string += ", and" - else if(flavor_text.len > 1 && text > 1) + else if(length(flavor_text) > 1 && text > 1) flavor_text_string += "," flavor_text_string += flavor_text[text] flavor_text_string += " on [t_his] [temp.display_name].
        " diff --git a/code/modules/mob/living/carbon/human/exercise.dm b/code/modules/mob/living/carbon/human/exercise.dm index 3a2976da9130..9e01aa863244 100644 --- a/code/modules/mob/living/carbon/human/exercise.dm +++ b/code/modules/mob/living/carbon/human/exercise.dm @@ -83,7 +83,7 @@ Verbs related to getting fucking jacked, bro if(!get_limb(zone)) extremities.Remove(zone) - if(extremities.len < 8) + if(length(extremities) < 8) to_chat(src, SPAN_WARNING("How do you think you'll be able to do a pushup without two hands and feet to stand on? See a doctor!")) return FALSE diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm index 6db31ea6451a..62e2c7a01cd1 100644 --- a/code/modules/mob/living/carbon/human/human.dm +++ b/code/modules/mob/living/carbon/human/human.dm @@ -1000,8 +1000,8 @@ if(self) var/list/L = get_broken_limbs() - list("chest","head","groin") - if(L.len > 0) - msg += "Your [english_list(L)] [L.len > 1 ? "are" : "is"] broken\n" + if(length(L) > 0) + msg += "Your [english_list(L)] [length(L) > 1 ? "are" : "is"] broken\n" to_chat(usr,SPAN_NOTICE("You [self ? "take a moment to analyze yourself":"start analyzing [src]"]")) if(toxloss > 20) msg += "[self ? "Your" : "Their"] skin is slightly green\n" @@ -1404,13 +1404,13 @@ to_splint.Add(l) var/msg = "" // Have to use this because there are issues with the to_chat macros and text macros and quotation marks - if(to_splint.len) + if(length(to_splint)) if(do_after(user, HUMAN_STRIP_DELAY * user.get_skill_duration_multiplier(SKILL_MEDICAL), INTERRUPT_ALL, BUSY_ICON_GENERIC, target, INTERRUPT_MOVED, BUSY_ICON_GENERIC)) var/can_reach_splints = TRUE var/amount_removed = 0 if(wear_suit && istype(wear_suit,/obj/item/clothing/suit/space)) var/obj/item/clothing/suit/space/suit = target.wear_suit - if(suit.supporting_limbs && suit.supporting_limbs.len) + if(LAZYLEN(suit.supporting_limbs)) msg = "[user == target ? "your":"\proper [target]'s"]" to_chat(user, SPAN_WARNING("You cannot remove the splints, [msg] [suit] is supporting some of the breaks.")) can_reach_splints = FALSE diff --git a/code/modules/mob/living/carbon/human/human_damage.dm b/code/modules/mob/living/carbon/human/human_damage.dm index 49e490a33507..8a528df92de5 100644 --- a/code/modules/mob/living/carbon/human/human_damage.dm +++ b/code/modules/mob/living/carbon/human/human_damage.dm @@ -179,7 +179,7 @@ for(var/obj/limb/O in limbs) if(O.status & (LIMB_ROBOT|LIMB_DESTROYED|LIMB_MUTATED|LIMB_SYNTHSKIN)) continue candidates |= O - if(candidates.len) + if(length(candidates)) var/obj/limb/O = pick(candidates) O.mutate() to_chat(src, SPAN_NOTICE("Something is not right with your [O.display_name]...")) @@ -260,7 +260,7 @@ //It automatically updates health status /mob/living/carbon/human/heal_limb_damage(brute, burn) var/list/obj/limb/parts = get_damaged_limbs(brute,burn) - if(!parts.len) + if(!length(parts)) return var/obj/limb/picked = pick(parts) if(brute != 0) @@ -279,7 +279,7 @@ In most cases it makes more sense to use apply_damage() instead! And make sure t //It automatically updates health status /mob/living/carbon/human/take_limb_damage(brute, burn, sharp = 0, edge = 0) var/list/obj/limb/parts = get_damageable_limbs() - if(!parts.len) return + if(!length(parts)) return var/obj/limb/picked = pick(parts) if(brute != 0) apply_damage(brute, BRUTE, picked, sharp, edge) @@ -294,7 +294,7 @@ In most cases it makes more sense to use apply_damage() instead! And make sure t var/list/obj/limb/parts = get_damaged_limbs(brute,burn) var/update = 0 - while(parts.len && (brute>0 || burn>0) ) + while(length(parts) && (brute>0 || burn>0) ) var/obj/limb/picked = pick(parts) var/brute_was = picked.brute_dam diff --git a/code/modules/mob/living/carbon/human/human_defense.dm b/code/modules/mob/living/carbon/human/human_defense.dm index 930e31a7770f..09ce5bb9c149 100644 --- a/code/modules/mob/living/carbon/human/human_defense.dm +++ b/code/modules/mob/living/carbon/human/human_defense.dm @@ -194,7 +194,7 @@ Contains most of the procs that are called when a mob is attacked by something if((user != src) && check_shields(I.force, "the [I.name]")) return FALSE - if(I.attack_verb && I.attack_verb.len) + if(LAZYLEN(I.attack_verb)) visible_message(SPAN_DANGER("[src] has been [pick(I.attack_verb)] in the [hit_area] with [I.name] by [user]!"), null, null, 5) else visible_message(SPAN_DANGER("[src] has been attacked in the [hit_area] with [I.name] by [user]!"), null, null, 5) diff --git a/code/modules/mob/living/carbon/human/human_helpers.dm b/code/modules/mob/living/carbon/human/human_helpers.dm index 7b26b256e54b..cb6ba8137a00 100644 --- a/code/modules/mob/living/carbon/human/human_helpers.dm +++ b/code/modules/mob/living/carbon/human/human_helpers.dm @@ -369,7 +369,7 @@ /mob/living/carbon/human/proc/has_foreign_object() for(var/obj/limb/L in limbs) - if(L.implants && L.implants.len > 0) + if(LAZYLEN(L.implants) > 0) return TRUE for(var/obj/item/alien_embryo/A in contents) return TRUE diff --git a/code/modules/mob/living/carbon/human/human_movement.dm b/code/modules/mob/living/carbon/human/human_movement.dm index 7183d6c802b9..7cb2d04e67de 100644 --- a/code/modules/mob/living/carbon/human/human_movement.dm +++ b/code/modules/mob/living/carbon/human/human_movement.dm @@ -10,7 +10,7 @@ if(species.slowdown) . += species.slowdown - if(embedded_items.len > 0) + if(length(embedded_items) > 0) handle_embedded_objects() //Moving with objects stuck in you can cause bad times. var/reducible_tally = 0 //Tally elements that can be reduced are put here, then we apply MST effects diff --git a/code/modules/mob/living/carbon/human/life/handle_regular_hud_updates.dm b/code/modules/mob/living/carbon/human/life/handle_regular_hud_updates.dm index 0772d952d082..37750b5585ea 100644 --- a/code/modules/mob/living/carbon/human/life/handle_regular_hud_updates.dm +++ b/code/modules/mob/living/carbon/human/life/handle_regular_hud_updates.dm @@ -198,7 +198,7 @@ hud_used.slowed_icon.name = "" hud_used.slowed_icon.icon_state = "status_0" - var/is_embedded = embedded_items.len + var/is_embedded = length(embedded_items) if(is_embedded) hud_used.shrapnel_icon.name = "shrapnel" hud_used.shrapnel_icon.icon_state = "status_shrapnel" @@ -228,7 +228,7 @@ hud_used.tethered_icon.name = "" hud_used.tethered_icon.icon_state = "status_0" - if(active_transfusions.len) + if(length(active_transfusions)) hud_used.tethered_icon.name = "transfusion" hud_used.tethered_icon.icon_state = "status_blood" hud_used.tethered_icon.screen_loc = ui_datum.get_status_loc(status_effect_placement) diff --git a/code/modules/mob/living/carbon/human/say.dm b/code/modules/mob/living/carbon/human/say.dm index 230e178378ae..c95efd8a2995 100644 --- a/code/modules/mob/living/carbon/human/say.dm +++ b/code/modules/mob/living/carbon/human/say.dm @@ -158,7 +158,7 @@ for(var/mob/living/M in hearers(message_range, src)) if(M != src) - M.show_message(SPAN_NOTICE("[src] talks into [used_radios.len ? used_radios[1] : "the radio."]"), SHOW_MESSAGE_VISIBLE) + M.show_message(SPAN_NOTICE("[src] talks into [length(used_radios) ? used_radios[1] : "the radio."]"), SHOW_MESSAGE_VISIBLE) if(ishumansynth_strict(src)) playsound(src.loc, 'sound/effects/radiostatic.ogg', 15, 1) diff --git a/code/modules/mob/living/carbon/human/species/monkey.dm b/code/modules/mob/living/carbon/human/species/monkey.dm index 8e8d2443293d..2973e4b6a556 100644 --- a/code/modules/mob/living/carbon/human/species/monkey.dm +++ b/code/modules/mob/living/carbon/human/species/monkey.dm @@ -70,7 +70,7 @@ for(var/obj/O in range(1,get_turf(H))) if(O.Adjacent(H)) touchables += O - if(touchables.len) + if(length(touchables)) var/obj/touchy = pick(touchables) touchy.attack_hand(H) diff --git a/code/modules/mob/living/carbon/human/species/species.dm b/code/modules/mob/living/carbon/human/species/species.dm index 4e2a58190f98..42338c2c40a2 100644 --- a/code/modules/mob/living/carbon/human/species/species.dm +++ b/code/modules/mob/living/carbon/human/species/species.dm @@ -401,7 +401,7 @@ /datum/species/proc/get_offset_overlay_image(spritesheet, mob_icon, mob_state, color, slot) // If we don't actually need to offset this, don't bother with any of the generation/caching. - if(!spritesheet && equip_adjust.len && equip_adjust[slot] && LAZYLEN(equip_adjust[slot])) + if(!spritesheet && length(equip_adjust) && equip_adjust[slot] && LAZYLEN(equip_adjust[slot])) // Check the cache for previously made icons. var/image_key = "[mob_icon]-[mob_state]-[color]" diff --git a/code/modules/mob/living/carbon/human/update_icons.dm b/code/modules/mob/living/carbon/human/update_icons.dm index dfb903368503..6b2739780288 100644 --- a/code/modules/mob/living/carbon/human/update_icons.dm +++ b/code/modules/mob/living/carbon/human/update_icons.dm @@ -476,7 +476,7 @@ Applied by gun suicide and high impact bullet executions, removed by rejuvenate, apply_overlay(HEAD_SQUAD_LAYER) var/num_helmet_overlays = 0 - for(var/i in 1 to marine_helmet.helmet_overlays.len) + for(var/i in 1 to length(marine_helmet.helmet_overlays)) // Add small numbers to the head garb layer so we don't have a layer conflict // the i-1 bit is to make it 0-based, not 1-based like BYOND wants overlays_standing[HEAD_GARB_LAYER + (i-1)] = image('icons/mob/humans/onmob/helmet_garb.dmi', src, marine_helmet.helmet_overlays[i]) @@ -537,7 +537,7 @@ Applied by gun suicide and high impact bullet executions, removed by rejuvenate, overlays_standing[SUIT_SQUAD_LAYER] = squad_overlay apply_overlay(SUIT_SQUAD_LAYER) - if(marine_armor.armor_overlays.len) + if(length(marine_armor.armor_overlays)) var/image/K var/image/IMG for(var/i in marine_armor.armor_overlays) diff --git a/code/modules/mob/living/carbon/human/whisper.dm b/code/modules/mob/living/carbon/human/whisper.dm index 1293da617f24..eb5ec949cece 100644 --- a/code/modules/mob/living/carbon/human/whisper.dm +++ b/code/modules/mob/living/carbon/human/whisper.dm @@ -104,7 +104,7 @@ M << speech_bubble M.hear_say(message, verb, speaking, alt_name, italics, src) - if (eavesdropping.len) + if (length(eavesdropping)) var/new_message = stars(message) //hopefully passing the message twice through stars() won't hurt... I guess if you already don't understand the language, when they speak it too quietly to hear normally you would be able to catch even less. for(var/mob/M in eavesdropping) if(not_dead_speaker) @@ -120,7 +120,7 @@ for(var/mob/M in eavesdropping) if(M.client) M.client.images -= speech_bubble - if (watching.len) + if (length(watching)) var/rendered = "[src.name] whispers something." for (var/mob/M in watching) M.show_message(rendered, SHOW_MESSAGE_AUDIBLE) diff --git a/code/modules/mob/living/carbon/xenomorph/XenoProcs.dm b/code/modules/mob/living/carbon/xenomorph/XenoProcs.dm index 45edbfe7d9e3..f0fd8a4d86a7 100644 --- a/code/modules/mob/living/carbon/xenomorph/XenoProcs.dm +++ b/code/modules/mob/living/carbon/xenomorph/XenoProcs.dm @@ -15,7 +15,7 @@ if(3) fontsize_style = "large" - if(SSticker.mode && SSticker.mode.xenomorphs.len) //Send to only xenos in our gamemode list. This is faster than scanning all mobs + if(SSticker.mode && length(SSticker.mode.xenomorphs)) //Send to only xenos in our gamemode list. This is faster than scanning all mobs for(var/datum/mind/L in SSticker.mode.xenomorphs) var/mob/living/carbon/M = L.current if(M && istype(M) && !M.stat && M.client && (!hivenumber || M.hivenumber == hivenumber)) //Only living and connected xenos @@ -26,7 +26,7 @@ if(text == "" || !hivenumber) return //Logic - if(SSticker.mode && SSticker.mode.xenomorphs.len) //Send to only xenos in our gamemode list. This is faster than scanning all mobs + if(SSticker.mode && length(SSticker.mode.xenomorphs)) //Send to only xenos in our gamemode list. This is faster than scanning all mobs for(var/datum/mind/living in SSticker.mode.xenomorphs) var/mob/living/carbon/xenomorph/xeno = living.current if(istype(xeno) && !xeno.stat && xeno.client && xeno.hivenumber == hivenumber) //Only living and connected xenos @@ -370,13 +370,13 @@ //Bleuugh /mob/living/carbon/xenomorph/proc/empty_gut() - if(stomach_contents.len) + if(length(stomach_contents)) for(var/atom/movable/S in stomach_contents) stomach_contents.Remove(S) S.acid_damage = 0 //Reset the acid damage S.forceMove(get_true_turf(src)) - if(contents.len) //Get rid of anything that may be stuck inside us as well + if(length(contents)) //Get rid of anything that may be stuck inside us as well for(var/atom/movable/A in contents) A.forceMove(get_true_turf(src)) @@ -392,7 +392,7 @@ update_sight() /mob/living/carbon/xenomorph/proc/regurgitate(mob/living/victim, stuns = FALSE) - if(stomach_contents.len) + if(length(stomach_contents)) if(victim) stomach_contents.Remove(victim) victim.acid_damage = 0 diff --git a/code/modules/mob/living/carbon/xenomorph/abilities/ability_helper_procs.dm b/code/modules/mob/living/carbon/xenomorph/abilities/ability_helper_procs.dm index 0472dd9901b2..87657af5ce7a 100644 --- a/code/modules/mob/living/carbon/xenomorph/abilities/ability_helper_procs.dm +++ b/code/modules/mob/living/carbon/xenomorph/abilities/ability_helper_procs.dm @@ -289,7 +289,7 @@ for(var/turf/T in turflist) distance++ - if(!prev_turf && turflist.len > 1) + if(!prev_turf && length(turflist) > 1) prev_turf = get_turf(src) continue //So we don't burn the tile we be standin on diff --git a/code/modules/mob/living/carbon/xenomorph/abilities/general_powers.dm b/code/modules/mob/living/carbon/xenomorph/abilities/general_powers.dm index 4bd70a93684f..014cb3d2f24b 100644 --- a/code/modules/mob/living/carbon/xenomorph/abilities/general_powers.dm +++ b/code/modules/mob/living/carbon/xenomorph/abilities/general_powers.dm @@ -111,9 +111,9 @@ var/mob/living/carbon/xenomorph/X = owner if(!X.check_state()) return - for(var/i in 1 to X.caste.spit_types.len) + for(var/i in 1 to length(X.caste.spit_types)) if(X.ammo == GLOB.ammo_list[X.caste.spit_types[i]]) - if(i == X.caste.spit_types.len) + if(i == length(X.caste.spit_types)) X.ammo = GLOB.ammo_list[X.caste.spit_types[1]] else X.ammo = GLOB.ammo_list[X.caste.spit_types[i+1]] @@ -132,7 +132,7 @@ to_chat(X, SPAN_WARNING("We cannot regurgitate here.")) return - if(X.stomach_contents.len) + if(length(X.stomach_contents)) for(var/mob/living/M in X.stomach_contents) // Also has good reason to be a proc on all Xenos X.regurgitate(M, TRUE) @@ -367,7 +367,7 @@ SEND_SIGNAL(src, COMSIG_XENO_START_EMIT_PHEROMONES, pheromone) playsound(loc, "alien_drool", 25) - if(isqueen(src) && hive && hive.xeno_leader_list.len && anchored) + if(isqueen(src) && hive && length(hive.xeno_leader_list) && anchored) for(var/mob/living/carbon/xenomorph/L in hive.xeno_leader_list) L.handle_xeno_leader_pheromones() diff --git a/code/modules/mob/living/carbon/xenomorph/abilities/praetorian/praetorian_powers.dm b/code/modules/mob/living/carbon/xenomorph/abilities/praetorian/praetorian_powers.dm index d9e342c1f7e6..4d3a792af89a 100644 --- a/code/modules/mob/living/carbon/xenomorph/abilities/praetorian/praetorian_powers.dm +++ b/code/modules/mob/living/carbon/xenomorph/abilities/praetorian/praetorian_powers.dm @@ -69,7 +69,7 @@ current_mob.apply_armoured_damage(get_xeno_damage_slash(current_mob, damage), ARMOR_MELEE, BRUTE, null, 20) playsound(current_mob, 'sound/weapons/alien_tail_attack.ogg', 30, TRUE) - if (target_mobs.len >= shield_regen_threshold) + if (length(target_mobs) >= shield_regen_threshold) var/datum/behavior_delegate/praetorian_vanguard/behavior = source_xeno.behavior_delegate if (istype(behavior)) behavior.regen_shield() @@ -133,7 +133,7 @@ H.apply_armoured_damage(get_xeno_damage_slash(H, damage), ARMOR_MELEE, BRUTE) playsound(get_turf(H), "alien_claw_flesh", 30, 1) - if (target_mobs.len >= shield_regen_threshold) + if (length(target_mobs) >= shield_regen_threshold) var/datum/behavior_delegate/praetorian_vanguard/behavior = X.behavior_delegate if (istype(behavior)) behavior.regen_shield() diff --git a/code/modules/mob/living/carbon/xenomorph/abilities/queen/queen_powers.dm b/code/modules/mob/living/carbon/xenomorph/abilities/queen/queen_powers.dm index 0ee1cf6b3c27..381acba92a51 100644 --- a/code/modules/mob/living/carbon/xenomorph/abilities/queen/queen_powers.dm +++ b/code/modules/mob/living/carbon/xenomorph/abilities/queen/queen_powers.dm @@ -216,8 +216,8 @@ return var/datum/hive_status/hive = X.hive if(X.observed_xeno) - if(!hive.open_xeno_leader_positions.len && X.observed_xeno.hive_pos == NORMAL_XENO) - to_chat(X, SPAN_XENOWARNING("You currently have [hive.xeno_leader_list.len] promoted leaders. You may not maintain additional leaders until your power grows.")) + if(!length(hive.open_xeno_leader_positions) && X.observed_xeno.hive_pos == NORMAL_XENO) + to_chat(X, SPAN_XENOWARNING("You currently have [length(hive.xeno_leader_list)] promoted leaders. You may not maintain additional leaders until your power grows.")) return var/mob/living/carbon/xenomorph/T = X.observed_xeno if(T == X) @@ -239,12 +239,12 @@ for(var/mob/living/carbon/xenomorph/T in hive.xeno_leader_list) possible_xenos += T - if(possible_xenos.len > 1) + if(length(possible_xenos) > 1) var/mob/living/carbon/xenomorph/selected_xeno = tgui_input_list(X, "Target", "Watch which leader?", possible_xenos, theme="hive_status") if(!selected_xeno || selected_xeno.hive_pos == NORMAL_XENO || selected_xeno == X.observed_xeno || selected_xeno.stat == DEAD || selected_xeno.z != X.z || !X.check_state()) return X.overwatch(selected_xeno) - else if(possible_xenos.len) + else if(length(possible_xenos)) X.overwatch(possible_xenos[1]) else to_chat(X, SPAN_XENOWARNING("There are no Xenomorph leaders. Overwatch a Xenomorph to make it a leader.")) diff --git a/code/modules/mob/living/carbon/xenomorph/castes/Crusher.dm b/code/modules/mob/living/carbon/xenomorph/castes/Crusher.dm index 7ccab754d6dd..24ac22d6bc52 100644 --- a/code/modules/mob/living/carbon/xenomorph/castes/Crusher.dm +++ b/code/modules/mob/living/carbon/xenomorph/castes/Crusher.dm @@ -184,7 +184,7 @@ . = FALSE else if (O.anchored) visible_message(SPAN_DANGER("[src] crushes [O]!"), SPAN_XENODANGER("We crush [O]!")) - if(O.contents.len) //Hopefully won't auto-delete things inside crushed stuff. + if(length(O.contents)) //Hopefully won't auto-delete things inside crushed stuff. var/turf/T = get_turf(src) for(var/atom/movable/S in T.contents) S.forceMove(T) diff --git a/code/modules/mob/living/carbon/xenomorph/castes/Queen.dm b/code/modules/mob/living/carbon/xenomorph/castes/Queen.dm index 532f77d1bec2..a66903a938c5 100644 --- a/code/modules/mob/living/carbon/xenomorph/castes/Queen.dm +++ b/code/modules/mob/living/carbon/xenomorph/castes/Queen.dm @@ -534,14 +534,14 @@ if(egg_amount >= 1) if(isturf(loc)) var/turf/T = loc - if(T.contents.len <= 25) //so we don't end up with a million object on that turf. + if(length(T.contents) <= 25) //so we don't end up with a million object on that turf. egg_amount-- new /obj/item/xeno_egg(loc, hivenumber) /mob/living/carbon/xenomorph/queen/get_status_tab_items() . = ..() var/stored_larvae = GLOB.hive_datum[hivenumber].stored_larva - var/xeno_leader_num = hive?.queen_leader_limit - hive?.open_xeno_leader_positions.len + var/xeno_leader_num = hive?.queen_leader_limit - length(hive?.open_xeno_leader_positions) . += "Pooled Larvae: [stored_larvae]" . += "Leaders: [xeno_leader_num] / [hive?.queen_leader_limit]" diff --git a/code/modules/mob/living/carbon/xenomorph/damage_procs.dm b/code/modules/mob/living/carbon/xenomorph/damage_procs.dm index 2b1ef0aca867..4c97ce20b4eb 100644 --- a/code/modules/mob/living/carbon/xenomorph/damage_procs.dm +++ b/code/modules/mob/living/carbon/xenomorph/damage_procs.dm @@ -54,7 +54,7 @@ last_damage_data = istype(cause_data) ? cause_data : create_cause_data(cause_data) - if(severity > EXPLOSION_THRESHOLD_LOW && stomach_contents.len) + if(severity > EXPLOSION_THRESHOLD_LOW && length(stomach_contents)) for(var/mob/M in stomach_contents) M.ex_act(severity - EXPLOSION_THRESHOLD_LOW, last_damage_data, pierce) @@ -170,7 +170,7 @@ return var/shielded = FALSE - if(xeno_shields.len != 0 && damage > 0) + if(length(xeno_shields) != 0 && damage > 0) shielded = TRUE for(var/datum/xeno_shield/XS in xeno_shields) damage = XS.on_hit(damage) diff --git a/code/modules/mob/living/carbon/xenomorph/hive_status.dm b/code/modules/mob/living/carbon/xenomorph/hive_status.dm index 4782bcd8b288..9c8b54dad483 100644 --- a/code/modules/mob/living/carbon/xenomorph/hive_status.dm +++ b/code/modules/mob/living/carbon/xenomorph/hive_status.dm @@ -292,15 +292,15 @@ //No leaders for a Hive without a Queen! queen_leader_limit = living_xeno_queen ? 4 : 0 - if (xeno_leader_list.len > queen_leader_limit) + if (length(xeno_leader_list) > queen_leader_limit) var/diff = 0 - for (var/i in queen_leader_limit + 1 to xeno_leader_list.len) + for (var/i in queen_leader_limit + 1 to length(xeno_leader_list)) if(!open_xeno_leader_positions.Remove(i)) remove_hive_leader(xeno_leader_list[i]) diff++ xeno_leader_list.len -= diff // Changing the size of xeno_leader_list needs to go at the end or else it won't iterate through the list properly - else if (xeno_leader_list.len < queen_leader_limit) - for (var/i in xeno_leader_list.len + 1 to queen_leader_limit) + else if (length(xeno_leader_list) < queen_leader_limit) + for (var/i in length(xeno_leader_list) + 1 to queen_leader_limit) open_xeno_leader_positions += i xeno_leader_list.len++ @@ -309,7 +309,7 @@ /datum/hive_status/proc/add_hive_leader(mob/living/carbon/xenomorph/xeno) if(!xeno) return FALSE //How did this even happen? - if(!open_xeno_leader_positions.len) + if(!length(open_xeno_leader_positions)) return FALSE //Too many leaders already (no available xeno leader positions) if(xeno.hive_pos != NORMAL_XENO) return FALSE //Already on the list @@ -342,7 +342,7 @@ // Need to maintain ascending order of open_xeno_leader_positions for (var/i in 1 to queen_leader_limit) - if (i > open_xeno_leader_positions.len || open_xeno_leader_positions[i] > leader_num) + if (i > length(open_xeno_leader_positions) || open_xeno_leader_positions[i] > leader_num) open_xeno_leader_positions.Insert(i, leader_num) break @@ -626,7 +626,7 @@ /datum/hive_status/proc/has_structure(structure_name) if(!structure_name) return FALSE - if(hive_structures[structure_name] && hive_structures[structure_name].len) + if(LAZYLEN(hive_structures[structure_name])) return TRUE return FALSE @@ -636,7 +636,7 @@ var/name_ref = initial(S.template.name) if(!hive_constructions[name_ref]) hive_constructions[name_ref] = list() - if(hive_constructions[name_ref].len >= hive_structures_limit[name_ref]) + if(length(hive_constructions[name_ref]) >= hive_structures_limit[name_ref]) return FALSE hive_constructions[name_ref] += src return TRUE @@ -654,7 +654,7 @@ var/name_ref = initial(S.name) if(!hive_structures[name_ref]) hive_structures[name_ref] = list() - if(hive_structures[name_ref].len >= hive_structures_limit[name_ref]) + if(length(hive_structures[name_ref]) >= hive_structures_limit[name_ref]) return FALSE hive_structures[name_ref] += S return TRUE @@ -667,9 +667,9 @@ return TRUE /datum/hive_status/proc/has_special_structure(name_ref) - if(!name_ref || !hive_structures[name_ref] || !hive_structures[name_ref].len) + if(!name_ref || !LAZYLEN(hive_structures[name_ref])) return 0 - return hive_structures[name_ref].len + return length(hive_structures[name_ref]) /datum/hive_status/proc/abandon_on_hijack() var/area/hijacked_dropship = get_area(living_xeno_queen) @@ -686,7 +686,7 @@ if(get_area(xeno) != hijacked_dropship && xeno.loc && is_ground_level(xeno.loc.z)) if(isfacehugger(xeno) || islesserdrone(xeno)) to_chat(xeno, SPAN_XENOANNOUNCE("The Queen has left without you, you quickly find a hiding place to enter hibernation as you lose touch with the hive mind.")) - if(xeno.stomach_contents.len) + if(length(xeno.stomach_contents)) xeno.devour_timer = 0 xeno.handle_stomach_contents() qdel(xeno) @@ -696,7 +696,7 @@ xeno.set_hive_and_update(XENO_HIVE_FORSAKEN) else to_chat(xeno, SPAN_XENOANNOUNCE("The Queen has left without you, you quickly find a hiding place to enter hibernation as you lose touch with the hive mind.")) - if(xeno.stomach_contents.len) + if(length(xeno.stomach_contents)) xeno.devour_timer = 0 xeno.handle_stomach_contents() qdel(xeno) @@ -847,7 +847,7 @@ var/time_left = floor((user.timeofdeath + JOIN_AS_FACEHUGGER_DELAY - world.time) / 10) to_chat(user, SPAN_WARNING("You ghosted too recently. You cannot become a facehugger until 3 minutes have passed ([time_left] seconds remaining).")) return FALSE - if(totalXenos.len <= 0) + if(length(totalXenos) <= 0) //This is to prevent people from joining as Forsaken Huggers on the pred ship to_chat(user, SPAN_WARNING("The hive has fallen, you can't join it!")) return FALSE @@ -910,7 +910,7 @@ to_chat(user, SPAN_WARNING("You ghosted too recently. You cannot become a lesser drone until 30 seconds have passed ([time_left] seconds remaining).")) return FALSE - if(totalXenos.len <= 0) + if(length(totalXenos) <= 0) to_chat(user, SPAN_WARNING("The hive has fallen, you can't join it!")) return FALSE diff --git a/code/modules/mob/living/carbon/xenomorph/life.dm b/code/modules/mob/living/carbon/xenomorph/life.dm index a6fd0d15877d..1657d078ffda 100644 --- a/code/modules/mob/living/carbon/xenomorph/life.dm +++ b/code/modules/mob/living/carbon/xenomorph/life.dm @@ -220,7 +220,7 @@ /mob/living/carbon/xenomorph/proc/handle_stomach_contents() //Deal with dissolving/damaging stuff in stomach. - if(stomach_contents.len) + if(length(stomach_contents)) for(var/atom/movable/M in stomach_contents) if(ishuman(M)) if(world.time > devour_timer - 50 && world.time < devour_timer - 30) @@ -481,7 +481,7 @@ Make sure their actual health updates immediately.*/ if(status_flags & GODMODE) health = maxHealth set_stat(CONSCIOUS) - else if(xeno_shields.len != 0) + else if(length(xeno_shields) != 0) overlay_shields() health = maxHealth - getFireLoss() - getBruteLoss() else diff --git a/code/modules/mob/living/carbon/xenomorph/say.dm b/code/modules/mob/living/carbon/xenomorph/say.dm index 2c9404b745ef..9f99cdb45455 100644 --- a/code/modules/mob/living/carbon/xenomorph/say.dm +++ b/code/modules/mob/living/carbon/xenomorph/say.dm @@ -22,14 +22,14 @@ var/datum/language/speaking = null if(length(message) >= 2) - if(can_hivemind_speak && copytext(message,1,2) == ";" && languages.len) + if(can_hivemind_speak && copytext(message,1,2) == ";" && length(languages)) for(var/datum/language/L in languages) if(L.flags & HIVEMIND) verb = L.speech_verb speaking = L break var/channel_prefix = copytext(message, 1, 3) - if(languages.len) + if(length(languages)) for(var/datum/language/L in languages) if(lowertext(channel_prefix) == ":[L.key]" || lowertext(channel_prefix) == ".[L.key]") verb = L.speech_verb diff --git a/code/modules/mob/living/carbon/xenomorph/strains/castes/runner/acid.dm b/code/modules/mob/living/carbon/xenomorph/strains/castes/runner/acid.dm index 6983942fb562..0fdaa264bd99 100644 --- a/code/modules/mob/living/carbon/xenomorph/strains/castes/runner/acid.dm +++ b/code/modules/mob/living/carbon/xenomorph/strains/castes/runner/acid.dm @@ -96,7 +96,7 @@ var/amplitude = 50 + 50 * (caboom_timer - caboom_left) / caboom_timer playsound(bound_xeno, caboom_sound[caboom_loop], amplitude, FALSE, 10) caboom_loop++ - if(caboom_loop > caboom_sound.len) + if(caboom_loop > length(caboom_sound)) caboom_loop = 1 if(caboom_left <= 0) caboom_trigger = FALSE diff --git a/code/modules/mob/living/carbon/xenomorph/xeno_helpers.dm b/code/modules/mob/living/carbon/xenomorph/xeno_helpers.dm index 8b3487b7a878..2414d077b1c0 100644 --- a/code/modules/mob/living/carbon/xenomorph/xeno_helpers.dm +++ b/code/modules/mob/living/carbon/xenomorph/xeno_helpers.dm @@ -2,7 +2,7 @@ return (mob_size < MOB_SIZE_BIG && caste.can_vent_crawl) /mob/living/carbon/xenomorph/ventcrawl_carry() - if(stomach_contents.len) + if(length(stomach_contents)) for(var/mob/living/carbon/human/H in stomach_contents) if(!isspeciesmonkey(H)) to_chat(src, SPAN_XENOWARNING("You cannot ventcrawl with [H] inside you!")) diff --git a/code/modules/mob/living/living.dm b/code/modules/mob/living/living.dm index 9500d0a30e37..5f917cf6e0d5 100644 --- a/code/modules/mob/living/living.dm +++ b/code/modules/mob/living/living.dm @@ -66,7 +66,7 @@ /mob/living/proc/burn_skin(burn_amount) if(ishuman(src)) 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 - var/divided_damage = (burn_amount)/(H.limbs.len) + var/divided_damage = (burn_amount)/(length(H.limbs)) var/extradam = 0 //added to when organ is at max dam for(var/obj/limb/affecting in H.limbs) if(!affecting) continue @@ -472,7 +472,7 @@ /mob/living/create_clone_movable(shift_x, shift_y) ..() - src.clone.hud_list = new /list(src.hud_list.len) + src.clone.hud_list = new /list(length(src.hud_list)) for(var/h in src.hud_possible) //Clone HUD src.clone.hud_list[h] = new /image("loc" = src.clone, "icon" = src.hud_list[h].icon) diff --git a/code/modules/mob/living/living_healthscan.dm b/code/modules/mob/living/living_healthscan.dm index b26be6c0d585..6739e7046761 100644 --- a/code/modules/mob/living/living_healthscan.dm +++ b/code/modules/mob/living/living_healthscan.dm @@ -439,7 +439,7 @@ GLOBAL_LIST_INIT(known_implants, subtypesof(/obj/item/implant)) "icon" = "window-close", "color" = "red" )) - if(advice.len) + if(length(advice)) data["advice"] = advice else data["advice"] = null // interstingly even if we don't set data at all, re-using UI that had this data still has it @@ -457,7 +457,7 @@ GLOBAL_LIST_INIT(known_implants, subtypesof(/obj/item/implant)) "cure" = disease.cure ) diseases += list(current_disease) - if(diseases.len) + if(length(diseases)) data["diseases"] = diseases else data["diseases"] = null // interstingly even if we don't set data at all, re-using UI that had this data still has it @@ -633,7 +633,7 @@ GLOBAL_LIST_INIT(known_implants, subtypesof(/obj/item/implant)) if(ishuman(src)) var/mob/living/carbon/human/H = src - if(H.embedded_items.len > 0) + if(length(H.embedded_items) > 0) embedded_item_detected = TRUE var/core_fracture = 0 @@ -665,7 +665,7 @@ GLOBAL_LIST_INIT(known_implants, subtypesof(/obj/item/implant)) reagentdata["[R.id]"] = "[R.overdose != 0 && R.volume > R.overdose && !(R.flags & REAGENT_CANNOT_OVERDOSE) ? SPAN_WARNING("OD: ") : ""] [round(R.volume, 1)]u [R.name]" else unknown++ - if(reagentdata.len) + if(length(reagentdata)) dat += "\n\tBeneficial reagents:\n" for(var/d in reagentdata) dat += "\t\t [reagentdata[d]]\n" diff --git a/code/modules/mob/living/login.dm b/code/modules/mob/living/login.dm index 50ea9e7a62e3..2bae197050dc 100644 --- a/code/modules/mob/living/login.dm +++ b/code/modules/mob/living/login.dm @@ -6,7 +6,7 @@ ..() - if(pipes_shown && pipes_shown.len) //ventcrawling, need to reapply pipe vision + if(LAZYLEN(pipes_shown)) //ventcrawling, need to reapply pipe vision var/obj/structure/pipes/A = loc if(istype(A)) //a sanity check just to be safe remove_ventcrawl() 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 b85f188558b1..47b54196301d 100644 --- a/code/modules/mob/living/simple_animal/friendly/farm_animals.dm +++ b/code/modules/mob/living/simple_animal/friendly/farm_animals.dm @@ -39,10 +39,10 @@ . = ..() if(.) //chance to go crazy and start wacking stuff - if(!enemies.len && prob(1)) + if(!length(enemies) && prob(1)) Retaliate() - if(enemies.len && prob(10)) + if(length(enemies) && prob(10)) enemies = list() LoseTarget() src.visible_message(SPAN_NOTICE("[src] calms down.")) diff --git a/code/modules/mob/living/simple_animal/hostile/retaliate/retaliate.dm b/code/modules/mob/living/simple_animal/hostile/retaliate/retaliate.dm index 79abd5cc7e0d..4c16c60d4835 100644 --- a/code/modules/mob/living/simple_animal/hostile/retaliate/retaliate.dm +++ b/code/modules/mob/living/simple_animal/hostile/retaliate/retaliate.dm @@ -13,7 +13,7 @@ enemies -= L /mob/living/simple_animal/hostile/retaliate/ListTargets() - if(!enemies.len) + if(!length(enemies)) return list() var/list/see = ..() see &= enemies // Remove all entries that aren't in enemies diff --git a/code/modules/mob/living/simple_animal/parrot.dm b/code/modules/mob/living/simple_animal/parrot.dm index 14f220b3a77f..feb70f6f1b79 100644 --- a/code/modules/mob/living/simple_animal/parrot.dm +++ b/code/modules/mob/living/simple_animal/parrot.dm @@ -122,7 +122,7 @@ switch(remove_from) if("ears") if(ears) - if(available_channels.len) + if(length(available_channels)) src.say("[pick(available_channels)] BAWWWWWK LEAVE THE HEADSET BAWKKKKK!") else src.say("BAWWWWWK LEAVE THE HEADSET BAWKKKKK!") @@ -276,8 +276,8 @@ Phrases that the parrot hears in mob/living/say() get added to speach_buffer. Every once in a while, the parrot picks one of the lines from the buffer and replaces an element of the 'speech' list. Then it clears the buffer to make sure they dont magically remember something from hours ago. */ - if(speech_buffer.len && prob(10)) - if(speak.len) + if(length(speech_buffer) && prob(10)) + if(length(speak)) speak.Remove(pick(speak)) speak.Add(pick(speech_buffer)) @@ -304,10 +304,10 @@ parrot_sleep_dur = parrot_sleep_max //Cycle through message modes for the headset - if(speak.len) + if(length(speak)) var/list/newspeak = list() - if(available_channels.len && src.ears) + if(length(available_channels) && src.ears) for(var/possible_phrase in speak) //50/50 chance to not use the radio at all @@ -685,7 +685,7 @@ return var/verb = "says" - if(speak_emote.len) + if(length(speak_emote)) verb = pick(speak_emote) diff --git a/code/modules/mob/living/simple_animal/simple_animal.dm b/code/modules/mob/living/simple_animal/simple_animal.dm index 652ee4c44024..f3b8da1a2d76 100644 --- a/code/modules/mob/living/simple_animal/simple_animal.dm +++ b/code/modules/mob/living/simple_animal/simple_animal.dm @@ -109,33 +109,33 @@ //Speaking if(!client && speak_chance) if(rand(0,200) < speak_chance) - if(speak && speak.len) - if((emote_hear && emote_hear.len) || (emote_see && emote_see.len)) - var/length = speak.len - if(emote_hear && emote_hear.len) - length += emote_hear.len - if(emote_see && emote_see.len) - length += emote_see.len + if(LAZYLEN(speak)) + if(LAZYLEN(emote_hear) || LAZYLEN(emote_see)) + var/length = length(speak) + if(LAZYLEN(emote_hear)) + length += length(emote_hear) + if(LAZYLEN(emote_see)) + length += length(emote_see) var/randomValue = rand(1,length) - if(randomValue <= speak.len) + if(randomValue <= length(speak)) INVOKE_ASYNC(src, PROC_REF(say), pick(speak)) else - randomValue -= speak.len - if(emote_see && randomValue <= emote_see.len) + randomValue -= length(speak) + if(emote_see && randomValue <= length(emote_see)) INVOKE_ASYNC(src, PROC_REF(manual_emote), pick(emote_see),1) else INVOKE_ASYNC(src, PROC_REF(manual_emote), pick(emote_hear),2) else INVOKE_ASYNC(src, PROC_REF(say), pick(speak)) else - if(!(emote_hear && emote_hear.len) && (emote_see && emote_see.len)) + if(!LAZYLEN(emote_hear) && LAZYLEN(emote_see)) INVOKE_ASYNC(src, PROC_REF(manual_emote), pick(emote_see),1) - if((emote_hear && emote_hear.len) && !(emote_see && emote_see.len)) + if(LAZYLEN(emote_hear) && !LAZYLEN(emote_see)) INVOKE_ASYNC(src, PROC_REF(manual_emote), pick(emote_hear),2) - if((emote_hear && emote_hear.len) && (emote_see && emote_see.len)) - var/length = emote_hear.len + emote_see.len + if(LAZYLEN(emote_hear) && LAZYLEN(emote_see)) + var/length = length(emote_hear) + length(emote_see) var/pick = rand(1,length) - if(pick <= emote_see.len) + if(pick <= length(emote_see)) INVOKE_ASYNC(src, PROC_REF(manual_emote), pick(emote_see),1) else INVOKE_ASYNC(src, PROC_REF(manual_emote), pick(emote_hear),2) @@ -352,7 +352,7 @@ var/verb = "says" - if(speak_emote.len) + if(length(speak_emote)) verb = pick(speak_emote) message = capitalize(trim_left(message)) diff --git a/code/modules/mob/mob.dm b/code/modules/mob/mob.dm index 8a792943e345..0a24468cc176 100644 --- a/code/modules/mob/mob.dm +++ b/code/modules/mob/mob.dm @@ -771,7 +771,7 @@ note dizziness decrements automatically in the mob's Life() proc. else visible_message(SPAN_WARNING("[usr] rips [selection] out of [src]'s body."),SPAN_WARNING("[usr] rips [selection] out of your body."), null, 5) - if(valid_objects.len == 1) //Yanking out last object - removing verb. + if(length(valid_objects) == 1) //Yanking out last object - removing verb. remove_verb(src, /mob/proc/yank_out_object) if(ishuman(src)) diff --git a/code/modules/mob/mob_defines.dm b/code/modules/mob/mob_defines.dm index 4b3d2257eb9e..9806e5ce949c 100644 --- a/code/modules/mob/mob_defines.dm +++ b/code/modules/mob/mob_defines.dm @@ -397,7 +397,7 @@ if(!check_rights(R_SPAWN)) return - if(!languages.len) + if(!length(languages)) to_chat(usr, "This mob knows no languages.") return diff --git a/code/modules/mob/mob_grab.dm b/code/modules/mob/mob_grab.dm index b6f2871e0370..9dcdae3635cb 100644 --- a/code/modules/mob/mob_grab.dm +++ b/code/modules/mob/mob_grab.dm @@ -119,7 +119,7 @@ if(pulled.stat == DEAD && !pulled.chestburst) to_chat(xeno, SPAN_WARNING("Ew, [pulled] is already starting to rot.")) return 0 - if(xeno.stomach_contents.len) //Only one thing in the stomach at a time, please + if(length(xeno.stomach_contents)) //Only one thing in the stomach at a time, please to_chat(xeno, SPAN_WARNING("You already have something in your belly, there's no way that will fit.")) return 0 /* Saving this in case we want to allow devouring of dead bodies UNLESS their client is still online somewhere @@ -138,10 +138,10 @@ if(HAS_TRAIT(xeno, TRAIT_CLOAKED)) //cloaked don't show the visible message, so we gotta work around to_chat(pulled, FONT_SIZE_HUGE(SPAN_DANGER("[xeno] is trying to devour you!"))) if(do_after(xeno, 50, INTERRUPT_NO_NEEDHAND, BUSY_ICON_HOSTILE)) - if(isxeno(pulled.loc) && !xeno.stomach_contents.len) + if(isxeno(pulled.loc) && !length(xeno.stomach_contents)) to_chat(xeno, SPAN_WARNING("Someone already ate \the [pulled].")) return 0 - if(xeno.pulling == pulled && !pulled.buckled && (pulled.stat != DEAD || pulled.chestburst) && !xeno.stomach_contents.len) //make sure you've still got them in your claws, and alive + if(xeno.pulling == pulled && !pulled.buckled && (pulled.stat != DEAD || pulled.chestburst) && !length(xeno.stomach_contents)) //make sure you've still got them in your claws, and alive if(SEND_SIGNAL(pulled, COMSIG_MOB_DEVOURED, xeno) & COMPONENT_CANCEL_DEVOUR) return FALSE diff --git a/code/modules/mob/mob_helpers.dm b/code/modules/mob/mob_helpers.dm index 76841c2097c9..7c44605bf4bf 100644 --- a/code/modules/mob/mob_helpers.dm +++ b/code/modules/mob/mob_helpers.dm @@ -229,11 +229,11 @@ GLOBAL_LIST_INIT(limb_types_by_name, list( var/list/split_phrase = text2list(phrase," ") //Split it up into words. var/list/unstuttered_words = split_phrase.Copy() - var/max_stutter = min(strength, split_phrase.len) + var/max_stutter = min(strength, length(split_phrase)) var/stutters = rand(max(max_stutter - 3, 1), max_stutter) for(var/i = 0, i < stutters, i++) - if (!unstuttered_words.len) + if (!length(unstuttered_words)) break var/word = pick(unstuttered_words) @@ -268,7 +268,7 @@ GLOBAL_LIST_INIT(limb_types_by_name, list( else // normal stutter word = R.Replace(word, "$1$2-$2$3$4") - if(prob(3 * strength) && index != unstuttered_words.len - 1) // stammer / pause - don't pause at the end of sentences! + if(prob(3 * strength) && index != length(unstuttered_words) - 1) // stammer / pause - don't pause at the end of sentences! word = R.Replace(word, "$0 ...") split_phrase[index] = word diff --git a/code/modules/mob/mob_movement.dm b/code/modules/mob/mob_movement.dm index ab5aa898a848..e326ce9e45b3 100644 --- a/code/modules/mob/mob_movement.dm +++ b/code/modules/mob/mob_movement.dm @@ -191,7 +191,7 @@ for(var/zone in extremities) if(!(human.get_limb(zone))) extremities.Remove(zone) - if(extremities.len < 4) + if(length(extremities) < 4) return //now crawl mob.crawling = TRUE diff --git a/code/modules/mob/new_player/new_player.dm b/code/modules/mob/new_player/new_player.dm index 1bdf075c938e..829379eb28b6 100644 --- a/code/modules/mob/new_player/new_player.dm +++ b/code/modules/mob/new_player/new_player.dm @@ -264,8 +264,8 @@ for(var/datum/squad/sq in GLOB.RoleAuthority.squads) if(sq) - sq.max_engineers = engi_slot_formula(GLOB.clients.len) - sq.max_medics = medic_slot_formula(GLOB.clients.len) + sq.max_engineers = engi_slot_formula(length(GLOB.clients)) + sq.max_medics = medic_slot_formula(length(GLOB.clients)) var/latejoin_larva_drop = SSticker.mode.latejoin_larva_drop diff --git a/code/modules/nano/nanomanager.dm b/code/modules/nano/nanomanager.dm index b2ac69b002b0..6cf1ecb78a0d 100644 --- a/code/modules/nano/nanomanager.dm +++ b/code/modules/nano/nanomanager.dm @@ -97,7 +97,7 @@ * @return int The number of uis updated */ /datum/nanomanager/proc/update_user_uis(mob/user, src_object = null, ui_key = null) - if (isnull(user.open_uis) || !istype(user.open_uis, /list) || open_uis.len == 0) + if (isnull(user.open_uis) || !istype(user.open_uis, /list) || length(open_uis) == 0) return 0 // has no open uis var/update_count = 0 @@ -118,7 +118,7 @@ * @return int The number of uis closed */ /datum/nanomanager/proc/close_user_uis(mob/user, src_object = null, ui_key = null) - if (isnull(user.open_uis) || !istype(user.open_uis, /list) || open_uis.len == 0) + if (isnull(user.open_uis) || !istype(user.open_uis, /list) || length(open_uis) == 0) //testing("nanomanager/close_user_uis mob [user.name] has no open uis") return 0 // has no open uis @@ -128,7 +128,7 @@ ui.close() close_count++ - //testing("nanomanager/close_user_uis mob [user.name] closed [open_uis.len] of [close_count] uis") + //testing("nanomanager/close_user_uis mob [user.name] closed [length(open_uis_] of [close_count] uis") return close_count @@ -151,7 +151,7 @@ var/list/uis = open_uis[src_object_key][ui.ui_key] uis.Add(ui) processing_uis.Add(ui) - //testing("nanomanager/ui_opened mob [ui.user.name] [ui.src_object:name] [ui.ui_key] - user.open_uis [ui.user.open_uis.len]|uis [uis.len]|processing_uis [processing_uis.len]") + //testing("nanomanager/ui_opened mob [ui.user.name] [ui.src_object:name] [ui.ui_key] - user.open_uis [length(ui.user.open_uis)]|uis [length(uis)]|processing_uis [length(processing_uis)]") /** * Remove a /nanoui ui from the list of open uis @@ -173,7 +173,7 @@ var/list/uis = open_uis[src_object_key][ui.ui_key] uis.Remove(ui) - //testing("nanomanager/ui_closed mob [ui.user.name] [ui.src_object:name] [ui.ui_key] - user.open_uis [ui.user.open_uis.len]|uis [uis.len]|processing_uis [processing_uis.len]") + //testing("nanomanager/ui_closed mob [ui.user.name] [ui.src_object:name] [ui.ui_key] - user.open_uis [length(ui.user.open_uis)]|uis [length(uis)]|processing_uis [length(processing_uis)]") return 1 @@ -204,7 +204,7 @@ //testing("nanomanager/user_transferred from mob [oldMob.name] to mob [newMob.name]") if(QDELETED(oldMob) || QDELETED(newMob)) return FALSE //ERROR - if (isnull(oldMob.open_uis) || !istype(oldMob.open_uis, /list) || open_uis.len == 0) + if (isnull(oldMob.open_uis) || !istype(oldMob.open_uis, /list) || length(open_uis) == 0) //testing("nanomanager/user_transferred mob [oldMob.name] has no open uis") return 0 // has no open uis diff --git a/code/modules/nano/nanoui.dm b/code/modules/nano/nanoui.dm index 3e26b2b8a1da..7e259711a20e 100644 --- a/code/modules/nano/nanoui.dm +++ b/code/modules/nano/nanoui.dm @@ -386,7 +386,7 @@ nanoui is used to open and update nano browser uis head_content += " " var/template_data_json = "{}" // An empty JSON object - if (templates.len > 0) + if (length(templates) > 0) template_data_json = strip_improper(json_encode(templates)) var/url_parameters_json = json_encode(list("src" = "\ref[src]")) diff --git a/code/modules/nightmare/nmtasks/mapscheduler.dm b/code/modules/nightmare/nmtasks/mapscheduler.dm index b97193eadb21..1d7f7385d4d3 100644 --- a/code/modules/nightmare/nmtasks/mapscheduler.dm +++ b/code/modules/nightmare/nmtasks/mapscheduler.dm @@ -16,7 +16,7 @@ /datum/nmtask/scheduler/mapload/proc/register_tainted_bounds(datum/nmtask/task, list/bounds) tainted_bounds.len++ - tainted_bounds[tainted_bounds.len] = bounds + tainted_bounds[length(tainted_bounds)] = bounds /datum/nmtask/scheduler/mapload/proc/patch_lighting() var/list/tainted = list() diff --git a/code/modules/organs/limbs.dm b/code/modules/organs/limbs.dm index b84df6bf688b..37ebac207c28 100644 --- a/code/modules/organs/limbs.dm +++ b/code/modules/organs/limbs.dm @@ -20,7 +20,7 @@ var/display_name var/list/datum/wound/wounds = list() - var/number_wounds = 0 // cache the number of wounds, which is NOT wounds.len! + var/number_wounds = 0 // cache the number of wounds, which is NOT length(wounds)! var/tmp/perma_injury = 0 @@ -349,9 +349,9 @@ possible_points += parent if(children) possible_points += children - if(forbidden_limbs.len) + if(length(forbidden_limbs)) possible_points -= forbidden_limbs - if(possible_points.len) + if(length(possible_points)) //And pass the damage around, but not the chance to cut the limb off. var/obj/limb/target = pick(possible_points) if(brute_reduced_by == -1) @@ -483,14 +483,14 @@ This function completely restores a damaged organ to perfect condition. // first check whether we can widen an existing wound var/datum/wound/W - if(wounds.len > 0 && prob(max(50+(number_wounds-1)*10,90))) + if(length(wounds) > 0 && prob(max(50+(number_wounds-1)*10,90))) if((type == CUT || type == BRUISE) && damage >= 5) //we need to make sure that the wound we are going to worsen is compatible with the type of damage... var/compatible_wounds[] = new for(W in wounds) if(W.can_worsen(type, damage)) compatible_wounds += W - if(compatible_wounds.len) + if(length(compatible_wounds)) W = pick(compatible_wounds) W.open_wound(damage) if(type != BURN) @@ -654,7 +654,7 @@ This function completely restores a damaged organ to perfect condition. //configurable regen speed woo, no-regen hardcore or instaheal hugbox, choose your destiny heal_amt = heal_amt * CONFIG_GET(number/organ_regeneration_multiplier) // amount of healing is spread over all the wounds - heal_amt = heal_amt / (wounds.len + 1) + heal_amt = heal_amt / (length(wounds) + 1) // making it look prettier on scanners heal_amt = round(heal_amt,0.1) @@ -801,7 +801,7 @@ This function completely restores a damaged organ to perfect condition. if(istype(E, /obj/limb/chest) || istype(E, /obj/limb/groin) || istype(E, /obj/limb/head)) continue limbs_to_remove += E - if(limbs_to_remove.len) + if(length(limbs_to_remove)) var/obj/limb/L = pick(limbs_to_remove) var/limb_name = L.display_name L.droplimb(0, delete_limb) diff --git a/code/modules/organs/wound.dm b/code/modules/organs/wound.dm index 86f4199a2e5b..d9fee4195ad5 100644 --- a/code/modules/organs/wound.dm +++ b/code/modules/organs/wound.dm @@ -56,7 +56,7 @@ // returns 1 if there's a next stage, 0 otherwise /datum/wound/proc/init_stage(initial_damage) - current_stage = stages.len + current_stage = length(stages) while(src.current_stage > 1 && src.damage_list[current_stage-1] <= initial_damage / src.amount) src.current_stage-- @@ -108,7 +108,7 @@ amount -= healed_damage src.damage -= healed_damage - while(src.wound_damage() < damage_list[current_stage] && current_stage < src.desc_list.len) + while(src.wound_damage() < damage_list[current_stage] && current_stage < length(src.desc_list)) current_stage++ desc = desc_list[current_stage] src.min_damage = damage_list[current_stage] diff --git a/code/modules/paperwork/filingcabinet.dm b/code/modules/paperwork/filingcabinet.dm index 119c846a93a2..42d42413958f 100644 --- a/code/modules/paperwork/filingcabinet.dm +++ b/code/modules/paperwork/filingcabinet.dm @@ -64,7 +64,7 @@ to_chat(user, SPAN_NOTICE("You can't put [P] in [src]!")) /obj/structure/filingcabinet/attack_hand(mob/user as mob) - if(contents.len <= 0) + if(length(contents) <= 0) to_chat(user, SPAN_NOTICE("\The [src] is empty.")) return diff --git a/code/modules/paperwork/folders.dm b/code/modules/paperwork/folders.dm index ad9da68a591d..0250b9c7d41e 100644 --- a/code/modules/paperwork/folders.dm +++ b/code/modules/paperwork/folders.dm @@ -41,7 +41,7 @@ /obj/item/folder/update_icon() overlays.Cut() - if(contents.len) + if(length(contents)) overlays += "folder_paper" return diff --git a/code/modules/paperwork/notepad.dm b/code/modules/paperwork/notepad.dm index 3eb83b6a67b0..04a3d765ea1d 100644 --- a/code/modules/paperwork/notepad.dm +++ b/code/modules/paperwork/notepad.dm @@ -31,7 +31,7 @@ if(HAS_TRAIT(attack_item, TRAIT_TOOL_PEN) || istype(attack_item, /obj/item/toy/crayon)) close_browser(usr, name) //Closes the dialog - if(page < contents.len) + if(page < length(contents)) page = 1 var/obj/item/paper/paper = contents[page] paper.attackby(attack_item, user) @@ -93,8 +93,8 @@ page-- playsound(loc, "pageturn", 15, 1) if(href_list["remove"]) - if(contents.len < page) - page = contents.len + if(length(contents) < page) + page = length(contents) var/obj/item/ripped_out_page = contents[page] usr.put_in_hands(ripped_out_page) to_chat(usr, SPAN_NOTICE("You rip out [ripped_out_page] from [src].")) diff --git a/code/modules/paperwork/paper.dm b/code/modules/paperwork/paper.dm index 27b1fa885133..e1610fb3401a 100644 --- a/code/modules/paperwork/paper.dm +++ b/code/modules/paperwork/paper.dm @@ -687,7 +687,7 @@ var/datum/reagent/R = GLOB.chemical_reagents_list["[I]"] var/U = G.required_reagents[I] txt += " - [U] [R.name]
        \n" - if(G.required_catalysts && G.required_catalysts.len) + if(LAZYLEN(G.required_catalysts)) txt += "
        \nWhile using the following catalysts:
        \n
        \n" for(var/I in G.required_catalysts) var/datum/reagent/R = GLOB.chemical_reagents_list["[I]"] @@ -835,17 +835,16 @@ else var/U = C.required_reagents[I] info += " - [U] [R.name]
        \n" - if(C.required_catalysts) - if(C.required_catalysts.len) - info += "
        Reaction would require the following catalysts:
        \n" - for(var/I in C.required_catalysts) - var/datum/reagent/R = GLOB.chemical_reagents_list["[I]"] - if(R.chemclass >= CHEM_CLASS_SPECIAL && !GLOB.chemical_data.chemical_identified_list[R.id] && !info_only) - info += " - Unknown emission spectrum
        \n" - completed = FALSE - else - var/U = C.required_catalysts[I] - info += " - [U] [R.name]
        \n" + if(LAZYLEN(C.required_catalysts)) + info += "
        Reaction would require the following catalysts:
        \n" + for(var/I in C.required_catalysts) + var/datum/reagent/R = GLOB.chemical_reagents_list["[I]"] + if(R.chemclass >= CHEM_CLASS_SPECIAL && !GLOB.chemical_data.chemical_identified_list[R.id] && !info_only) + info += " - Unknown emission spectrum
        \n" + completed = FALSE + else + var/U = C.required_catalysts[I] + info += " - [U] [R.name]
        \n" else if(GLOB.chemical_gen_classes_list["C1"].Find(S.id)) info += " - [S.name]
        \n" else diff --git a/code/modules/paperwork/paper_bundle.dm b/code/modules/paperwork/paper_bundle.dm index 8cbb7a266ffe..78ba3c8a7e72 100644 --- a/code/modules/paperwork/paper_bundle.dm +++ b/code/modules/paperwork/paper_bundle.dm @@ -44,8 +44,8 @@ else if(HAS_TRAIT(W, TRAIT_TOOL_PEN) || istype(W, /obj/item/toy/crayon)) close_browser(usr, name) //Closes the dialog - if(page < contents.len) - page = contents.len + if(page < length(contents)) + page = length(contents) P = contents[page] P.attackby(W, user) @@ -148,8 +148,8 @@ page-- playsound(src.loc, "pageturn", 15, 1) if(href_list["remove"]) - if(contents.len < page) - page = contents.len + if(length(contents) < page) + page = length(contents) var/obj/item/W = contents[page] usr.put_in_hands(W) to_chat(usr, SPAN_NOTICE("You remove the [W.name] from the bundle.")) @@ -198,7 +198,7 @@ qdel(src) /obj/item/paper_bundle/update_icon() - if(contents.len) + if(length(contents)) var/obj/item/I = contents[1] icon_state = I.icon_state overlays = I.overlays diff --git a/code/modules/paperwork/paperbin.dm b/code/modules/paperwork/paperbin.dm index 6ee3a12faffd..4c74cad468e6 100644 --- a/code/modules/paperwork/paperbin.dm +++ b/code/modules/paperwork/paperbin.dm @@ -28,7 +28,7 @@ /obj/item/paper_bin/attack_hand(mob/user) var/response = "" - if(!papers.len > 0) + if(!length(papers) > 0) response = alert(user, "What kind of paper?", "Paper type request", "Regular", sec_paper_type, "Cancel") if (response != "Regular" && response != "Carbon-Copy" && response != "Company Document" && response != "USCM Document") add_fingerprint(user) @@ -39,8 +39,8 @@ update_icon() var/obj/item/paper/P - if(papers.len > 0) //If there's any custom paper on the stack, use that instead of creating a new paper. - P = papers[papers.len] + if(length(papers) > 0) //If there's any custom paper on the stack, use that instead of creating a new paper. + P = papers[length(papers)] papers.Remove(P) else if (response == "Regular") diff --git a/code/modules/paperwork/photocopier.dm b/code/modules/paperwork/photocopier.dm index 0d5eca1dd9a1..df421e8424cb 100644 --- a/code/modules/paperwork/photocopier.dm +++ b/code/modules/paperwork/photocopier.dm @@ -199,7 +199,7 @@ //Iterates through stamps and puts a matching gray overlay onto the copy var/image/img // - for (var/j = 1, j <= original.ico.len, j++) + for (var/j = 1, j <= length(original.ico), j++) if (findtext(original.ico[j], "cap") || findtext(original.ico[j], "cent")) img = image('icons/obj/items/paper.dmi', "paper_stamp-circle") else if (findtext(original.ico[j], "deny")) diff --git a/code/modules/power/apc.dm b/code/modules/power/apc.dm index 068344b905f2..6c1c234eaadd 100644 --- a/code/modules/power/apc.dm +++ b/code/modules/power/apc.dm @@ -457,13 +457,13 @@ GLOBAL_LIST_INIT(apc_wire_descriptions, list( icon_state = "apcewires" if(!(update_state & UPSTATE_ALLGOOD)) - if(overlays.len) + if(length(overlays)) overlays = 0 return if(update & 2) - if(overlays.len) + if(length(overlays)) overlays = 0 if(!(stat & (BROKEN|MAINT)) && update_state & UPSTATE_ALLGOOD) diff --git a/code/modules/power/power_monitor.dm b/code/modules/power/power_monitor.dm index 9a95047db6cc..74633cf368a5 100644 --- a/code/modules/power/power_monitor.dm +++ b/code/modules/power/power_monitor.dm @@ -57,7 +57,7 @@ t += "" - if(L.len > 0) + if(length(L) > 0) var/total_demand = 0 t += "Area Eqp./Lgt./Env. Load Cell
        " diff --git a/code/modules/power/powernet.dm b/code/modules/power/powernet.dm index 0fe62154966b..5d09a06fc633 100644 --- a/code/modules/power/powernet.dm +++ b/code/modules/power/powernet.dm @@ -26,7 +26,7 @@ var/numapc = 0 - if(nodes && nodes.len) // Added to fix a bad list bug -- TLE + if(LAZYLEN(nodes)) // Added to fix a bad list bug -- TLE for(var/obj/structure/machinery/power/terminal/term in nodes) if( istype( term.master, /obj/structure/machinery/power/apc ) ) numapc++ @@ -45,7 +45,7 @@ perapc = avail/numapc + perapc_excess if( netexcess > 100) // if there was excess power last cycle - if(nodes && nodes.len) + if(LAZYLEN(nodes)) for(var/obj/structure/machinery/power/smes/S in nodes) // find the SMESes in the network if(S.powernet == src) S.restore() // and restore some of the power that was used diff --git a/code/modules/projectiles/ammo_boxes/ammo_boxes.dm b/code/modules/projectiles/ammo_boxes/ammo_boxes.dm index 7f6919b94f3a..9676b71f52f1 100644 --- a/code/modules/projectiles/ammo_boxes/ammo_boxes.dm +++ b/code/modules/projectiles/ammo_boxes/ammo_boxes.dm @@ -126,10 +126,10 @@ if(src.loc != user) //feeling box weight in a distance is unnatural and bad return if(!handfuls) - if(contents.len < (num_of_magazines/3)) + if(length(contents) < (num_of_magazines/3)) . += SPAN_INFO("It feels almost empty.") return - if(contents.len < ((num_of_magazines*2)/3)) + if(length(contents) < ((num_of_magazines*2)/3)) . += SPAN_INFO("It feels about half full.") return . += SPAN_INFO("It feels almost full.") diff --git a/code/modules/projectiles/ammo_boxes/box_structures.dm b/code/modules/projectiles/ammo_boxes/box_structures.dm index 8ae178edf586..da0b700068b9 100644 --- a/code/modules/projectiles/ammo_boxes/box_structures.dm +++ b/code/modules/projectiles/ammo_boxes/box_structures.dm @@ -32,13 +32,13 @@ if(!item_box.handfuls) if(item_box.overlay_ammo_type) overlays += image(text_markings_icon, icon_state = "base_type[item_box.overlay_ammo_type]") //adding base color stripes - if(item_box.contents.len == item_box.num_of_magazines) + if(length(item_box.contents) == item_box.num_of_magazines) overlays += image(magazines_icon, icon_state = "magaz[item_box.overlay_content]") - else if(item_box.contents.len > (item_box.num_of_magazines/2)) + else if(length(item_box.contents) > (item_box.num_of_magazines/2)) overlays += image(magazines_icon, icon_state = "magaz[item_box.overlay_content]_3") - else if(item_box.contents.len > (item_box.num_of_magazines/4)) + else if(length(item_box.contents) > (item_box.num_of_magazines/4)) overlays += image(magazines_icon, icon_state = "magaz[item_box.overlay_content]_2") - else if(item_box.contents.len > 0) + else if(length(item_box.contents) > 0) overlays += image(magazines_icon, icon_state = "magaz[item_box.overlay_content]_1") else var/obj/item/ammo_magazine/AM = locate(/obj/item/ammo_magazine) in item_box.contents @@ -103,7 +103,7 @@ if(AM) . += SPAN_INFO("It has roughly [floor(AM.current_rounds/5)] handfuls remaining.") else - . += SPAN_INFO("It has [item_box.contents.len] magazines out of [item_box.num_of_magazines].") + . += SPAN_INFO("It has [length(item_box.contents)] magazines out of [item_box.num_of_magazines].") if(burning) . += SPAN_DANGER("It's on fire and might explode!") @@ -111,7 +111,7 @@ if(burning) to_chat(user, SPAN_DANGER("It's on fire and might explode!")) return - if(item_box.contents.len) + if(length(item_box.contents)) if(!item_box.handfuls) var/obj/item/ammo_magazine/AM = pick(item_box.contents) item_box.contents -= AM @@ -133,7 +133,7 @@ if(istypestrict(W,item_box.magazine_type)) if(istype(W, /obj/item/storage/box/m94)) var/obj/item/storage/box/m94/flare_pack = W - if(flare_pack.contents.len < flare_pack.max_storage_space) + if(length(flare_pack.contents) < flare_pack.max_storage_space) to_chat(user, SPAN_WARNING("[W] is not full.")) return var/flare_type @@ -158,7 +158,7 @@ if(cell.charge != cell.maxcharge) to_chat(user, SPAN_WARNING("[W] needs to be fully charged before it can be stored in [src].")) return - if(item_box.contents.len < item_box.num_of_magazines) + if(length(item_box.contents) < item_box.num_of_magazines) user.drop_inv_item_to_loc(W, src) item_box.contents += W to_chat(user, SPAN_NOTICE("You put \a [W] into [src]")) diff --git a/code/modules/projectiles/ammo_boxes/misc_boxes.dm b/code/modules/projectiles/ammo_boxes/misc_boxes.dm index 434239fe25cd..0634c76270da 100644 --- a/code/modules/projectiles/ammo_boxes/misc_boxes.dm +++ b/code/modules/projectiles/ammo_boxes/misc_boxes.dm @@ -96,7 +96,7 @@ /obj/item/ammo_box/magazine/misc/flares/get_severity() var/flare_amount = 0 for(var/obj/item/storage/box/m94/flare_box in contents) - flare_amount += flare_box.contents.len + flare_amount += length(flare_box.contents) flare_amount = floor(flare_amount / 8) //10 packs, 8 flares each, maximum total of 10 flares we can throw out return flare_amount diff --git a/code/modules/projectiles/gun.dm b/code/modules/projectiles/gun.dm index db7a163f7536..f7ffbf2875e2 100644 --- a/code/modules/projectiles/gun.dm +++ b/code/modules/projectiles/gun.dm @@ -471,7 +471,7 @@ /obj/item/weapon/gun/proc/handle_starting_attachment() - if(starting_attachment_types && starting_attachment_types.len) + if(LAZYLEN(starting_attachment_types)) for(var/path in starting_attachment_types) var/obj/item/attachable/A = new path(src) A.Attach(src) diff --git a/code/modules/projectiles/gun_attachables.dm b/code/modules/projectiles/gun_attachables.dm index 92eabd62daa2..7d015e4bac8d 100644 --- a/code/modules/projectiles/gun_attachables.dm +++ b/code/modules/projectiles/gun_attachables.dm @@ -2973,7 +2973,7 @@ Defined in conflicts.dm of the #defines folder. current_rounds += transfered_rounds FT.current_rounds -= transfered_rounds - var/amount_of_reagents = FT.reagents.reagent_list.len + var/amount_of_reagents = length(FT.reagents.reagent_list) var/amount_removed_per_reagent = transfered_rounds / amount_of_reagents for(var/datum/reagent/R in FT.reagents.reagent_list) R.volume -= amount_removed_per_reagent diff --git a/code/modules/projectiles/gun_helpers.dm b/code/modules/projectiles/gun_helpers.dm index 9fe8c1ee46be..efc7abf3aa20 100644 --- a/code/modules/projectiles/gun_helpers.dm +++ b/code/modules/projectiles/gun_helpers.dm @@ -815,11 +815,11 @@ DEFINES in setup.dm, referenced here. if(attachment && (attachment.flags_attach_features & ATTACH_ACTIVATION) ) usable_attachments += attachment - if(!usable_attachments.len) //No usable attachments. + if(!length(usable_attachments)) //No usable attachments. to_chat(usr, SPAN_WARNING("[src] does not have any usable attachments!")) return - if(usable_attachments.len == 1) //Activates the only attachment if there is only one. + if(length(usable_attachments) == 1) //Activates the only attachment if there is only one. chosen_attachment = usable_attachments[1] else chosen_attachment = tgui_input_list(usr, "Which attachment to activate?", "Activate attachment", usable_attachments) diff --git a/code/modules/projectiles/guns/flamer/flamer.dm b/code/modules/projectiles/guns/flamer/flamer.dm index 28bcc76c42df..c54d62e148b7 100644 --- a/code/modules/projectiles/guns/flamer/flamer.dm +++ b/code/modules/projectiles/guns/flamer/flamer.dm @@ -203,7 +203,7 @@ /obj/item/weapon/gun/flamer/proc/unleash_flame(atom/target, mob/living/user) set waitfor = 0 last_fired = world.time - if(!current_mag || !current_mag.reagents || !current_mag.reagents.reagent_list.len) + if(!current_mag || !current_mag.reagents || !length(current_mag.reagents.reagent_list)) return var/datum/reagent/R = current_mag.reagents.reagent_list[1] @@ -234,7 +234,7 @@ /obj/item/weapon/gun/flamer/proc/unleash_smoke(atom/target, mob/living/user) last_fired = world.time - if(!current_mag || !current_mag.reagents || !current_mag.reagents.reagent_list.len) + if(!current_mag || !current_mag.reagents || !length(current_mag.reagents.reagent_list)) return var/source_turf = get_turf(user) @@ -251,7 +251,7 @@ var/turf/turfs[] = get_line(user, target, FALSE) var/turf/first_turf = turfs[1] var/turf/second_turf = turfs[2] - var/ammount_required = (min(turfs.len, smoke_range) * use_multiplier) // the ammount of units that this click requires + var/ammount_required = (min(length(turfs), smoke_range) * use_multiplier) // the ammount of units that this click requires for(var/turf/turf in turfs) if(chemical.volume < ammount_required) @@ -294,7 +294,7 @@ /obj/item/weapon/gun/flamer/proc/unleash_foam(atom/target, mob/living/user) last_fired = world.time - if(!current_mag || !current_mag.reagents || !current_mag.reagents.reagent_list.len) + if(!current_mag || !current_mag.reagents || !length(current_mag.reagents.reagent_list)) return var/source_turf = get_turf(user) @@ -305,7 +305,7 @@ var/turf/turfs[] = get_line(user, target, FALSE) var/turf/first_turf = turfs[1] - var/ammount_required = (min(turfs.len, foam_range) * use_multiplier) // the ammount of units that this click requires + var/ammount_required = (min(length(turfs), foam_range) * use_multiplier) // the ammount of units that this click requires for(var/turf/turf in turfs) if(chemical.volume < ammount_required) diff --git a/code/modules/projectiles/guns/shotguns.dm b/code/modules/projectiles/guns/shotguns.dm index 5acad2255356..b1b3bb3c2ab4 100644 --- a/code/modules/projectiles/guns/shotguns.dm +++ b/code/modules/projectiles/guns/shotguns.dm @@ -1020,7 +1020,7 @@ can cause issues with ammo types getting mixed up during the burst. throw_turfs.Remove(T) continue var/list/turf/path = get_line(get_step_towards(src, T), T) //Same path throw code will calculate from. - if(!path.len) + if(!length(path)) throw_turfs.Remove(T) continue var/prev_turf = start_turf diff --git a/code/modules/projectiles/guns/smartgun.dm b/code/modules/projectiles/guns/smartgun.dm index a2f2a8a003a2..e5c9fff3a126 100644 --- a/code/modules/projectiles/guns/smartgun.dm +++ b/code/modules/projectiles/guns/smartgun.dm @@ -501,7 +501,7 @@ path = get_line(user, M) - if(path.len) + if(length(path)) var/blocked = FALSE for(T in path) if(T.density || T.opacity) @@ -524,9 +524,9 @@ else conscious_targets += M - if(conscious_targets.len) + if(length(conscious_targets)) . = pick(conscious_targets) - else if(unconscious_targets.len) + else if(length(unconscious_targets)) . = pick(unconscious_targets) /obj/item/weapon/gun/smartgun/proc/process_shot(mob/living/user, warned) diff --git a/code/modules/projectiles/guns/specialist/sniper.dm b/code/modules/projectiles/guns/specialist/sniper.dm index a6bb400ba5c9..b40477a8a460 100644 --- a/code/modules/projectiles/guns/specialist/sniper.dm +++ b/code/modules/projectiles/guns/specialist/sniper.dm @@ -222,7 +222,7 @@ /datum/action/item_action/specialist/aimed_shot/proc/check_shot_is_blocked(mob/firer, mob/target, obj/projectile/P) var/list/turf/path = get_line(firer, target, include_start_atom = FALSE) - if(!path.len || get_dist(firer, target) > P.ammo.max_range) + if(!length(path) || get_dist(firer, target) > P.ammo.max_range) return TRUE var/blocked = FALSE diff --git a/code/modules/projectiles/magazines/flamer.dm b/code/modules/projectiles/magazines/flamer.dm index 8a453beb90b4..24afe13c6297 100644 --- a/code/modules/projectiles/magazines/flamer.dm +++ b/code/modules/projectiles/magazines/flamer.dm @@ -78,7 +78,7 @@ if(!istype(target, /obj/structure/reagent_dispensers/fueltank) && !istype(target, /obj/item/tool/weldpack) && !istype(target, /obj/item/storage/backpack/marine/engineerpack)) return ..() - if(!target.reagents || target.reagents.reagent_list.len < 1) + if(!target.reagents || length(target.reagents.reagent_list) < 1) to_chat(user, SPAN_WARNING("[target] is empty!")) return @@ -133,7 +133,7 @@ /obj/item/ammo_magazine/flamer_tank/get_examine_text(mob/user) . = ..() . += SPAN_NOTICE("It contains:") - if(reagents && reagents.reagent_list.len) + if(reagents && length(reagents.reagent_list)) for(var/datum/reagent/R in reagents.reagent_list) . += SPAN_NOTICE(" [R.volume] units of [R.name].") else diff --git a/code/modules/projectiles/projectile.dm b/code/modules/projectiles/projectile.dm index c1a43bda0ae8..0e335aa81da3 100644 --- a/code/modules/projectiles/projectile.dm +++ b/code/modules/projectiles/projectile.dm @@ -298,7 +298,7 @@ var/pixel_x_source = vis_source.x * world.icon_size + vis_source_pixel_x var/pixel_y_source = vis_source.y * world.icon_size + vis_source_pixel_y - var/turf/vis_target = path[path.len] + var/turf/vis_target = path[length(path)] var/pixel_x_target = vis_target.x * world.icon_size + p_x var/pixel_y_target = vis_target.y * world.icon_size + p_y @@ -311,7 +311,7 @@ //Determine apparent position along visual path, then lerp between start and end positions - var/vis_length = vis_travelled + path.len + var/vis_length = vis_travelled + length(path) var/vis_current = vis_travelled + speed * (time_carry * 0.1) //speed * (time_carry * 0.1) for remainder time movement, visually "catching up" to where it should be var/vis_interpolant = vis_current / vis_length @@ -1130,7 +1130,7 @@ handle_blood_splatter(get_dir(P.starting, loc)) apply_damage(damage_result,P.ammo.damage_type, P.def_zone) //Deal the damage. - if(xeno_shields.len) + if(length(xeno_shields)) P.play_shielded_hit_effect(src) else P.play_hit_effect(src) diff --git a/code/modules/reagents/Chemistry-Holder.dm b/code/modules/reagents/Chemistry-Holder.dm index 710cca821385..de365de8e2a6 100644 --- a/code/modules/reagents/Chemistry-Holder.dm +++ b/code/modules/reagents/Chemistry-Holder.dm @@ -39,13 +39,13 @@ var/total_transfered = 0 var/current_list_element = 1 - current_list_element = rand(1,reagent_list.len) + current_list_element = rand(1,length(reagent_list)) while(total_transfered != amount) if(total_transfered >= amount) break - if(total_volume <= 0 || !reagent_list.len) break + if(total_volume <= 0 || !length(reagent_list)) break - if(current_list_element > reagent_list.len) current_list_element = 1 + if(current_list_element > length(reagent_list)) current_list_element = 1 var/datum/reagent/current_reagent = reagent_list[current_list_element] remove_reagent(current_reagent.id, 1) @@ -62,17 +62,17 @@ var/total_transfered = 0 var/current_list_element = 1 - current_list_element = rand(1, reagent_list.len) + current_list_element = rand(1, length(reagent_list)) while(total_transfered != amount) if(total_transfered >= amount) break - if(total_volume <= 0 || !reagent_list.len) break + if(total_volume <= 0 || !length(reagent_list)) break - if(current_list_element > reagent_list.len) current_list_element = 1 + if(current_list_element > length(reagent_list)) current_list_element = 1 var/datum/reagent/current_reagent = reagent_list[current_list_element] if(current_reagent.id == reagent_to_ignore) - if(reagent_list.len == 1) break //if the reagent to be avoided is the only one in the list, we're done here. + if(length(reagent_list) == 1) break //if the reagent to be avoided is the only one in the list, we're done here. if(current_list_element == 1) current_reagent = reagent_list[current_list_element + 1] //if the selected reagent was number 1, we don't want it trying to draw id.0, so we add 1 else @@ -252,11 +252,11 @@ var/datum/chemical_reaction/C = reaction - var/total_required_reagents = C.required_reagents.len + var/total_required_reagents = length(C.required_reagents) var/total_matching_reagents = 0 var/total_required_catalysts = 0 if(C.required_catalysts) - total_required_catalysts = C.required_catalysts.len + total_required_catalysts = length(C.required_catalysts) var/total_matching_catalysts= 0 var/matching_container = 0 var/matching_other = 0 diff --git a/code/modules/reagents/Chemistry-Reagents.dm b/code/modules/reagents/Chemistry-Reagents.dm index 3e4fb8f300a3..7faf2f85a7f7 100644 --- a/code/modules/reagents/Chemistry-Reagents.dm +++ b/code/modules/reagents/Chemistry-Reagents.dm @@ -346,7 +346,7 @@ GLOBAL_LIST_INIT(name2reagent, build_name2reagent()) R = new P.type() break i++ - if(i > properties.len) + if(i > length(properties)) return FALSE R.level = new_level R.holder = src diff --git a/code/modules/reagents/chemistry_machinery/autodispenser.dm b/code/modules/reagents/chemistry_machinery/autodispenser.dm index eed96564da71..05d7988b9bf3 100644 --- a/code/modules/reagents/chemistry_machinery/autodispenser.dm +++ b/code/modules/reagents/chemistry_machinery/autodispenser.dm @@ -164,7 +164,7 @@ data["output_container"] = output_container.name data["output_totalvol"] = output_container.reagents.total_volume data["output_maxvol"] = output_container.reagents.maximum_volume - if(output_container.reagents.reagent_list.len) + if(length(output_container.reagents.reagent_list)) data["output_color"] = mix_color_from_reagents(output_container.reagents.reagent_list) else data["output_color"] = null @@ -182,12 +182,12 @@ var/list/memorylist = program_amount[PROGRAM_MEMORY] var/list/boxlist = program_amount[PROGRAM_BOX] - if(memorylist.len) + if(length(memorylist)) data["memory"] = tgui_friendly_program_list[PROGRAM_MEMORY] else data["memory"] = "Empty" - if(boxlist.len) + if(length(boxlist)) data["box"] = tgui_friendly_program_list[PROGRAM_BOX] else data["box"] = "Empty" @@ -308,7 +308,7 @@ update_icon() return - for(var/i=stage,i<=programs[1].len + programs[2].len && i != 0,i++) + for(var/i=stage,i<=length(programs[1]) + length(programs[2]) && i != 0,i++) if(status < AUTODISPENSER_IDLE) //We're waiting for new chems to be stored status++ if(status == AUTODISPENSER_IDLE) @@ -376,7 +376,7 @@ for(var/obj/item/reagent_container/glass/beaker/vial/V in input_container.contents) if(!V.reagents.get_reagents()) //Ignore empty vials continue - if(V.reagents.reagent_list.len > 1) //We don't work with impure vials + if(length(V.reagents.reagent_list) > 1) //We don't work with impure vials continue var/datum/reagent/R = V.reagents.reagent_list[1] if(program_amount[save_to]["[R.name]"]) @@ -395,11 +395,11 @@ use_power(1500) /obj/structure/machinery/autodispenser/proc/run_program() - if(programs[PROGRAM_MEMORY].len) + if(length(programs[PROGRAM_MEMORY])) program = PROGRAM_MEMORY else program = PROGRAM_BOX - if(programs[program].len && (outputmode == OUTPUT_TO_CONTAINER && output_container) || outputmode != OUTPUT_TO_CONTAINER) + if(length(programs[program]) && (outputmode == OUTPUT_TO_CONTAINER && output_container) || outputmode != OUTPUT_TO_CONTAINER) status = AUTODISPENSER_RUNNING update_icon() else @@ -407,8 +407,8 @@ /obj/structure/machinery/autodispenser/proc/next_stage() stage++ - if(stage > programs[program].len) //End of program - if(programs[PROGRAM_MEMORY].len && programs[PROGRAM_BOX].len) + if(stage > length(programs[program])) //End of program + if(length(programs[PROGRAM_MEMORY]) && length(programs[PROGRAM_BOX])) if(program == PROGRAM_BOX) cycle++ program-- diff --git a/code/modules/reagents/chemistry_machinery/centrifuge.dm b/code/modules/reagents/chemistry_machinery/centrifuge.dm index 706f33e38096..c679aa1c32b9 100644 --- a/code/modules/reagents/chemistry_machinery/centrifuge.dm +++ b/code/modules/reagents/chemistry_machinery/centrifuge.dm @@ -176,17 +176,17 @@ cleanup() return FALSE - if(status == 0 && input_source == INPUT_TURING && connected_turing && connected_turing.outputmode == 2 && (connected_turing.programs[1].len || connected_turing.programs[2].len)) + if(status == 0 && input_source == INPUT_TURING && connected_turing && connected_turing.outputmode == 2 && (length(connected_turing.programs[1]) || length(connected_turing.programs[2]))) return TRUE return FALSE /obj/structure/machinery/centrifuge/proc/centrifuge() - if(!output_container.contents.len) return //Is output empty? + if(!length(output_container.contents)) return //Is output empty? var/obj/item/reagent_container/source_container = input_container if(input_source == INPUT_TURING) source_container = connected_turing - var/initial_reagents = source_container.reagents.reagent_list.len + var/initial_reagents = length(source_container.reagents.reagent_list) var/list/vials = list() for(var/obj/item/reagent_container/V in output_container.contents) vials += V @@ -203,7 +203,7 @@ var/obj/item/reagent_container/hypospray/autoinjector/A = V if(autolabel) A.name = "autoinjector ([autolabel])" - else if(!(A.reagents.reagent_list.len)) + else if(!length(A.reagents.reagent_list)) A.name = "autoinjector" else A.name = "autoinjector (" + A.reagents.reagent_list[1].name + ")" @@ -213,7 +213,7 @@ else if(autolabel) V.name = "vial ([autolabel])" - else if(!(V.reagents.reagent_list.len) || (V.reagents.reagent_list.len > 1)) + else if(!length(V.reagents.reagent_list) || (length(V.reagents.reagent_list) > 1)) V.name = "vial" else V.name = "vial (" + V.reagents.reagent_list[1].name + ")" diff --git a/code/modules/reagents/chemistry_machinery/chem_dispenser.dm b/code/modules/reagents/chemistry_machinery/chem_dispenser.dm index e897d106528e..f0a3faeb75ce 100644 --- a/code/modules/reagents/chemistry_machinery/chem_dispenser.dm +++ b/code/modules/reagents/chemistry_machinery/chem_dispenser.dm @@ -140,7 +140,7 @@ var/list/beakerContents = list() var/beakerCurrentVolume = 0 - if(beaker && beaker.reagents && beaker.reagents.reagent_list.len) + if(beaker && beaker.reagents && length(beaker.reagents.reagent_list)) for(var/datum/reagent/current_reagent in beaker.reagents.reagent_list) beakerContents += list(list("name" = current_reagent.name, "volume" = current_reagent.volume)) // list in a list because Byond merges the first list... beakerCurrentVolume += current_reagent.volume diff --git a/code/modules/reagents/chemistry_machinery/chem_master.dm b/code/modules/reagents/chemistry_machinery/chem_master.dm index 5b145f75940f..6f6d45b6712e 100644 --- a/code/modules/reagents/chemistry_machinery/chem_master.dm +++ b/code/modules/reagents/chemistry_machinery/chem_master.dm @@ -248,7 +248,7 @@ P.icon_state = "pill"+pillsprite reagents.trans_to(P,amount_per_pill) if(loaded_pill_bottle) - if(loaded_pill_bottle.contents.len < loaded_pill_bottle.max_storage_space) + if(length(loaded_pill_bottle.contents) < loaded_pill_bottle.max_storage_space) loaded_pill_bottle.handle_item_insertion(P, TRUE) updateUsrDialog() @@ -354,7 +354,7 @@ dat = "Please insert beaker.
        " if(pill_maker) if(loaded_pill_bottle) - dat += "Eject Pill Bottle \[[loaded_pill_bottle.contents.len]/[loaded_pill_bottle.max_storage_space]\]

        " + dat += "Eject Pill Bottle \[[length(loaded_pill_bottle.contents)]/[loaded_pill_bottle.max_storage_space]\]

        " else dat += "No pill bottle inserted.

        " dat += "Close" @@ -362,10 +362,10 @@ dat += "Eject beaker and Clear Buffer

        " if(pill_maker) if(loaded_pill_bottle) - dat += "Eject [loaded_pill_bottle] \[[loaded_pill_bottle.contents.len]/[loaded_pill_bottle.max_storage_space]\]
        " - dat += "Add label to [loaded_pill_bottle] \[[loaded_pill_bottle.contents.len]/[loaded_pill_bottle.max_storage_space]\]
        " - dat += "Set color to [loaded_pill_bottle] \[[loaded_pill_bottle.contents.len]/[loaded_pill_bottle.max_storage_space]\]

        " - dat += "Transfer [loaded_pill_bottle] \[[loaded_pill_bottle.contents.len]/[loaded_pill_bottle.max_storage_space]\] to the smartfridge

        " + dat += "Eject [loaded_pill_bottle] \[[length(loaded_pill_bottle.contents)]/[loaded_pill_bottle.max_storage_space]\]
        " + dat += "Add label to [loaded_pill_bottle] \[[length(loaded_pill_bottle.contents)]/[loaded_pill_bottle.max_storage_space]\]
        " + dat += "Set color to [loaded_pill_bottle] \[[length(loaded_pill_bottle.contents)]/[loaded_pill_bottle.max_storage_space]\]

        " + dat += "Transfer [loaded_pill_bottle] \[[length(loaded_pill_bottle.contents)]/[loaded_pill_bottle.max_storage_space]\] to the smartfridge

        " else dat += "No pill bottle inserted.

        " if(!connected && pill_maker) diff --git a/code/modules/reagents/chemistry_machinery/chem_simulator.dm b/code/modules/reagents/chemistry_machinery/chem_simulator.dm index fd14698619ad..650b6cefbae9 100644 --- a/code/modules/reagents/chemistry_machinery/chem_simulator.dm +++ b/code/modules/reagents/chemistry_machinery/chem_simulator.dm @@ -679,7 +679,7 @@ R.make_alike(assoc_R) if(mode != MODE_CREATE) - if(R.required_reagents.len > 2 && !recipe_targets[recipe_target]) //we only replace if the recipe isn't small and the target is not set TRUE to being elevated + if(length(R.required_reagents) > 2 && !recipe_targets[recipe_target]) //we only replace if the recipe isn't small and the target is not set TRUE to being elevated LAZYREMOVE(R.required_reagents, pick(R.required_reagents)) R.add_component(recipe_target) diff --git a/code/modules/reagents/chemistry_machinery/pandemic.dm b/code/modules/reagents/chemistry_machinery/pandemic.dm index f44da3af9613..645f1bba807a 100644 --- a/code/modules/reagents/chemistry_machinery/pandemic.dm +++ b/code/modules/reagents/chemistry_machinery/pandemic.dm @@ -75,7 +75,7 @@ Blood = L break var/list/res = Blood.data_properties["resistances"] - spawn(res.len*200) + spawn(length(res)*200) wait = null else temphtml = "The replicator is not ready yet." @@ -160,7 +160,7 @@ if(B) Blood = B break - if(!beaker.reagents.total_volume||!beaker.reagents.reagent_list.len) + if(!beaker.reagents.total_volume||!length(beaker.reagents.reagent_list)) dat += "The beaker is empty
        " else if(!Blood) dat += "No blood sample found in beaker" @@ -172,7 +172,7 @@ if(Blood.data_properties["viruses"]) var/list/vir = Blood.data_properties["viruses"] - if(vir.len) + if(length(vir)) for(var/datum/disease/D in Blood.data_properties["viruses"]) if(!D.hidden[PANDEMIC]) @@ -209,7 +209,7 @@ dat += "
        Contains antibodies to: " if(Blood.data_properties["resistances"]) var/list/res = Blood.data_properties["resistances"] - if(res.len) + if(length(res)) dat += "
          " for(var/type in Blood.data_properties["resistances"]) var/disease_name = "Unknown" @@ -230,7 +230,7 @@ dat += "nothing
          " else dat += "nothing
          " - dat += "
          Eject beaker[((beaker.reagents.total_volume && beaker.reagents.reagent_list.len) ? "-- Empty beaker":"")]
          " + dat += "
          Eject beaker[((beaker.reagents.total_volume && length(beaker.reagents.reagent_list)) ? "-- Empty beaker":"")]
          " dat += "Close" show_browser(user, "[name]
          [dat]", name, "pandemic") diff --git a/code/modules/reagents/chemistry_machinery/reagent_analyzer.dm b/code/modules/reagents/chemistry_machinery/reagent_analyzer.dm index 51db188826b8..967177bda978 100644 --- a/code/modules/reagents/chemistry_machinery/reagent_analyzer.dm +++ b/code/modules/reagents/chemistry_machinery/reagent_analyzer.dm @@ -33,7 +33,7 @@ to_chat(user, SPAN_WARNING("Someone else removed the sample. Make up your mind!")) return processing = TRUE - if(sample.reagents.total_volume < 30 || sample.reagents.reagent_list.len > 1) + if(sample.reagents.total_volume < 30 || length(sample.reagents.reagent_list) > 1) icon_state = "reagent_analyzer_error" reagent_process() else @@ -54,12 +54,12 @@ addtimer(CALLBACK(src, TYPE_PROC_REF(/obj/structure/machinery/reagent_analyzer, finish_reagent_process)), 4 SECONDS) /obj/structure/machinery/reagent_analyzer/proc/finish_reagent_process() - if(!sample || !sample.reagents || sample.reagents.total_volume < 30 || sample.reagents.reagent_list.len > 1) + if(!sample || !sample.reagents || sample.reagents.total_volume < 30 || length(sample.reagents.reagent_list) > 1) if(!sample || !sample.reagents) print_report(0, "SAMPLE EMPTY.") else if(sample.reagents.total_volume < 30) print_report(0, "SAMPLE SIZE INSUFFICIENT;
          \nA sample size of 30 units is required for analysis.") - else if(sample.reagents.reagent_list.len > 1) + else if(length(sample.reagents.reagent_list) > 1) print_report(0, "SAMPLE CONTAMINATED;
          \nA pure sample is required for analysis.") else print_report(0, "UNKNOWN.") diff --git a/code/modules/reagents/chemistry_machinery/reagent_grinder.dm b/code/modules/reagents/chemistry_machinery/reagent_grinder.dm index 69e6567393b9..99b19a75f527 100644 --- a/code/modules/reagents/chemistry_machinery/reagent_grinder.dm +++ b/code/modules/reagents/chemistry_machinery/reagent_grinder.dm @@ -90,17 +90,17 @@ updateUsrDialog() return 0 - if(holdingitems && holdingitems.len >= limit) + if(LAZYLEN(holdingitems) >= limit) to_chat(user, SPAN_WARNING("The machine cannot hold anymore items.")) return 1 if(istype(O,/obj/item/storage)) var/obj/item/storage/B = O - if(B.contents.len > 0) + if(length(B.contents) > 0) to_chat(user, SPAN_NOTICE("You start dumping the contents of [B] into [src].")) if(!do_after(user, 15, INTERRUPT_ALL, BUSY_ICON_GENERIC)) return for(var/obj/item/I in B) - if(holdingitems && holdingitems.len >= limit) + if(LAZYLEN(holdingitems) >= limit) to_chat(user, SPAN_WARNING("The machine cannot hold anymore items.")) break else @@ -165,7 +165,7 @@ if(is_beaker_ready && !is_chamber_empty && !(inoperable())) dat += "Grind the reagents
          " dat += "Juice the reagents

          " - if(holdingitems && holdingitems.len > 0) + if(LAZYLEN(holdingitems) > 0) dat += "Eject the reagents
          " if(beaker) dat += "Detach the beaker
          " @@ -357,7 +357,7 @@ if(beaker.reagents.total_volume >= beaker.reagents.maximum_volume) break - if(O.reagents.reagent_list.len == 0) + if(length(O.reagents.reagent_list) == 0) remove_object(O) //Sheets diff --git a/code/modules/reagents/chemistry_properties/prop_positive.dm b/code/modules/reagents/chemistry_properties/prop_positive.dm index 0f51b816d034..40867892afbd 100644 --- a/code/modules/reagents/chemistry_properties/prop_positive.dm +++ b/code/modules/reagents/chemistry_properties/prop_positive.dm @@ -435,7 +435,7 @@ if(L.status & (LIMB_ROBOT|LIMB_SYNTHSKIN)) L.take_damage(0, potency) return - if(L.implants && L.implants.len > 0) + if(LAZYLEN(L.implants) > 0) var/obj/implanted_object = pick(L.implants) if(implanted_object) L.implants -= implanted_object diff --git a/code/modules/recycling/disposal.dm b/code/modules/recycling/disposal.dm index c82109156a6c..1b8448991c6e 100644 --- a/code/modules/recycling/disposal.dm +++ b/code/modules/recycling/disposal.dm @@ -65,7 +65,7 @@ start_processing() /obj/structure/machinery/disposal/Destroy() - if(contents.len) + if(length(contents)) eject() trunk = null return ..() @@ -86,7 +86,7 @@ add_fingerprint(user) if(mode <= 0) //It's off if(HAS_TRAIT(I, TRAIT_TOOL_SCREWDRIVER)) - if(contents.len > 0) + if(length(contents) > 0) to_chat(user, SPAN_WARNING("Eject the contents first!")) return if(mode == DISPOSALS_OFF) //It's off but still not unscrewed @@ -103,7 +103,7 @@ if(!HAS_TRAIT(I, TRAIT_TOOL_BLOWTORCH)) to_chat(user, SPAN_WARNING("You need a stronger blowtorch!")) return - if(contents.len > 0) + if(length(contents) > 0) to_chat(user, SPAN_WARNING("Eject the contents first!")) return var/obj/item/tool/weldingtool/W = I @@ -339,7 +339,7 @@ return //Check for items in disposal - occupied light - if(contents.len > 0) + if(length(contents) > 0) overlays += image('icons/obj/pipes/disposal.dmi', "dispover-full") //Charging and ready light @@ -356,7 +356,7 @@ flush_count++ if(flush_count >= flush_after_ticks) - if(contents.len) + if(length(contents)) if(mode == DISPOSALS_CHARGED) spawn(0) flush() @@ -372,7 +372,7 @@ else if(disposal_pressure >= SEND_PRESSURE) mode = DISPOSALS_CHARGED //If full enough, switch to ready mode update() - if(!contents.len) + if(!length(contents)) //Full and nothing to flush - stop processing! stop_processing() else diff --git a/code/modules/recycling/sortingmachinery.dm b/code/modules/recycling/sortingmachinery.dm index fb43d85e079d..dfb0ed8288b0 100644 --- a/code/modules/recycling/sortingmachinery.dm +++ b/code/modules/recycling/sortingmachinery.dm @@ -337,7 +337,7 @@ var/dat = "

          TagMaster 2.3

          " dat += "" - for(var/i = 1, i <= GLOB.tagger_locations.len, i++) + for(var/i = 1, i <= length(GLOB.tagger_locations), i++) dat += "" if (i%4==0) diff --git a/code/modules/shuttle/docking.dm b/code/modules/shuttle/docking.dm index aa9f4d6ad470..df89ee5bdf42 100644 --- a/code/modules/shuttle/docking.dm +++ b/code/modules/shuttle/docking.dm @@ -64,7 +64,7 @@ var/list/new_hidden_turfs if(hidden) new_hidden_turfs = list() - for(var/i in 1 to old_turfs.len) + for(var/i in 1 to length(old_turfs)) CHECK_TICK var/turf/oldT = old_turfs[i] if(old_turfs[oldT] & MOVE_TURF) @@ -135,7 +135,7 @@ old_turfs[oldT] = move_mode /obj/docking_port/mobile/proc/takeoff(list/old_turfs, list/new_turfs, list/moved_atoms, rotation, movement_direction, old_dock, area/underlying_old_area) - for(var/i in 1 to old_turfs.len) + for(var/i in 1 to length(old_turfs)) var/turf/oldT = old_turfs[i] var/turf/newT = new_turfs[i] var/move_mode = old_turfs[oldT] @@ -162,12 +162,12 @@ var/new_parallax_dir = FALSE if(istype(new_dock, /obj/docking_port/stationary/transit)) new_parallax_dir = preferred_direction - for(var/i in 1 to areas_to_move.len) + for(var/i in 1 to length(areas_to_move)) CHECK_TICK var/area/internal_area = areas_to_move[i] internal_area.afterShuttleMove(new_parallax_dir) //areas - for(var/i in 1 to old_turfs.len) + for(var/i in 1 to length(old_turfs)) CHECK_TICK if(!(old_turfs[old_turfs[i]] & MOVE_TURF)) continue @@ -175,7 +175,7 @@ var/turf/newT = new_turfs[i] newT.afterShuttleMove(oldT, rotation) //turfs - for(var/i in 1 to moved_atoms.len) + for(var/i in 1 to length(moved_atoms)) CHECK_TICK var/atom/movable/moved_object = moved_atoms[i] if(QDELETED(moved_object)) @@ -187,12 +187,12 @@ underlying_old_area.lateShuttleMove() - for(var/i in 1 to areas_to_move.len) + for(var/i in 1 to length(areas_to_move)) CHECK_TICK var/area/internal_area = areas_to_move[i] internal_area.lateShuttleMove() - for(var/i in 1 to old_turfs.len) + for(var/i in 1 to length(old_turfs)) CHECK_TICK if(!(old_turfs[old_turfs[i]] & MOVE_CONTENTS | MOVE_TURF)) continue @@ -200,7 +200,7 @@ var/turf/newT = new_turfs[i] newT.lateShuttleMove(oldT) - for(var/i in 1 to moved_atoms.len) + for(var/i in 1 to length(moved_atoms)) CHECK_TICK var/atom/movable/moved_object = moved_atoms[i] if(QDELETED(moved_object)) diff --git a/code/modules/shuttle/on_move.dm b/code/modules/shuttle/on_move.dm index 7a9f032be444..934e3c353618 100644 --- a/code/modules/shuttle/on_move.dm +++ b/code/modules/shuttle/on_move.dm @@ -64,7 +64,7 @@ All ShuttleMove procs go here var/shuttle_boundary = baseturfs.Find(/turf/baseturf_skipover/shuttle) if(!shuttle_boundary) CRASH("A turf queued to move via shuttle somehow had no skipover in baseturfs. [src]([type]):[loc]") - var/depth = baseturfs.len - shuttle_boundary + 1 + var/depth = length(baseturfs) - shuttle_boundary + 1 newT.CopyOnTop(src, 1, depth, TRUE) return TRUE @@ -76,7 +76,7 @@ All ShuttleMove procs go here var/shuttle_boundary = baseturfs.Find(/turf/baseturf_skipover/shuttle) if(shuttle_boundary) - oldT.ScrapeAway(baseturfs.len - shuttle_boundary + 1) + oldT.ScrapeAway(length(baseturfs) - shuttle_boundary + 1) if(rotation) shuttleRotate(rotation) //see shuttle_rotate.dm diff --git a/code/modules/shuttle/shuttle.dm b/code/modules/shuttle/shuttle.dm index fc4b0ccd2ee9..4a990ea7d1ae 100644 --- a/code/modules/shuttle/shuttle.dm +++ b/code/modules/shuttle/shuttle.dm @@ -469,13 +469,13 @@ . = ..() if(!id) - id = "[SSshuttle.mobile.len]" + id = "[length(SSshuttle.mobile)]" if(name == "shuttle") - name = "shuttle[SSshuttle.mobile.len]" + name = "shuttle[length(SSshuttle.mobile)]" shuttle_areas = list() var/list/all_turfs = return_ordered_turfs(x, y, z, dir) - for(var/i in 1 to all_turfs.len) + for(var/i in 1 to length(all_turfs)) var/turf/curT = all_turfs[i] var/area/cur_area = get_area(curT) if(istype(cur_area, area_type)) @@ -693,7 +693,7 @@ if(!underlying_area) underlying_area = new underlying_area_type(null) - for(var/i in 1 to old_turfs.len) + for(var/i in 1 to length(old_turfs)) var/turf/oldT = old_turfs[i] if(!oldT || !istype(oldT.loc, area_type)) continue @@ -706,7 +706,7 @@ var/list/baseturf_cache = oldT.baseturfs for(var/k in 1 to length(baseturf_cache)) if(ispath(baseturf_cache[k], /turf/baseturf_skipover/shuttle)) - oldT.ScrapeAway(baseturf_cache.len - k + 1) + oldT.ScrapeAway(length(baseturf_cache) - k + 1) break qdel(src, force=TRUE) @@ -745,7 +745,7 @@ var/list/ripple_turfs = list() - for(var/i in 1 to L0.len) + for(var/i in 1 to length(L0)) var/turf/T0 = L0[i] var/turf/T1 = L1[i] if(!T0 || !T1) @@ -819,7 +819,7 @@ set_idle() /obj/docking_port/mobile/proc/check_effects() - if(!ripples.len) + if(!length(ripples)) if((mode == SHUTTLE_PREARRIVAL)) var/tl = timeLeft(1) if(tl <= SHUTTLE_RIPPLE_TIME) diff --git a/code/modules/shuttles/marine_ferry.dm b/code/modules/shuttles/marine_ferry.dm index 14787fccb388..bd4a08716954 100644 --- a/code/modules/shuttles/marine_ferry.dm +++ b/code/modules/shuttles/marine_ferry.dm @@ -44,7 +44,7 @@ if(!LAZYLEN(locs_land)) return TRUE - if(!main_doors.len && !controls.len) + if(!length(main_doors) && !length(controls)) var/turf/T_src = pick(locs_dock) var/list/turfs = get_shuttle_turfs(T_src, info_datums) for(var/turf/T in turfs) @@ -164,7 +164,7 @@ var/int_rot = locs_move[T_int] var/turf/T_trg var/trg_rot - if(!locs_land.len) // We check here as well to make sure that the order of operations/lag/changing it after launch. Wont mess this up. + if(!length(locs_land)) // We check here as well to make sure that the order of operations/lag/changing it after launch. Wont mess this up. transit_gun_mission = 1 if(transit_gun_mission)//gun mission makes you land back where you started. @@ -349,7 +349,7 @@ for(var/turf/TU in SSoldshuttle.shuttle_controller.locs_crash[target_section]) if(istype(get_area(TU), /area/almayer/hallways/hangar)) crash_turfs += TU - if(crash_turfs.len) T_trg = pick(crash_turfs) + if(length(crash_turfs)) T_trg = pick(crash_turfs) else message_admins("no crash turf found in Almayer Hangar, contact coders.") break diff --git a/code/modules/shuttles/shuttle_console.dm b/code/modules/shuttles/shuttle_console.dm index 0e9303d13583..502d7c1ffde4 100644 --- a/code/modules/shuttles/shuttle_console.dm +++ b/code/modules/shuttles/shuttle_console.dm @@ -238,7 +238,7 @@ GLOBAL_LIST_EMPTY(shuttle_controls) return if(istype(shuttle, /datum/shuttle/ferry/marine)) var/datum/shuttle/ferry/marine/s = shuttle - if(!s.locs_land.len && !s.transit_gun_mission) + if(!length(s.locs_land) && !s.transit_gun_mission) to_chat(usr, SPAN_WARNING("There is no suitable LZ for this shuttle. Flight configuration changed to fire-mission.")) s.transit_gun_mission = 1 if(shuttle.moving_status == SHUTTLE_IDLE) //Multi consoles, hopefully this will work diff --git a/code/modules/teleporters/teleporter.dm b/code/modules/teleporters/teleporter.dm index d3596cf3e9ea..21b362d85822 100644 --- a/code/modules/teleporters/teleporter.dm +++ b/code/modules/teleporters/teleporter.dm @@ -29,12 +29,12 @@ var/list/turf/source_turfs = locations[location_source] var/list/turf/dest_turfs = locations[location_dest] - if(!source_turfs || source_turfs.len == 0) + if(!LAZYLEN(source_turfs)) log_debug("Invalid source location ID [location_source] handed to teleporter [id]. Error code: TELEPORTER_3") log_admin("Invalid source location ID [location_source] handed to teleporter [id]. Tell the devs. Error code: TELEPORTER_3") return FALSE - if(!dest_turfs || dest_turfs.len == 0) + if(!LAZYLEN(dest_turfs)) log_debug("Invalid destination location ID [location_dest] handed to teleporter [id]. Error code: TELEPORTER_3") log_admin("Invalid destination location ID [location_dest] handed to teleporter [id]. Tell the devs. Error code: TELEPORTER_3") return FALSE diff --git a/code/modules/teleporters/teleporter_console.dm b/code/modules/teleporters/teleporter_console.dm index 88384578a939..f1d3a74b902e 100644 --- a/code/modules/teleporters/teleporter_console.dm +++ b/code/modules/teleporters/teleporter_console.dm @@ -175,7 +175,7 @@ if(SSmapping.configs[GROUND_MAP].map_name != MAP_CORSAT) // Bad style, but I'm leaving it here for now until someone wants to add a teleporter to another map return - if(GLOB.teleporters.len) // already made the damn thing + if(length(GLOB.teleporters)) // already made the damn thing return var/datum/teleporter/corsat/teleporter = new diff --git a/code/modules/tgs/core/tgs_version.dm b/code/modules/tgs/core/tgs_version.dm index bc561e67487a..d8ef9d96c4e9 100644 --- a/code/modules/tgs/core/tgs_version.dm +++ b/code/modules/tgs/core/tgs_version.dm @@ -5,11 +5,11 @@ var/list/version_bits = splittext(deprefixed_parameter, ".") suite = text2num(version_bits[1]) - if(version_bits.len > 1) + if(length(version_bits) > 1) minor = text2num(version_bits[2]) - if(version_bits.len > 2) + if(length(version_bits) > 2) patch = text2num(version_bits[3]) - if(version_bits.len == 4) + if(length(version_bits) == 4) deprecated_patch = text2num(version_bits[4]) /datum/tgs_version/proc/Valid(allow_wildcards = FALSE) diff --git a/code/modules/tgs/v3210/api.dm b/code/modules/tgs/v3210/api.dm index 666201a32256..fd7e8a3a26c7 100644 --- a/code/modules/tgs/v3210/api.dm +++ b/code/modules/tgs/v3210/api.dm @@ -64,17 +64,17 @@ instance_name = "TG Station Server" //maybe just upgraded var/list/logs = TGS_FILE2LIST(".git/logs/HEAD") - if(logs.len) - logs = splittext(logs[logs.len], " ") - if (logs.len >= 2) + if(length(logs)) + logs = splittext(logs[length(logs)], " ") + if (length(logs) >= 2) commit = logs[2] else TGS_ERROR_LOG("Error parsing commit logs") logs = TGS_FILE2LIST(".git/logs/refs/remotes/origin/master") - if(logs.len) - logs = splittext(logs[logs.len], " ") - if (logs.len >= 2) + if(length(logs)) + logs = splittext(logs[length(logs)], " ") + if (length(logs) >= 2) originmastercommit = logs[2] else TGS_ERROR_LOG("Error parsing origin commmit logs") diff --git a/code/modules/tgui_panel/telemetry.dm b/code/modules/tgui_panel/telemetry.dm index 4ef1f06bfac0..bd49596aa19a 100644 --- a/code/modules/tgui_panel/telemetry.dm +++ b/code/modules/tgui_panel/telemetry.dm @@ -85,7 +85,7 @@ var/list/row = telemetry_connections[i] // Check for a malformed history object - if (!row || row.len < 3 || (!row["ckey"] || !row["address"] || !row["computer_id"])) + if (LAZYLEN(row) < 3 || (!row["ckey"] || !row["address"] || !row["computer_id"])) continue /* TODO - Reintroduce this when we get a proper round ID tracking, diff --git a/code/modules/unit_tests/unit_test.dm b/code/modules/unit_tests/unit_test.dm index 8d04a51bcc19..cf02cdf62155 100644 --- a/code/modules/unit_tests/unit_test.dm +++ b/code/modules/unit_tests/unit_test.dm @@ -87,7 +87,7 @@ GLOBAL_VAR_INIT(focused_test, focused_test()) /datum/unit_test/proc/allocate(type, ...) var/list/arguments = args.Copy(2) if(ispath(type, /atom)) - if (!arguments.len) + if (!length(arguments)) arguments = list(run_loc_floor_bottom_left) else if (arguments[1] == null) arguments[1] = run_loc_floor_bottom_left diff --git a/code/modules/vehicles/hardpoints/primary/minigun.dm b/code/modules/vehicles/hardpoints/primary/minigun.dm index 7ae7c20c9870..759ce1d4153c 100644 --- a/code/modules/vehicles/hardpoints/primary/minigun.dm +++ b/code/modules/vehicles/hardpoints/primary/minigun.dm @@ -61,7 +61,7 @@ COOLDOWN_START(src, fire_cooldown, fire_delay * stage_delay_mult) /obj/item/hardpoint/primary/minigun/proc/calculate_stage_delay_mult() - var/stage_rate_len = stage_rate.len + var/stage_rate_len = length(stage_rate) var/delta_time = world.time - last_fired var/old_spin_stage = spin_stage diff --git a/code/modules/vehicles/multitile/multitile_verbs.dm b/code/modules/vehicles/multitile/multitile_verbs.dm index 52d8602c9852..5d73351321e2 100644 --- a/code/modules/vehicles/multitile/multitile_verbs.dm +++ b/code/modules/vehicles/multitile/multitile_verbs.dm @@ -65,7 +65,7 @@ if(!new_hp) new_hp = 0 - new_hp = (new_hp % usable_hps.len) + 1 + new_hp = (new_hp % length(usable_hps)) + 1 var/obj/item/hardpoint/HP = usable_hps[new_hp] if(!HP) return From 34293227af198af44c732305f570a8e847470c5d Mon Sep 17 00:00:00 2001 From: Changelogs Date: Thu, 4 Jul 2024 01:16:51 +0000 Subject: [PATCH 11/23] Automatic changelog compile [ci skip] --- html/changelogs/AutoChangeLog-pr-6574.yml | 4 ---- html/changelogs/AutoChangeLog-pr-6577.yml | 4 ---- html/changelogs/AutoChangeLog-pr-6591.yml | 5 ----- html/changelogs/archive/2024-07.yml | 9 +++++++++ 4 files changed, 9 insertions(+), 13 deletions(-) delete mode 100644 html/changelogs/AutoChangeLog-pr-6574.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-6577.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-6591.yml diff --git a/html/changelogs/AutoChangeLog-pr-6574.yml b/html/changelogs/AutoChangeLog-pr-6574.yml deleted file mode 100644 index e7a6ad8e069b..000000000000 --- a/html/changelogs/AutoChangeLog-pr-6574.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Nomoresolvalou" -delete-after: True -changes: - - balance: "The headset in the synthetic equipment vendor has been replaced with a synthetic headset as opposed to a senior command headset" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-6577.yml b/html/changelogs/AutoChangeLog-pr-6577.yml deleted file mode 100644 index 0a632cde43b2..000000000000 --- a/html/changelogs/AutoChangeLog-pr-6577.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "zzzmike" -delete-after: True -changes: - - spellcheck: "more clarity for facehugger/lesser drone text" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-6591.yml b/html/changelogs/AutoChangeLog-pr-6591.yml deleted file mode 100644 index 1cab75dbe648..000000000000 --- a/html/changelogs/AutoChangeLog-pr-6591.yml +++ /dev/null @@ -1,5 +0,0 @@ -author: "Doubleumc" -delete-after: True -changes: - - qol: "ghost health scan & follow right-click actions work at any range" - - admin: "\"InView\" procs use your current view range (e.g. ghost zoom)" \ No newline at end of file diff --git a/html/changelogs/archive/2024-07.yml b/html/changelogs/archive/2024-07.yml index cf474db8722d..bcb5c9abe0b7 100644 --- a/html/changelogs/archive/2024-07.yml +++ b/html/changelogs/archive/2024-07.yml @@ -2,3 +2,12 @@ Blundir: - soundadd: larva talking sounds - imageadd: larva moving sprites, tweak of standing ones +2024-07-04: + Doubleumc: + - qol: ghost health scan & follow right-click actions work at any range + - admin: '"InView" procs use your current view range (e.g. ghost zoom)' + Nomoresolvalou: + - balance: The headset in the synthetic equipment vendor has been replaced with + a synthetic headset as opposed to a senior command headset + zzzmike: + - spellcheck: more clarity for facehugger/lesser drone text From 82c081a55ba4446443b68e6931b6650ff4ef34d9 Mon Sep 17 00:00:00 2001 From: cm13-github <128137806+cm13-github@users.noreply.github.com> Date: Thu, 4 Jul 2024 06:39:57 +0100 Subject: [PATCH 12/23] Automatic TGS DMAPI Update (#6611) This pull request updates the TGS DMAPI to the latest version. Please note any breaking or unimplemented changes before merging. Co-authored-by: tgstation-server --- code/modules/tgs/core/tgs_version.dm | 6 +++--- code/modules/tgs/v3210/api.dm | 12 ++++++------ 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/code/modules/tgs/core/tgs_version.dm b/code/modules/tgs/core/tgs_version.dm index d8ef9d96c4e9..bc561e67487a 100644 --- a/code/modules/tgs/core/tgs_version.dm +++ b/code/modules/tgs/core/tgs_version.dm @@ -5,11 +5,11 @@ var/list/version_bits = splittext(deprefixed_parameter, ".") suite = text2num(version_bits[1]) - if(length(version_bits) > 1) + if(version_bits.len > 1) minor = text2num(version_bits[2]) - if(length(version_bits) > 2) + if(version_bits.len > 2) patch = text2num(version_bits[3]) - if(length(version_bits) == 4) + if(version_bits.len == 4) deprecated_patch = text2num(version_bits[4]) /datum/tgs_version/proc/Valid(allow_wildcards = FALSE) diff --git a/code/modules/tgs/v3210/api.dm b/code/modules/tgs/v3210/api.dm index fd7e8a3a26c7..666201a32256 100644 --- a/code/modules/tgs/v3210/api.dm +++ b/code/modules/tgs/v3210/api.dm @@ -64,17 +64,17 @@ instance_name = "TG Station Server" //maybe just upgraded var/list/logs = TGS_FILE2LIST(".git/logs/HEAD") - if(length(logs)) - logs = splittext(logs[length(logs)], " ") - if (length(logs) >= 2) + if(logs.len) + logs = splittext(logs[logs.len], " ") + if (logs.len >= 2) commit = logs[2] else TGS_ERROR_LOG("Error parsing commit logs") logs = TGS_FILE2LIST(".git/logs/refs/remotes/origin/master") - if(length(logs)) - logs = splittext(logs[length(logs)], " ") - if (length(logs) >= 2) + if(logs.len) + logs = splittext(logs[logs.len], " ") + if (logs.len >= 2) originmastercommit = logs[2] else TGS_ERROR_LOG("Error parsing origin commmit logs") From 3d4be774eabf64a4ddbdec9ef3682877777d8db0 Mon Sep 17 00:00:00 2001 From: Venuska1117 <89580971+Venuska1117@users.noreply.github.com> Date: Thu, 4 Jul 2024 21:52:14 +0200 Subject: [PATCH 13/23] Make Non-Toxic Water Stop Glowing (#6608) # About the pull request This PR make non-toxic water stop glowing, it kinda don't make sense, that on some maps, where water cover essential points is just GLOWING, now water will not glow unless its intended to be glowing. # Explain why it's good for the game Water should not glow in darkness (unless its intended like on trijent dam) # Testing Photographs and Procedure ![waterchange-ezgif com-video-to-gif-converter](https://github.com/cmss13-devs/cmss13/assets/89580971/7a61318c-dce4-4af3-87b1-727000ebad68) # Changelog :cl: fix: Make non-toxic water stop glowing. /:cl: --- code/game/turfs/floors/desert.dm | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/code/game/turfs/floors/desert.dm b/code/game/turfs/floors/desert.dm index 46a481e3bc64..d11ce0ff5c29 100644 --- a/code/game/turfs/floors/desert.dm +++ b/code/game/turfs/floors/desert.dm @@ -114,7 +114,7 @@ set_light(2) icon = 'icons/turf/floors/desert_water_toxic.dmi' if(0) - set_light(1) + set_light(0) icon = 'icons/turf/floors/desert_water.dmi' if(-1) set_light(1) @@ -199,7 +199,7 @@ set_light(2) icon = 'icons/turf/floors/desert_water_toxic.dmi' if(0) - set_light(1) + set_light(0) icon = 'icons/turf/floors/desert_water.dmi' if(-1) set_light(1) @@ -224,7 +224,7 @@ set_light(2) icon = 'icons/turf/floors/desert_water_toxic.dmi' if(0) - set_light(1) + set_light(0) icon = 'icons/turf/floors/desert_water.dmi' if(-1) set_light(1) From 3728bf489cd8d19ec12e06596ed105ad85a72401 Mon Sep 17 00:00:00 2001 From: cm13-github <128137806+cm13-github@users.noreply.github.com> Date: Thu, 4 Jul 2024 20:57:39 +0100 Subject: [PATCH 14/23] Automatic changelog for PR #6608 [ci skip] --- html/changelogs/AutoChangeLog-pr-6608.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-6608.yml diff --git a/html/changelogs/AutoChangeLog-pr-6608.yml b/html/changelogs/AutoChangeLog-pr-6608.yml new file mode 100644 index 000000000000..3f9a4bebc760 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-6608.yml @@ -0,0 +1,4 @@ +author: "Venuska1117" +delete-after: True +changes: + - bugfix: "Make non-toxic water stop glowing." \ No newline at end of file From faee019e5ff6b3adfdeabdfef48f16fc1ce00346 Mon Sep 17 00:00:00 2001 From: ColdIronWarrior Date: Thu, 4 Jul 2024 19:28:41 -0400 Subject: [PATCH 15/23] fix med rig belt description (#6528) # About the pull request fixes the med rig belt description so it doesnt say it takes pistol ammo # Explain why it's good for the game it doesn't take pistol ammo # Testing Photographs and Procedure
          Screenshots & Videos Put screenshots and videos here with an empty line between the screenshots and the `
          ` tags.
          # Changelog :cl: spellcheck: fixed the medical rig belt's description /:cl: Co-authored-by: nefarious <72267018+nefarious6th@users.noreply.github.com> --- code/game/objects/items/storage/belt.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/game/objects/items/storage/belt.dm b/code/game/objects/items/storage/belt.dm index d68dc4dea753..d16602e04aaa 100644 --- a/code/game/objects/items/storage/belt.dm +++ b/code/game/objects/items/storage/belt.dm @@ -145,7 +145,7 @@ /obj/item/storage/belt/medical name = "\improper M276 pattern medical storage rig" - desc = "The M276 is the standard load-bearing equipment of the USCM. It consists of a modular belt with various clips. This version is a less common configuration, designed to transport medical supplies and pistol ammunition. \nRight click its sprite and click \"toggle belt mode\" to take pills out of bottles by simply clicking them." + desc = "The M276 is the standard load-bearing equipment of the USCM. It consists of a modular belt with various clips. This version is a less common configuration, designed to transport bulkier medical supplies. \nRight click its sprite and click \"toggle belt mode\" to take pills out of bottles by simply clicking them." icon_state = "medicalbelt" item_state = "medical" storage_slots = 14 From 0a0c34f6ad3456dcb931b733ed02635415836c10 Mon Sep 17 00:00:00 2001 From: cm13-github <128137806+cm13-github@users.noreply.github.com> Date: Fri, 5 Jul 2024 00:33:45 +0100 Subject: [PATCH 16/23] Automatic changelog for PR #6528 [ci skip] --- html/changelogs/AutoChangeLog-pr-6528.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-6528.yml diff --git a/html/changelogs/AutoChangeLog-pr-6528.yml b/html/changelogs/AutoChangeLog-pr-6528.yml new file mode 100644 index 000000000000..30d2d87478d6 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-6528.yml @@ -0,0 +1,4 @@ +author: "coldironwarrior" +delete-after: True +changes: + - spellcheck: "fixed the medical rig belt's description" \ No newline at end of file From 304358b5f928bc2d6653642aa883063bf22b84e9 Mon Sep 17 00:00:00 2001 From: Grrr kitten <158611449+GrrrKitten@users.noreply.github.com> Date: Thu, 4 Jul 2024 19:29:18 -0400 Subject: [PATCH 17/23] Gives Screenshake an actual smoothing value versus just jumping over a single frame (#6524) # About the pull request ![image](https://github.com/cmss13-devs/cmss13/assets/158611449/58503bfd-0c2e-42b9-8534-8d2d01281d28) ![image](https://github.com/cmss13-devs/cmss13/assets/158611449/226062a7-0e76-40c0-b488-1a0481125ca6) Basically in game rn, screenshake uses jump easing, which over the span of a single frame sends you from your current screen position to the location of the screenshake. This PR gives it cubic easing, which while being one of the more 'rough' easing options, makes it look like your FPS arent dropping. # Explain why it's good for the game Screenshake looked extremely low FPS/jumpy and honestly over long periods of screenshake like queen screech kinda made your eyes hurt. CM's screenshake was one of the worst of any SS13 servers and had us looking extremely dated. Screenshake should be Screenshake,not give players motion sickness This PR fixes that, now with screenshake being heavily dependent on your personal FPS choice, with those who choose to play on the server FPS/lower FPS having whats more similarly to the older 'jumpy' screenshake, while those on higher FPS have to deal with random low FPS screenshake The vids speak for themselves # Testing Photographs and Procedure
          Screenshots & Videos I have vids of what it looks like too for gun recoil but photoshop refuses to render my videos so theyll come later What it used to look like: https://streamable.com/c4wk97 One of the worst examples of old screenshake (at 48fps) https://streamable.com/iyj8d7 What it looks like now (note I use 48 FPS for first one, then server FPS for low fps ones) https://streamable.com/5nd11l
          Like the stuff I make? [![ko-fi](https://ko-fi.com/img/githubbutton_sm.svg)](https://ko-fi.com/J3J6102QI0) # Changelog :cl: qol: Makes screenshake look less low FPS/jumpy /:cl: --- code/modules/mob/mob_helpers.dm | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/code/modules/mob/mob_helpers.dm b/code/modules/mob/mob_helpers.dm index 7c44605bf4bf..4771626ee78c 100644 --- a/code/modules/mob/mob_helpers.dm +++ b/code/modules/mob/mob_helpers.dm @@ -315,7 +315,7 @@ GLOBAL_LIST_INIT(limb_types_by_name, list( message = replace_X.Replace(message, "CKTH") return message -#define PIXELS_PER_STRENGTH_VAL 24 +#define PIXELS_PER_STRENGTH_VAL 28 /proc/shake_camera(mob/M, steps = 1, strength = 1, time_per_step = 1) if(!M?.client || (M.shakecamera > world.time)) @@ -326,10 +326,10 @@ GLOBAL_LIST_INIT(limb_types_by_name, list( var/old_X = M.client.pixel_x var/old_y = M.client.pixel_y - animate(M.client, pixel_x = old_X + rand(-(strength), strength), pixel_y = old_y + rand(-(strength), strength), easing = JUMP_EASING, time = time_per_step, flags = ANIMATION_PARALLEL) + animate(M.client, pixel_x = old_X + rand(-(strength), strength), pixel_y = old_y + rand(-(strength), strength), easing = CUBIC_EASING | EASE_IN, time = time_per_step, flags = ANIMATION_PARALLEL) var/i = 1 while(i < steps) - animate(pixel_x = old_X + rand(-(strength), strength), pixel_y = old_y + rand(-(strength), strength), easing = JUMP_EASING, time = time_per_step) + animate(pixel_x = old_X + rand(-(strength), strength), pixel_y = old_y + rand(-(strength), strength), easing = CUBIC_EASING | EASE_IN, time = time_per_step) i++ animate(pixel_x = old_X, pixel_y = old_y,time = clamp(floor(strength/PIXELS_PER_STRENGTH_VAL),2,4))//ease it back From 951c22da7c3ed10757bfca04689e86618f32643c Mon Sep 17 00:00:00 2001 From: cm13-github <128137806+cm13-github@users.noreply.github.com> Date: Fri, 5 Jul 2024 00:42:32 +0100 Subject: [PATCH 18/23] Automatic changelog for PR #6524 [ci skip] --- html/changelogs/AutoChangeLog-pr-6524.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-6524.yml diff --git a/html/changelogs/AutoChangeLog-pr-6524.yml b/html/changelogs/AutoChangeLog-pr-6524.yml new file mode 100644 index 000000000000..0e34429b1a18 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-6524.yml @@ -0,0 +1,4 @@ +author: "GrrrKitten" +delete-after: True +changes: + - qol: "Makes screenshake look less low FPS/jumpy" \ No newline at end of file From e895024e65c9748b82d5dd96a54238984152377b Mon Sep 17 00:00:00 2001 From: AndroBetel <44546836+AndroBetel@users.noreply.github.com> Date: Fri, 5 Jul 2024 02:43:47 +0300 Subject: [PATCH 19/23] iron teeth character trait (#6512) # About the pull request adds "iron teeth" trait for 1 point that allows marines to hold stuff in their face slot with no fear of it falling out when they drop # Explain why it's good for the game i tried to larp as rambo and my combat knife fell out of my mouth and i thought man you can only hold minor shit in your face slot would it be cool if it was a little more useful so here we are besides more character traits is good theres a shortage of them i think # Testing Photographs and Procedure
          Screenshots & Videos got the trait... put a knife in my mouth... rested... hit myself with an explosion to stun... knife was still in my mouth... no runtimes
          # Changelog :cl: add: Adds "Iron teeth" trait. /:cl: --------- Co-authored-by: Contrabang <91113370+Contrabang@users.noreply.github.com> Co-authored-by: Zonespace <41448081+Zonespace27@users.noreply.github.com> --- code/__DEFINES/traits.dm | 2 ++ code/datums/elements/mouth_drop_item.dm | 2 +- code/modules/character_traits/biology_traits.dm | 14 ++++++++++++++ 3 files changed, 17 insertions(+), 1 deletion(-) diff --git a/code/__DEFINES/traits.dm b/code/__DEFINES/traits.dm index 7b669124a2d0..964e77402655 100644 --- a/code/__DEFINES/traits.dm +++ b/code/__DEFINES/traits.dm @@ -233,6 +233,8 @@ #define TRAIT_IN_TUTORIAL "t_IN_TUTORIAL" /// If the mob is cloaked in any form #define TRAIT_CLOAKED "t_cloaked" +/// If the mob won't drop items held in face slot when downed +#define TRAIT_IRON_TEETH "t_iron_teeth" // -- ability traits -- /// Xenos with this trait cannot have plasma transfered to them diff --git a/code/datums/elements/mouth_drop_item.dm b/code/datums/elements/mouth_drop_item.dm index 7a546c6b3933..f27e1b928b7d 100644 --- a/code/datums/elements/mouth_drop_item.dm +++ b/code/datums/elements/mouth_drop_item.dm @@ -18,7 +18,7 @@ /datum/element/mouth_drop_item/proc/item_equipped(obj/item/I, mob/living/carbon/human/user, slot) SIGNAL_HANDLER - if(slot == WEAR_FACE) + if(slot == WEAR_FACE && !HAS_TRAIT(user, TRAIT_IRON_TEETH)) I.RegisterSignal(user, COMSIG_LIVING_SET_BODY_POSITION, TYPE_PROC_REF(/obj/item, drop_to_floor)) /datum/element/mouth_drop_item/proc/item_dropped(obj/item/I, mob/living/carbon/human/user) diff --git a/code/modules/character_traits/biology_traits.dm b/code/modules/character_traits/biology_traits.dm index 2220f8f82fd2..5bdb67cc5419 100644 --- a/code/modules/character_traits/biology_traits.dm +++ b/code/modules/character_traits/biology_traits.dm @@ -130,3 +130,17 @@ /datum/character_trait/biology/hardcore/unapply_trait(mob/living/carbon/human/target) REMOVE_TRAIT(target, TRAIT_HARDCORE, ROUNDSTART_TRAIT) ..() + +/datum/character_trait/biology/iron_teeth + trait_name = "Iron Teeth" + trait_desc = "You've got iron teeth or really good dental insurance. Items in your face slot won't fall out when you go down." + applyable = TRUE + cost = 1 + +/datum/character_trait/biology/iron_teeth/apply_trait(mob/living/carbon/human/target, datum/equipment_preset/preset) + ADD_TRAIT(target, TRAIT_IRON_TEETH, ROUNDSTART_TRAIT) + ..() + +/datum/character_trait/biology/iron_teeth/unapply_trait(mob/living/carbon/human/target) + REMOVE_TRAIT(target, TRAIT_IRON_TEETH, ROUNDSTART_TRAIT) + ..() From c664b586e7779d1b6fc74b30e953fd4877990c6c Mon Sep 17 00:00:00 2001 From: cm13-github <128137806+cm13-github@users.noreply.github.com> Date: Fri, 5 Jul 2024 00:49:11 +0100 Subject: [PATCH 20/23] Automatic changelog for PR #6512 [ci skip] --- html/changelogs/AutoChangeLog-pr-6512.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-6512.yml diff --git a/html/changelogs/AutoChangeLog-pr-6512.yml b/html/changelogs/AutoChangeLog-pr-6512.yml new file mode 100644 index 000000000000..a988400bc1a6 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-6512.yml @@ -0,0 +1,4 @@ +author: "AndroBetel" +delete-after: True +changes: + - rscadd: "Adds \"Iron teeth\" trait." \ No newline at end of file From c860c1317347c903101980943cfe66b8a7ae1ea2 Mon Sep 17 00:00:00 2001 From: Changelogs Date: Fri, 5 Jul 2024 01:16:57 +0000 Subject: [PATCH 21/23] Automatic changelog compile [ci skip] --- html/changelogs/AutoChangeLog-pr-6512.yml | 4 ---- html/changelogs/AutoChangeLog-pr-6524.yml | 4 ---- html/changelogs/AutoChangeLog-pr-6528.yml | 4 ---- html/changelogs/AutoChangeLog-pr-6608.yml | 4 ---- html/changelogs/archive/2024-07.yml | 9 +++++++++ 5 files changed, 9 insertions(+), 16 deletions(-) delete mode 100644 html/changelogs/AutoChangeLog-pr-6512.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-6524.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-6528.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-6608.yml diff --git a/html/changelogs/AutoChangeLog-pr-6512.yml b/html/changelogs/AutoChangeLog-pr-6512.yml deleted file mode 100644 index a988400bc1a6..000000000000 --- a/html/changelogs/AutoChangeLog-pr-6512.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "AndroBetel" -delete-after: True -changes: - - rscadd: "Adds \"Iron teeth\" trait." \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-6524.yml b/html/changelogs/AutoChangeLog-pr-6524.yml deleted file mode 100644 index 0e34429b1a18..000000000000 --- a/html/changelogs/AutoChangeLog-pr-6524.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "GrrrKitten" -delete-after: True -changes: - - qol: "Makes screenshake look less low FPS/jumpy" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-6528.yml b/html/changelogs/AutoChangeLog-pr-6528.yml deleted file mode 100644 index 30d2d87478d6..000000000000 --- a/html/changelogs/AutoChangeLog-pr-6528.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "coldironwarrior" -delete-after: True -changes: - - spellcheck: "fixed the medical rig belt's description" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-6608.yml b/html/changelogs/AutoChangeLog-pr-6608.yml deleted file mode 100644 index 3f9a4bebc760..000000000000 --- a/html/changelogs/AutoChangeLog-pr-6608.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Venuska1117" -delete-after: True -changes: - - bugfix: "Make non-toxic water stop glowing." \ No newline at end of file diff --git a/html/changelogs/archive/2024-07.yml b/html/changelogs/archive/2024-07.yml index bcb5c9abe0b7..7a2ab938b286 100644 --- a/html/changelogs/archive/2024-07.yml +++ b/html/changelogs/archive/2024-07.yml @@ -11,3 +11,12 @@ a synthetic headset as opposed to a senior command headset zzzmike: - spellcheck: more clarity for facehugger/lesser drone text +2024-07-05: + AndroBetel: + - rscadd: Adds "Iron teeth" trait. + GrrrKitten: + - qol: Makes screenshake look less low FPS/jumpy + Venuska1117: + - bugfix: Make non-toxic water stop glowing. + coldironwarrior: + - spellcheck: fixed the medical rig belt's description From 5a554d0ff97eefce910059bbd97b4cf9925c2d01 Mon Sep 17 00:00:00 2001 From: Drathek <76988376+Drulikar@users.noreply.github.com> Date: Thu, 4 Jul 2024 18:53:20 -0700 Subject: [PATCH 22/23] Fix weird hardpoint and vehicle examines (#6523) # About the pull request This PR makes all hardpoints (minus van wheels since those are being changed in #6248 anyways) improperly named and changes the grammar/plurality in the vehicle/hardpoint examines. # Explain why it's good for the game Fixes this: ![image](https://github.com/cmss13-devs/cmss13/assets/76988376/38ac1ecd-01bb-417b-910d-399212ec7154) # Testing Photographs and Procedure
          Screenshots & Videos ![image](https://github.com/cmss13-devs/cmss13/assets/76988376/a99c0038-01b2-449f-b096-134bfb25f026) ![image](https://github.com/cmss13-devs/cmss13/assets/76988376/4ee6ffb8-f538-42ce-a729-33f41ceadfc3)
          # Changelog :cl: Drathek spellcheck: Fix grammar and plurality for vehicles and their hardpoints /:cl: --- code/game/objects/items.dm | 2 +- .../vehicles/hardpoints/armor/ballistic.dm | 2 +- .../modules/vehicles/hardpoints/armor/caustic.dm | 2 +- .../vehicles/hardpoints/armor/concussive.dm | 2 +- .../modules/vehicles/hardpoints/armor/paladin.dm | 2 +- .../vehicles/hardpoints/armor/snowplow.dm | 2 +- code/modules/vehicles/hardpoints/hardpoint.dm | 6 ++++++ .../vehicles/hardpoints/holder/tank_turret.dm | 2 +- .../vehicles/hardpoints/primary/autocannon.dm | 2 +- .../vehicles/hardpoints/primary/dual_cannon.dm | 2 +- .../vehicles/hardpoints/primary/flamer.dm | 2 +- code/modules/vehicles/hardpoints/primary/ltb.dm | 2 +- .../vehicles/hardpoints/primary/minigun.dm | 2 +- .../vehicles/hardpoints/secondary/cupola.dm | 2 +- .../vehicles/hardpoints/secondary/flamer.dm | 2 +- .../hardpoints/secondary/frontal_cannon.dm | 2 +- .../hardpoints/secondary/grenade_launcher.dm | 2 +- .../modules/vehicles/hardpoints/secondary/tow.dm | 2 +- .../hardpoints/special/firing_port_weapon.dm | 2 +- .../vehicles/hardpoints/support/artillery.dm | 2 +- .../modules/vehicles/hardpoints/support/flare.dm | 2 +- code/modules/vehicles/hardpoints/support/iwsa.dm | 2 +- .../vehicles/hardpoints/support/overdrive.dm | 2 +- .../vehicles/hardpoints/wheels/apc_wheels.dm | 2 +- .../vehicles/hardpoints/wheels/arc_wheels.dm | 2 +- .../vehicles/hardpoints/wheels/locomotion.dm | 16 ++++++++++++++++ .../modules/vehicles/hardpoints/wheels/treads.dm | 4 ++-- code/modules/vehicles/multitile/multitile.dm | 4 ++-- 28 files changed, 50 insertions(+), 28 deletions(-) diff --git a/code/game/objects/items.dm b/code/game/objects/items.dm index 6c354faca0b0..03e1f126e9d8 100644 --- a/code/game/objects/items.dm +++ b/code/game/objects/items.dm @@ -277,7 +277,7 @@ cases. Override_icon_state should be a list.*/ size = "huge" if(SIZE_MASSIVE) size = "massive" - . += "This is a [blood_color ? blood_color != COLOR_OIL ? "bloody " : "oil-stained " : ""][icon2html(src, user)][src.name]. It is a [size] item." + . += "[p_are() == "are" ? "These are " : "This is a "][blood_color ? blood_color != COLOR_OIL ? "bloody " : "oil-stained " : ""][icon2html(src, user)][src.name]. [p_they(TRUE)] [p_are()] a [size] item." if(desc) . += desc if(desc_lore) diff --git a/code/modules/vehicles/hardpoints/armor/ballistic.dm b/code/modules/vehicles/hardpoints/armor/ballistic.dm index 7fa19abf5b37..55f0f6bc4e6b 100644 --- a/code/modules/vehicles/hardpoints/armor/ballistic.dm +++ b/code/modules/vehicles/hardpoints/armor/ballistic.dm @@ -1,5 +1,5 @@ /obj/item/hardpoint/armor/ballistic - name = "Ballistic Armor" + name = "\improper Ballistic Armor" desc = "Protects the vehicle from high-penetration weapons" icon_state = "ballistic_armor" diff --git a/code/modules/vehicles/hardpoints/armor/caustic.dm b/code/modules/vehicles/hardpoints/armor/caustic.dm index 34bcf4c3b224..ac97d3da25f9 100644 --- a/code/modules/vehicles/hardpoints/armor/caustic.dm +++ b/code/modules/vehicles/hardpoints/armor/caustic.dm @@ -1,5 +1,5 @@ /obj/item/hardpoint/armor/caustic - name = "Caustic Armor" + name = "\improper Caustic Armor" desc = "Protects vehicles from most types of acid" icon_state = "caustic_armor" diff --git a/code/modules/vehicles/hardpoints/armor/concussive.dm b/code/modules/vehicles/hardpoints/armor/concussive.dm index a2e674255f2d..6da39b9c4173 100644 --- a/code/modules/vehicles/hardpoints/armor/concussive.dm +++ b/code/modules/vehicles/hardpoints/armor/concussive.dm @@ -1,5 +1,5 @@ /obj/item/hardpoint/armor/concussive - name = "Concussive Armor" + name = "\improper Concussive Armor" desc = "Protects the vehicle from high-impact weapons" icon_state = "concussive_armor" diff --git a/code/modules/vehicles/hardpoints/armor/paladin.dm b/code/modules/vehicles/hardpoints/armor/paladin.dm index 7635ffca74b3..fb131d47151e 100644 --- a/code/modules/vehicles/hardpoints/armor/paladin.dm +++ b/code/modules/vehicles/hardpoints/armor/paladin.dm @@ -1,5 +1,5 @@ /obj/item/hardpoint/armor/paladin - name = "Paladin Armor" + name = "\improper Paladin Armor" desc = "Protects the vehicle from large incoming explosive projectiles" icon_state = "paladin_armor" diff --git a/code/modules/vehicles/hardpoints/armor/snowplow.dm b/code/modules/vehicles/hardpoints/armor/snowplow.dm index a1b1a9dc800c..e7823854cff3 100644 --- a/code/modules/vehicles/hardpoints/armor/snowplow.dm +++ b/code/modules/vehicles/hardpoints/armor/snowplow.dm @@ -1,5 +1,5 @@ /obj/item/hardpoint/armor/snowplow - name = "Snowplow" + name = "\improper Snowplow" desc = "Clears a path in the snow for friendlies" icon_state = "snowplow" diff --git a/code/modules/vehicles/hardpoints/hardpoint.dm b/code/modules/vehicles/hardpoints/hardpoint.dm index 3aaa81daf19f..f94d0dc6b373 100644 --- a/code/modules/vehicles/hardpoints/hardpoint.dm +++ b/code/modules/vehicles/hardpoints/hardpoint.dm @@ -132,6 +132,12 @@ //------GENERAL PROCS---------- //----------------------------- +/obj/item/hardpoint/p_s(temp_gender) + if(!temp_gender) + temp_gender = gender + if(temp_gender == PLURAL) + . = "s" + /obj/item/hardpoint/Initialize() . = ..() set_bullet_traits() diff --git a/code/modules/vehicles/hardpoints/holder/tank_turret.dm b/code/modules/vehicles/hardpoints/holder/tank_turret.dm index 2a01098de523..5be6a03863f2 100644 --- a/code/modules/vehicles/hardpoints/holder/tank_turret.dm +++ b/code/modules/vehicles/hardpoints/holder/tank_turret.dm @@ -1,5 +1,5 @@ /obj/item/hardpoint/holder/tank_turret - name = "M34A2-A Multipurpose Turret" + name = "\improper M34A2-A Multipurpose Turret" desc = "The centerpiece of the tank. Designed to support quick installation and deinstallation of various tank weapon modules. Has inbuilt smoke screen deployment system." icon = 'icons/obj/vehicles/tank.dmi' diff --git a/code/modules/vehicles/hardpoints/primary/autocannon.dm b/code/modules/vehicles/hardpoints/primary/autocannon.dm index fa865f40daa1..3e12f52be097 100644 --- a/code/modules/vehicles/hardpoints/primary/autocannon.dm +++ b/code/modules/vehicles/hardpoints/primary/autocannon.dm @@ -1,5 +1,5 @@ /obj/item/hardpoint/primary/autocannon - name = "AC3-E Autocannon" + name = "\improper AC3-E Autocannon" desc = "A primary autocannon for tanks that shoots explosive flak rounds" icon_state = "ace_autocannon" diff --git a/code/modules/vehicles/hardpoints/primary/dual_cannon.dm b/code/modules/vehicles/hardpoints/primary/dual_cannon.dm index 7cb4b9a621bb..b896640a4ff7 100644 --- a/code/modules/vehicles/hardpoints/primary/dual_cannon.dm +++ b/code/modules/vehicles/hardpoints/primary/dual_cannon.dm @@ -1,6 +1,6 @@ // APC cannons /obj/item/hardpoint/primary/dualcannon - name = "PARS-159 Boyars Dualcannon" + name = "\improper PARS-159 Boyars Dualcannon" desc = "A primary two-barrel cannon for the APC that shoots 20mm IFF-compatible rounds." icon = 'icons/obj/vehicles/hardpoints/apc.dmi' diff --git a/code/modules/vehicles/hardpoints/primary/flamer.dm b/code/modules/vehicles/hardpoints/primary/flamer.dm index d0e0596c141d..fce6e7f6a410 100644 --- a/code/modules/vehicles/hardpoints/primary/flamer.dm +++ b/code/modules/vehicles/hardpoints/primary/flamer.dm @@ -1,5 +1,5 @@ /obj/item/hardpoint/primary/flamer - name = "DRG-N Offensive Flamer Unit" + name = "\improper DRG-N Offensive Flamer Unit" desc = "A primary weapon for the tank that spews fire everywhere." icon_state = "drgn_flamer" diff --git a/code/modules/vehicles/hardpoints/primary/ltb.dm b/code/modules/vehicles/hardpoints/primary/ltb.dm index 6cb84cf453da..7ccbc18a2853 100644 --- a/code/modules/vehicles/hardpoints/primary/ltb.dm +++ b/code/modules/vehicles/hardpoints/primary/ltb.dm @@ -1,5 +1,5 @@ /obj/item/hardpoint/primary/cannon - name = "LTB Cannon" + name = "\improper LTB Cannon" desc = "A primary cannon for tanks that shoots explosive rounds" icon_state = "ltb_cannon" diff --git a/code/modules/vehicles/hardpoints/primary/minigun.dm b/code/modules/vehicles/hardpoints/primary/minigun.dm index 759ce1d4153c..8bc7c55bbb8a 100644 --- a/code/modules/vehicles/hardpoints/primary/minigun.dm +++ b/code/modules/vehicles/hardpoints/primary/minigun.dm @@ -1,5 +1,5 @@ /obj/item/hardpoint/primary/minigun - name = "LTAA-AP Minigun" + name = "\improper LTAA-AP Minigun" desc = "A primary weapon for tanks that spews bullets" icon_state = "ltaaap_minigun" diff --git a/code/modules/vehicles/hardpoints/secondary/cupola.dm b/code/modules/vehicles/hardpoints/secondary/cupola.dm index c1336eb05739..a4b40c7dd3a1 100644 --- a/code/modules/vehicles/hardpoints/secondary/cupola.dm +++ b/code/modules/vehicles/hardpoints/secondary/cupola.dm @@ -1,5 +1,5 @@ /obj/item/hardpoint/secondary/m56cupola - name = "M56 Cupola" + name = "\improper M56 Cupola" desc = "A secondary weapon for tanks that shoots bullets" icon_state = "m56_cupola" diff --git a/code/modules/vehicles/hardpoints/secondary/flamer.dm b/code/modules/vehicles/hardpoints/secondary/flamer.dm index 4bdc9e602974..56a9995b60c5 100644 --- a/code/modules/vehicles/hardpoints/secondary/flamer.dm +++ b/code/modules/vehicles/hardpoints/secondary/flamer.dm @@ -1,5 +1,5 @@ /obj/item/hardpoint/secondary/small_flamer - name = "LZR-N Flamer Unit" + name = "\improper LZR-N Flamer Unit" desc = "A secondary weapon for tanks that spews hot fire." icon_state = "flamer" diff --git a/code/modules/vehicles/hardpoints/secondary/frontal_cannon.dm b/code/modules/vehicles/hardpoints/secondary/frontal_cannon.dm index d0df1d295ffc..f9e4982bb736 100644 --- a/code/modules/vehicles/hardpoints/secondary/frontal_cannon.dm +++ b/code/modules/vehicles/hardpoints/secondary/frontal_cannon.dm @@ -1,5 +1,5 @@ /obj/item/hardpoint/secondary/frontalcannon - name = "Bleihagel RE-RE700 Frontal Cannon" + name = "\improper Bleihagel RE-RE700 Frontal Cannon" desc = "The marketing department over at Bleihagel would have you believe that the RE-RE700 is an original design. However, experts who pried the cover off the cannon have discovered an object with a striking similarity to the popular M56 Cupola. It is still unknown why the cannon has two barrels." icon = 'icons/obj/vehicles/hardpoints/apc.dmi' diff --git a/code/modules/vehicles/hardpoints/secondary/grenade_launcher.dm b/code/modules/vehicles/hardpoints/secondary/grenade_launcher.dm index ecaf36213d34..060f1f7ae9ef 100644 --- a/code/modules/vehicles/hardpoints/secondary/grenade_launcher.dm +++ b/code/modules/vehicles/hardpoints/secondary/grenade_launcher.dm @@ -1,5 +1,5 @@ /obj/item/hardpoint/secondary/grenade_launcher - name = "M92T Grenade Launcher" + name = "\improper M92T Grenade Launcher" desc = "A secondary weapon for tanks that shoots grenades." icon_state = "glauncher" diff --git a/code/modules/vehicles/hardpoints/secondary/tow.dm b/code/modules/vehicles/hardpoints/secondary/tow.dm index 30eadf224bda..7b0e0ea90a27 100644 --- a/code/modules/vehicles/hardpoints/secondary/tow.dm +++ b/code/modules/vehicles/hardpoints/secondary/tow.dm @@ -1,5 +1,5 @@ /obj/item/hardpoint/secondary/towlauncher - name = "TOW Launcher" + name = "\improper TOW Launcher" desc = "A secondary weapon for tanks that shoots rockets" icon_state = "tow_launcher" diff --git a/code/modules/vehicles/hardpoints/special/firing_port_weapon.dm b/code/modules/vehicles/hardpoints/special/firing_port_weapon.dm index f051d9a21bb5..5561ee48357d 100644 --- a/code/modules/vehicles/hardpoints/special/firing_port_weapon.dm +++ b/code/modules/vehicles/hardpoints/special/firing_port_weapon.dm @@ -1,6 +1,6 @@ //this is Cupola guns that are fired from the sides of APC by support gunners /obj/item/hardpoint/special/firing_port_weapon - name = "M56 FPW" + name = "\improper M56 FPW" desc = "A modified M56B Smartgun installed on the sides of M577 Armored Personnel Carrier as a Firing Port Weapon. Used by support gunners to cover friendly infantry at APC sides." icon = 'icons/obj/vehicles/hardpoints/apc.dmi' diff --git a/code/modules/vehicles/hardpoints/support/artillery.dm b/code/modules/vehicles/hardpoints/support/artillery.dm index dfcdcaf73f74..dc3db8a3db0d 100644 --- a/code/modules/vehicles/hardpoints/support/artillery.dm +++ b/code/modules/vehicles/hardpoints/support/artillery.dm @@ -1,5 +1,5 @@ /obj/item/hardpoint/support/artillery_module - name = "Artillery Module" + name = "\improper Artillery Module" desc = "Allows the user to look far into the distance." icon_state = "artillery" diff --git a/code/modules/vehicles/hardpoints/support/flare.dm b/code/modules/vehicles/hardpoints/support/flare.dm index da1390b861d4..0fa37de34d2f 100644 --- a/code/modules/vehicles/hardpoints/support/flare.dm +++ b/code/modules/vehicles/hardpoints/support/flare.dm @@ -1,5 +1,5 @@ /obj/item/hardpoint/support/flare_launcher - name = "M-87F Flare Launcher" + name = "\improper M-87F Flare Launcher" desc = "A support module for APCs that shoots flares." icon = 'icons/obj/vehicles/hardpoints/apc.dmi' diff --git a/code/modules/vehicles/hardpoints/support/iwsa.dm b/code/modules/vehicles/hardpoints/support/iwsa.dm index c3de90c871b6..97fee4e0551a 100644 --- a/code/modules/vehicles/hardpoints/support/iwsa.dm +++ b/code/modules/vehicles/hardpoints/support/iwsa.dm @@ -1,5 +1,5 @@ /obj/item/hardpoint/support/weapons_sensor - name = "Integrated Weapons Sensor Array" + name = "\improper Integrated Weapons Sensor Array" desc = "Improves the accuracy and fire rate of all onboard weapons" icon_state = "warray" diff --git a/code/modules/vehicles/hardpoints/support/overdrive.dm b/code/modules/vehicles/hardpoints/support/overdrive.dm index 1b61d6c63dfb..4daa2fddad0a 100644 --- a/code/modules/vehicles/hardpoints/support/overdrive.dm +++ b/code/modules/vehicles/hardpoints/support/overdrive.dm @@ -1,5 +1,5 @@ /obj/item/hardpoint/support/overdrive_enhancer - name = "Overdrive Enhancer" + name = "\improper Overdrive Enhancer" desc = "Increases the movement speed of the vehicle it's attached to" icon_state = "odrive_enhancer" diff --git a/code/modules/vehicles/hardpoints/wheels/apc_wheels.dm b/code/modules/vehicles/hardpoints/wheels/apc_wheels.dm index 62c5e430c747..4bf8ca59e2ca 100644 --- a/code/modules/vehicles/hardpoints/wheels/apc_wheels.dm +++ b/code/modules/vehicles/hardpoints/wheels/apc_wheels.dm @@ -1,5 +1,5 @@ /obj/item/hardpoint/locomotion/apc_wheels - name = "APC Wheels" + name = "\improper APC Wheels" desc = "Integral to the movement of the APC." icon = 'icons/obj/vehicles/hardpoints/apc.dmi' diff --git a/code/modules/vehicles/hardpoints/wheels/arc_wheels.dm b/code/modules/vehicles/hardpoints/wheels/arc_wheels.dm index 9bb6c31746e0..17726e75c024 100644 --- a/code/modules/vehicles/hardpoints/wheels/arc_wheels.dm +++ b/code/modules/vehicles/hardpoints/wheels/arc_wheels.dm @@ -1,5 +1,5 @@ /obj/item/hardpoint/locomotion/arc_wheels - name = "ARC Wheels" + name = "\improper ARC Wheels" desc = "Integral to the movement of the ARC." icon = 'icons/obj/vehicles/hardpoints/arc.dmi' diff --git a/code/modules/vehicles/hardpoints/wheels/locomotion.dm b/code/modules/vehicles/hardpoints/wheels/locomotion.dm index c05ada322a8d..a0e57c3e97d4 100644 --- a/code/modules/vehicles/hardpoints/wheels/locomotion.dm +++ b/code/modules/vehicles/hardpoints/wheels/locomotion.dm @@ -12,6 +12,22 @@ var/move_momentum_build_factor = 0 var/move_turn_momentum_loss_factor = 0 +/obj/item/hardpoint/locomotion/p_are(temp_gender) + if(!temp_gender) + temp_gender = gender + . = "is" + if(temp_gender == PLURAL) + . = "are" + +/obj/item/hardpoint/locomotion/p_they(capitalized, temp_gender) + if(!temp_gender) + temp_gender = gender + . = "it" + if(temp_gender == PLURAL) + . = "they" + if(capitalized) + . = capitalize(.) + /obj/item/hardpoint/locomotion/deactivate() owner.move_delay = initial(owner.move_delay) owner.move_max_momentum = initial(owner.move_max_momentum) diff --git a/code/modules/vehicles/hardpoints/wheels/treads.dm b/code/modules/vehicles/hardpoints/wheels/treads.dm index dd819ea2af03..561795b8531e 100644 --- a/code/modules/vehicles/hardpoints/wheels/treads.dm +++ b/code/modules/vehicles/hardpoints/wheels/treads.dm @@ -1,5 +1,5 @@ /obj/item/hardpoint/locomotion/treads - name = "Treads" + name = "\improper Treads" desc = "Integral to the movement of the vehicle." icon_state = "treads" @@ -17,7 +17,7 @@ move_turn_momentum_loss_factor = 0.6 /obj/item/hardpoint/locomotion/treads/robust - name = "Reinforced Treads" + name = "\improper Reinforced Treads" desc = "These treads are made of a tougher material and are more durable. However, the extra weight slows the tank down slightly." health = 500 diff --git a/code/modules/vehicles/multitile/multitile.dm b/code/modules/vehicles/multitile/multitile.dm index ce118fd14c56..bcd48c3633be 100644 --- a/code/modules/vehicles/multitile/multitile.dm +++ b/code/modules/vehicles/multitile/multitile.dm @@ -258,7 +258,7 @@ /obj/vehicle/multitile/get_examine_text(mob/user) . = ..() for(var/obj/item/hardpoint/H in hardpoints) - . += "There is \a [H] module installed." + . += "There [H.p_are()] \a [H] module[H.p_s()] installed." H.examine(user, TRUE) if(clamped) . += "There is a vehicle clamp attached." @@ -267,7 +267,7 @@ for(var/datum/role_reserved_slots/RRS in interior.role_reserved_slots) passengers_amount += RRS.taken if(passengers_amount > 0) - . += "You can sense approximately [passengers_amount] hosts inside." + . += "You can sense approximately [passengers_amount] host\s inside." /obj/vehicle/multitile/proc/load_hardpoints() return From a26c0a4318f8fd00c78027e996d4ef4dcf89abf3 Mon Sep 17 00:00:00 2001 From: cm13-github <128137806+cm13-github@users.noreply.github.com> Date: Fri, 5 Jul 2024 02:58:49 +0100 Subject: [PATCH 23/23] Automatic changelog for PR #6523 [ci skip] --- html/changelogs/AutoChangeLog-pr-6523.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-6523.yml diff --git a/html/changelogs/AutoChangeLog-pr-6523.yml b/html/changelogs/AutoChangeLog-pr-6523.yml new file mode 100644 index 000000000000..8a3caa8e33e9 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-6523.yml @@ -0,0 +1,4 @@ +author: "Drathek" +delete-after: True +changes: + - spellcheck: "Fix grammar and plurality for vehicles and their hardpoints" \ No newline at end of file
          [GLOB.tagger_locations[i]]