From c908dcca43bf119131bde8e4f87022e417c0a588 Mon Sep 17 00:00:00 2001 From: Razharas Date: Tue, 13 Sep 2016 16:38:20 +0300 Subject: [PATCH 01/10] Brings tablets into the light of modernity Brings tablets into the light of modernity Makes their sprites look much more fancy --- icons/obj/modular_tablet.dmi | Bin 1596 -> 2216 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/icons/obj/modular_tablet.dmi b/icons/obj/modular_tablet.dmi index 82f4e1438f65c4019f29c8c7da1173d157721a60..fd3e412df8106c66fc7e4d56c61695788b95938c 100644 GIT binary patch literal 2216 zcmX|D2~?8X7XE!0ib|5^5IOL&$g+VesX65kn5Lqome+exGs3CVu8<=b;E-8nr8yCj z4Q5W5R5pmB-pqS3H6<-4((;v-C`}!rn0L>Y^eG(Q*UKN@($ZpXZXOa6f(5ZC6bgs}fMNiP1wjx10R^y1 zr;Gt2#Zm;2NF2#~@1_wWDw`4a@O02vDuV}YzWWt236kAMIRAhW3D<~A9^IrkR zS0G=e=#$UqH#Ie#E`M3Rm)EN3NriHh;0HKQ4k|cRHYNK9QgEl@PyP`ZM~RG$0f0pI z0ev^H|{mY6G%+s3(u$45nh;J=cR ze|3l{JC_yKF!rg;`B?dmnH;GU-3@*BY}CGLXLoWQ@%!ssYAeIWfMBH8i03@IR^4nq z|Fs}Jvti95+BdqE*D!w=Ox8S{niSvlHVt#x&F)UpLzB*n0o5dz9+R5u8k0h?`VGHo z2xMz1>4mO7vo(_c!ev4|;Ndn`m8Vs?fG8t~Y5h)6vaT(uL*+9lA0fyL*srjuh>aeJ z*W4WEkfK8mahoc4=Naw3hj+3t^TH(<)Z8fe@P30ugD9r=s;-AR=#@0-D?}o^Dhul@Ev)}EqG0vpM*h#13Y@hX_iW~%| z4lL}#2Hh$Mj4akhv>PyLYstrWY%jE`3*rzXfY)R-(nhc3eg9G2D%aE^mK}o=mP10V zOT_{P!Ku()-1k}FrXBP-nPoh4q9+ul1lKJ#KXil652&5vP}7YCmu)LmAEbHoJ4k+o zsg(=y@)w;qV$_1PE6VqJXbs)Du%G%X(cnxtuT53Wetl+=d&}m}3rDlLFtJfsR`pnI zrw#hFdl?NcRNU zuRqtwl15tI+bl_XVZFi}V?eCHs=fL}GqNaJhy!!++2V*PTHYbYx~=yUl)H~SU%9Jg zF&;nbxt)npS0JoWWI?GLk~i)v#=e}4r>=t=PKEz&U{ep+@WLIv&qwM+)oG)Iw%1EL z3bnjmc{zE8gW})=0*)Bb*B=;717MbqXmf%TVm{O}0ekdd(^N%2{!i8nRR;CB4aM)p zX&Fu}!8xwXNHbEPEBYCY)$yfV)B^|(G{ojb!YxxFe!FRxgN%P^ERwBCbe^nBRiA4P z?`BY)(g-(QGLfV|vCfdS6}&DJWfr{&73H$hjZw2bv`Tf<3p2X zFsWtfx>3>_>eWS=HP!akS=~;d?nf`>X{Bq6C*s6%wlAdf6$j%NWKCH~8^tPhdl56oh>QZ}~M$-%y=W}XQ z#hn_X+e*JgT!+nRmPk(Nt6a;=4t`znI46o?+WUw&cfs2&Uj1<&?7w<4Q9*B(JM@O0 z&8`mhP^VKGV~I{qHWVV=G-V3*R?zZ_I`Q+#!M8SImcI03c@gT275MhUDu*@8awJji{hVH;S3kRII*iZ37WaKCcbkuWIiKPXys18hR^1t)JbZ7ubjrnZMA{iQ zX7@jR5IE0qg)*^vON&nwR;AG~uzfbH{z7=e^nQ)<6=PCd0n5|;E$3y1Lk1>NO%rZJ?7F;(l+w~1j`Vns{>^?6PXdl@W z8`K)g+#=ws9$_U+KVMmz)VEA58$j)CO?kz=MEJCSP&LD4t57B@&lzPwciR+i?JQZ) z^KW~POuY{v{TH*~x^Hz;Q&TTBtA>o%`S|1sV^;^|=(=&0h&V}GI>u1dWpzQ%I`Bj_ z6wmDL?w0)XFO&9#E|xmN7N-{D>&Ke#!8HEXAzvD$DPwlI(Ddv^ zMnzOwfZ=UnbF4f&gr4pojD98Y*&y)=&KMVV|AOpKHCcVqY6urt#JxfN|EBFvr?Gp# z)aflzN772fvQ>7aeClj)Mc)!Mi^EO$kdg^Qb~P{7G$+e5+~cNVnBxem!#p~@>oF%~ zVh?S*?nku>2j?bCM0j3(bvE&qRoD?5Q*tT$QXK_uQ1_GZ2~I)^_c#P^ z3Kgp+uI(+T-50(SDy>Q|DS_*i^A+! z8|K~1d2khh*sQN8Je`wh8O`DiH-(M>*?qM1yxC@h_G8V-A2PP_F&(v(hrkXL9n6p)>9GhP+3khfmsE9*mhdeX-P|eamC2b#oV~A?IH2 zYcbmFj|sft(^3h}y0@}#;sxf(+5TI00Tc3bxk&Z}$Uf@i1L4$m4TH`DK8+>ZACHD? fPvZ42JONkh8p`}PpeZlg literal 1596 zcmZ8f3pCSv9RE!j#aa(tg>LI{qe)>#B&Mu#%REwgxW@6C$tJB5?ZHqus8)*1$OovSZP`G&{ejTTgxlD6V}Y`zkAQU_niAZ=llJ9ALo3(pY#2GGkgg<5%bOF0{{?S zyFC3NR6yEdI0v$5BJTqP)xLWI@GUJZ;o;%Q$;nn$R$FOb%gf7kQ0bxugZYjq6iO!n zI>>eN20DPzVE`HALxp@G!2pRwg3(1n9l)6{;OrkDLj`iCzLvkSkFq%JMFTj0#9SQl%5(5sU#Ye}{qNx-B5(=~T zwh|uN8gH#9`o;F9>^Qu@Vl&IJWL~VP8>;ir^BrsL;*FOweT4J-_8~l++v;RB+L3VX z*3U(g;v-3~%Xm0K$g@;UM43;O1yToW*W9wdz2T!#LX84Bury>G}N< zKe=@_jcX`x*%7+U;>X~kw6l6KDQ*k4h4Ewaj-GUze~59a<`I+7=uE7!*cLXNS7Q>E zXTK@RfxX|Z$G*lQzrN9ZP5pN9&)bCx{R({}{t(GV{z2&T7|t#4wlB$95I{yXljqG= zcfxirT*llb-ZF_}`cxHE^dPHRV(Rp zh^QI9JS=Dj0CSgmd3ppS6pnHapDe(cq_z9a@DdE_bfMg=9#@I8 z_$LJ`hDjzipFQG;@rvC4rrQtzoVBOakiPMkh1tBLta+thRB)tiNf)0y1GD^`yZ-pu zhK{i)EQ9xg_O9NLw3yJ7VKn4nOma)giwMVEp9X!_8tkpWdj^F$H(Wx7+-DqN%2PeV z@SPmf=mLLz$|75yC5E0_rHAe%vRP|5)G0d>wL949QwOSj+;TbQ=`;0$Rf<$^EBK32 zYM#kanUWRs;GGlcnzuRj%H(~ICvoPk6Fj{5jCQ!qCB$Tv!q<6%n1EzH)`MQ4+{F6L&o8~N*_m3 z6^`IkUI3StxH&znq4mvZ_=uYOqQe~+_wi))(sKBc^E(sab z(%B~X1gurkuG=JmDnFIsULR#z*Gid_iO8c2r_3u)Wo0n%e&vT>d@Z|jm{!S}up#TM zgIO-mdfyT9kd;AyhR6{Q41}qMI;7sob$F3{F5fc$g1iVFuQ8mVpQD~bpwz4Dkj<^t z6~*R6rIDI$`^m@tf16&~r_&MBPN*m+)3+qwkd54OND!gXSm{2Cy)gZi_g7W7-t<)m z**s>YoZP~{9+#GXX`sVR7O-b7>2%g)Q)?+U0N0wOi8_yT~Pt7(Azz6%6 zE1#qXyD&ENU&~l{ZsPrH!Ph$c1M~J%gVQ%c-q_4u>#|gnjMO+?_SjbgtBc3v(l~}@EtYC&Q4)dvrwtE?_ zWC%D-4Ek~GTNc%xJN7NHpnqDcFfWYQyL$&GNB9-D>mB6?l%_k Date: Tue, 13 Sep 2016 18:00:23 +0300 Subject: [PATCH 02/10] Ok lets tone down the steve jobs Ok lets tone down the steve jobs --- icons/obj/modular_tablet.dmi | Bin 2216 -> 2239 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/icons/obj/modular_tablet.dmi b/icons/obj/modular_tablet.dmi index fd3e412df8106c66fc7e4d56c61695788b95938c..4b511501bcbd8586f2735289eb4405c2e425e217 100644 GIT binary patch delta 1849 zcmV-92gdlQ5x)_TBwVpjOjJd{z`&@esDXijW@ct&WMorQQ!OnmL_|a*BO^2aGaw)! z0BQgLnE*30|Ns90{{R6005bsp0GR*)%rgK00095Y0L;wH05xg=iS!i$#4~39|Ns90 zX8)0QFbn{J?q)O0%>MxYGntXU9t1cOa`>^~H35H@Nkl3wNSO5QQ;`tl<{^YC8fdTq>r>Im6~pyX)nI!vmPHUlU~*RA-1IiJ z$>d^Mgqhx|7CD>FSf1I8%}sAriwJ}HpA-#V<|w{Kul2Jjdv9=2Ft}VUOMih%zmiDR zR_K3@LU-%x$4(G5m;p4H0W?^qS55E`67UODdh+&~(EFC)Z<^~D^yAf_A^q41s%lJ? zkg5g?uV1+a6$zH=HM*p#%c{C4V35W^nUI%;1pES(o+%MDA#4|`xjxWjD8YD~EBOT~ zJt`6THsduG>3EG+(+7VfQ~OBgSmWTOyj*`BUmw~y*x8ZH^0K^(mX3ohzCjI|%n=f_ zZC)FE!SBFzGM>FJm8d1mx3A74*uh$(8UvEG9OS+srfzI|Pk28-Wjq=q`xPpONF2kqj@@C2nhY z7vw)ro&)Pn`kXR@3^m9O&j1Z1Dz1Ms{PnG63!@2oiW*btPEU8yqzQU>4OY^f@*1>FC+J}YD(Vhu z&`u2+N-#0N0TZgGI|9_8jVE}MqkTQwBo$p!rK1Lu3z$&n1`kIfSeLA-BVF`h5Kd71 z6`dP-<%{<9?z^ayUQ8tz9jt%gU9y^vHW@d)pb6e25g-Za=-GTqyQo5U5M9|NkJw}s zyI?b&AP9mW2!bF8q9I+Mu9()f=imCS8-Itp*46WKeb?pZv8SG3=?e^8*Pef?v%aqG zHqfo>!vtxg`L`D5_f)#uMA!c0xcd6Ky4y%s&%eo8oon=yDs=7nH|6?XQpDQxe{dH)9Lbz+ z7uA}7)1Kes@ydu*>tjtup=-~-Rb5|KcN^-)4~Dze34$O9f*=TjAQ}?nDC)oGDC!?_ z6!qI2$Jec3yhw^I!gPkY%?T4Dv=%SCHLBmZZ43j2(3)Qf)2A^_(2BZ4J zh6&>dK0iMPKinU|^!yw$_>=G3Kjl?C01fthm=FeC*A336u)!QdH7F8%d3gbMQT8OJ zZ=OVe$S&G*gNlC|9DaiC!zOTk&4Z8r3QkaF7u^P#;9tHM{F=`K-v-qzI-xEyndTKDt zeBH35i$;GVAz*MJcTbIhelQ7+eivwGtmTaPnQIGS&+;*f6qeD40?r%R*gO=DqV`pPEm_MT!Bgy&1 nSQ8Y!_WKbVBnW~ah!f*~8b|H`_D1zW00000NkvXXu0mjfWD191 delta 1826 zcmV+-2i^F;5vUQ6BvZ6dOjJd{z`!UdC|_S+GygLnARqv0005Z)Gc*7H{{a600RI3p z0RI30005Z)0L(K0|I7enWMs_D%z=S{05xg=iS!i$#4~39|Ns90X8)+DsF8p$7-r07 zW@cspf$nBA%*_7)ng0O)Gnr=p0Fk^N1fnmn!m-{p0e^i-L_t(|ob8+ociKh}h1nV` zsS-FwjU7ZDtsOrS$8pm(^#T6>|LQ*UEHhf6l~`$+4-mu`fv&D*R<6v)RGPAS#E?PSdc7M2o`e`zz8{m1oHu!?yfde)Ft1lLq z?)z$eUp#{Ky7k>3CjQ6%Ge!d!)XFW}TX%cF$4h=wuLV{@{WLQEbx_yJk z>7vZg0KPu6Z;)vXGJFG5Eq#qz9Wl6=`~2V%w*`C%^1o-#fptHBPMtx98f3*YKm(bI z>kNPWi7FnkePRjgi~Ko|o~?_Wi)swA@_#0FuTS`XSKHR)Rb&>V^HlR0n zoF-$hixLDu5ClOG1VOYTtZ=vT)4O%r=1Qa3(Hr0Jyf`4z` zSWPh0)R<292YQHRO)$i3u#xW9*Pv%R!4NahQ1?-TUT)A*f|&shm{2p_7oY|`Ji*Hf z-RtEhsp*nB9W|I;z=V1?Se%JqU9zc;bkV{foZymkDX)Cdz21Kp_4A9Z1l7q3-X)vq zXp;%@3!30%76FowiC)g9wu@?XAAixcUGj)cMsoH7IMIjeJleskQ}{GLt^5It+6h;BUp)^vSSJ-`fVbmRHA^gDIq`F}l~u7sQB1J*ayVS^goc>YbhewY=p@%$g$MT;|;)9s>0^KZuUdpuqlv2J~=$!K)r`M0L) zo9aPJ-TKLJ-#S4M1VIo4K@dbs;tKovZx#0Sw-xsFs|v^0C-Gvjh-b6wI0~Zp9b|Bo zgBVPbxBSAFpur^JSALUAK!0b9U-?ZgyVsS$WweTebpRR^&X%j?aw!~w21k$}-+VN| z)%y=cggqEcWWI^I2XrR$Ve0;Hy;_5S!H=sC?`4AG`VlagBVMo9 z@y+cGWbku2!Owufz7J6uZ(71&f+D`O1W|)`>$~{&<`yz|pVuHS!hd_npo~uCIM@V* zK_tQZ`=X29g9a@(nIy@Y^c7UY+8TVQ02);FhYb_f6MTGpjK2h5;;&Cnkil>K*#0K3 z;sI!I;KPJ47z9E5^c6N(VXOv4g3r&-;33K$#PrRB2oO0$2X0VPgX2#yxLe2m_m}uO zn!^do?9^?P3H}*{@qhQ1A8{0cr)qyy7^A_zZ~lp2euO;1YslbF5#Uc=h2p`_F&fl- z9{jh$7!AHFaMB<_5ClOG1VIo)J8XZP(dn-h_I2HVn$`RKoT>imabBm>_6CQZpm*VW zh6x(YzxA!Zdj5q-aO!S?;t(}Tuzr5cww`JKLMl3p<|Mjyv4Co1b*( zW_l^xZN#SAP2OwVV>gZ1ZsTl5kp*mIL{&tQUoQMN7b>^zU>L&^p$v#iGnxOEt+aEb>kRS+xAWn?`04CBZaNLxU Q>Hq)$07*qoM6N<$g2&l@>;M1& From fdccd223cd3c33a18ce52de04964ffb3e59995f7 Mon Sep 17 00:00:00 2001 From: Razharas Date: Tue, 13 Sep 2016 18:05:40 +0300 Subject: [PATCH 03/10] Oops wrong save Oops wrong save --- icons/obj/modular_tablet.dmi | Bin 2239 -> 2240 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/icons/obj/modular_tablet.dmi b/icons/obj/modular_tablet.dmi index 4b511501bcbd8586f2735289eb4405c2e425e217..2438f375f6518089070e6f3f2cceca775b489a96 100644 GIT binary patch delta 1767 zcmVP7s!vF&g;CWTF z`NZ(~an69_lUf!*41vj6fpgQ_)FzXQX%S|6t6Jo2I%9ceGd4H9RV^Y6e#lWYc$uU4 z8ok!frtH1JMZw^5xh(w!D*Z|#Ra>EdI||*cs~35U(kIE?PPcw)h4$Xfj7g(6)JP@CCmE2WtLPM=UViaiaAd@d(z@^(!T4G67v( zBshD=s6MhdpHA6(<_ptX)h29SU{wAHf*=TjAc$VG%F(`V`gF=#@iU0kD!PIOH1$ia ziTnGH7I%^Vn9>>g#TfqVDG?>eo5i*DX(cY2Bnj@v>zG#3$w&`iUf%W@x}5%SHg`UN++T z>z_n|nKCqBFk3=MLZy0twuJkhpr=Skr8`&+8Z~$b$U_pWsynI#FD{HG=qYMUr8_;{ zMUy7z;Wb!EcgkzfHl3h{8K|f`s6jh5XehzN00&H{n(hctgEpSvO^){UY?D-UNtKQo zOfFzTof|wHiC|r_s*ZHggF!e!@mF+i=*PegtyKej)?pjyR z&-GoGpU0khf~7Aoa9w-;t*{VJT|NIM zXLYX8PmWug-&5&-E}|z*6w$Tk->R;!tGk#%g|0pS7JsI$J-?^Yqv5W;u08)&V|`s6 zHmK0G=iij;dr1*%&;P+)^l&6|x?NOj{!M#+kH;$`R;`aU8HKJr|5kNDa~xl{g7tbGESH~u0^jw6&yc}M3Suw}Kk^G- zf(FBoU-?Zg0i7{^`eS`sKOy=Z~zJN%|{cQeEE8aumgjk z%r}hg0iDTwSae@s&(|Pe@Z03;7nz{Aegh1K=^o0j4Geak;2(c}2sWEdaCd(P8T_72 z@H=3z>s?fT#v7L~n4pL+E}`U=Ad=wY|#$ly=DZ~v56@c=Z~^I<|5 zbX_+%pTY)n4Ar1W@a5$N+(p@wn7(-u0V2C-&kZVnYH;`ox(}Pc`85wd`71a!OsUq zX^TfpZZLw%>uCiXr8CL|`OYbKP}_5x8DuPJVz+3G7}WKLiM}T|$1G?ZLRIzU-*%bf*?+e{{gag8IWU>R>=SW002ov JPDHLkV1nEtZ+!p& delta 1765 zcmVzE%kw;Mi|ICq>HxR(Uz_hfqy}i9`qQ*EAa`>^{H35H@ zNkl3wNSO5QQ;`tl<{^YC8fdTq>r>Im z6~pyX)nI!vmPHUlU~*RA-1IiJ$>d^Mgqhx|7CD>FSf1I8%}sAriwJ}HpA-#V<|w{K zul2Jjdv9=2Ft}VUOMih%zmiDRR_K3@LU-%x$4(G5m;p4H0W?^qS55E`67UODdh+&~ z(EFC)Z<^~D^yAf_A^q41s%lJ?kg5g?uV1+a6$zH=HM*p#%c{C4V35W^nUI%;1pES( zo+%MDA#4|`xjxWjD8YD~EBOT~Jt`6THsduG>3EG+(+7VfQ~OBgSmWTOyj*`BUmw~y z*x8ZH^0K^(mX3ohzCjI|%n=f_ZC)FE!SBFzGM>FJm8d1mx3A74*uh$(8UvEG9OS+srfzI|Pk z28-Wjq=q`xPpONF2kqj@@C2nhY7vw)ro&)Pn`kXR@3^m9O&j1Z1Dz1Ms{PnG63!@2oiW*btPEU8y zqzQU>4OY^f@*1>FC+J}YD(Vhu&`u2+N-#0N0TZgGI|9_8jVE}MqkTQwBo$p!rK1Lu z3z$&n1`kIfSeLA-BVF`h5Kd716`dP-<%{<9?z^ayUQ8tz9jt%gU9y^vHW@d)pb6e2 z5g-Za=-GTqyQo5U5M9|NkJw}syI?b&AP9mW2!bF8q9I+Mu9()f=imCS8-Itp*46WK zeb?pZv8SG3=?e^8*Pef?v%aqGHqfo>!vtxg`L`D5_f)#uMA!c0xcd6Ky4y%s&%eo8 zoon=y zDs=7nH|6?XQpDQxe{dH)9Lbz+7uA}7)1Kes@ydu*>tjtup=-~-Rb5|KcN^-)4~Dze z34$O9f*=TjAQ}?nDC)oGDC!?_6!qI2$Jec3yhw^I!gPkY%?T4Dv=%SCH zLBmZZ43j2(3)Qf)2A^_(2BZ4Jh6&>dK0iMPKinU|^!yw$_>=G3Kjl?C01fthm=FeC z*A336u)!QdH7F8%d3gbMQT8OJZ=OVe$S&G*gNlC|9DaiC!zOTk&4Z8r3QkaF7u^P# z;9tHM{F=`K-v-qzI-xEyndTKDteBH35i$;GVAz*MJcTbIhelQ7+eivwGtmTaPnQIGS&+;*f6qeD40 z?r%R*gO=DqV`pPEm_MT!Bgy&1SQ8Y!_WKbVBnW~ah!f*~8b|H`_D1zW00000NkvXX Hu0mjf5l(3v From a85861d4886a64002244798640e5d51eb38f4b7a Mon Sep 17 00:00:00 2001 From: Remie Richards Date: Fri, 12 May 2017 19:17:30 +0100 Subject: [PATCH 04/10] Initial framework + Gas Spread + ZShadows + Early attempt at pipes. --- _maps/map_files/debug/multiz_test.dmm | 209 ++++++++++++++++++ _maps/multiz_test.dm | 21 ++ code/__DEFINES/atmospherics.dm | 5 +- code/__HELPERS/icon_smoothing.dm | 9 +- code/controllers/subsystem/air.dm | 7 + code/controllers/subsystem/icon_smooth.dm | 1 + code/controllers/subsystem/multiz.dm | 20 ++ .../environmental/LINDA_system.dm | 19 +- .../atmospherics/gasmixtures/gas_types.dm | 2 +- .../atmospherics/machinery/atmosmachinery.dm | 2 +- .../atmospherics/machinery/other/zvent.dm | 20 +- .../atmospherics/machinery/pipes/multiz.dm | 26 +++ code/modules/multiz/atoms.dm | 119 ++++++++++ code/modules/multiz/turfs.dm | 31 +++ code/modules/multiz/z_helpers.dm | 60 +++++ code/modules/multiz/zshadows.dm | 63 ++++++ icons/obj/atmospherics/pipes/multiz.dmi | Bin 0 -> 1884 bytes tgstation.dme | 8 +- 18 files changed, 610 insertions(+), 12 deletions(-) create mode 100644 _maps/map_files/debug/multiz_test.dmm create mode 100644 _maps/multiz_test.dm create mode 100644 code/controllers/subsystem/multiz.dm create mode 100644 code/modules/atmospherics/machinery/pipes/multiz.dm create mode 100644 code/modules/multiz/atoms.dm create mode 100644 code/modules/multiz/turfs.dm create mode 100644 code/modules/multiz/z_helpers.dm create mode 100644 code/modules/multiz/zshadows.dm create mode 100644 icons/obj/atmospherics/pipes/multiz.dmi diff --git a/_maps/map_files/debug/multiz_test.dmm b/_maps/map_files/debug/multiz_test.dmm new file mode 100644 index 00000000000000..ca49462406b5fe --- /dev/null +++ b/_maps/map_files/debug/multiz_test.dmm @@ -0,0 +1,209 @@ +"aa" = (/turf/open/space,/area/arrival/start) +"ab" = (/turf/closed/wall,/area/arrival/start) +"ac" = (/turf/open/floor/plasteel,/area/arrival/start) +"ad" = (/obj/machinery/light{tag = "icon-tube1 (NORTH)"; icon_state = "tube1"; dir = 1},/turf/open/floor/plasteel,/area/arrival/start) +"ae" = (/obj/machinery/light{tag = "icon-tube1 (WEST)"; icon_state = "tube1"; dir = 8},/turf/open/floor/plasteel,/area/arrival/start) +"af" = (/obj/machinery/conveyor/auto{tag = "icon-conveyor0 (NORTHEAST)"; icon_state = "conveyor0"; dir = 5},/obj/vehicle/janicart,/turf/open/floor/plasteel,/area/arrival/start) +"ag" = (/obj/machinery/conveyor/auto{tag = "icon-conveyor0 (EAST)"; icon_state = "conveyor0"; dir = 4},/turf/open/floor/plasteel,/area/arrival/start) +"ah" = (/obj/machinery/conveyor/auto{tag = "icon-conveyor0 (EAST)"; icon_state = "conveyor0"; dir = 4},/obj/item/target/clown,/turf/open/floor/plasteel,/area/arrival/start) +"ai" = (/obj/machinery/conveyor/auto{tag = "icon-conveyor0 (EAST)"; icon_state = "conveyor0"; dir = 4},/obj/vehicle/janicart,/turf/open/floor/plasteel,/area/arrival/start) +"aj" = (/obj/machinery/conveyor/auto{tag = "icon-conveyor0 (SOUTHEAST)"; icon_state = "conveyor0"; dir = 6},/turf/open/floor/plasteel,/area/arrival/start) +"ak" = (/obj/machinery/light{tag = "icon-tube1 (EAST)"; icon_state = "tube1"; dir = 4},/turf/open/floor/plasteel,/area/arrival/start) +"al" = (/obj/machinery/conveyor/auto{tag = "icon-conveyor0 (NORTH)"; icon_state = "conveyor0"; dir = 1},/turf/open/floor/plasteel,/area/arrival/start) +"am" = (/obj/machinery/conveyor/auto,/obj/vehicle/janicart,/turf/open/floor/plasteel,/area/arrival/start) +"an" = (/obj/machinery/conveyor/auto{tag = "icon-conveyor0 (NORTH)"; icon_state = "conveyor0"; dir = 1},/obj/item/target/clown,/turf/open/floor/plasteel,/area/arrival/start) +"ao" = (/obj/machinery/light/small,/turf/open/floor/plasteel,/area/arrival/start) +"ap" = (/obj/machinery/conveyor/auto,/turf/open/floor/plasteel,/area/arrival/start) +"aq" = (/obj/machinery/light/small{tag = "icon-bulb1 (EAST)"; icon_state = "bulb1"; dir = 4},/turf/open/floor/plasteel,/area/arrival/start) +"ar" = (/obj/machinery/light/small{tag = "icon-bulb1 (WEST)"; icon_state = "bulb1"; dir = 8},/turf/open/floor/plasteel,/area/arrival/start) +"as" = (/obj/machinery/conveyor/auto,/obj/item/target/clown,/turf/open/floor/plasteel,/area/arrival/start) +"at" = (/obj/machinery/conveyor/auto{tag = "icon-conveyor0 (NORTH)"; icon_state = "conveyor0"; dir = 1},/obj/vehicle/janicart,/turf/open/floor/plasteel,/area/arrival/start) +"au" = (/obj/machinery/light/small{tag = "icon-bulb1 (NORTH)"; icon_state = "bulb1"; dir = 1},/turf/open/floor/plasteel,/area/arrival/start) +"av" = (/obj/machinery/conveyor/auto{tag = "icon-conveyor0 (NORTHWEST)"; icon_state = "conveyor0"; dir = 9},/turf/open/floor/plasteel,/area/arrival/start) +"aw" = (/obj/machinery/conveyor/auto{tag = "icon-conveyor0 (WEST)"; icon_state = "conveyor0"; dir = 8},/obj/vehicle/janicart,/turf/open/floor/plasteel,/area/arrival/start) +"ax" = (/obj/machinery/conveyor/auto{tag = "icon-conveyor0 (WEST)"; icon_state = "conveyor0"; dir = 8},/turf/open/floor/plasteel,/area/arrival/start) +"ay" = (/obj/machinery/conveyor/auto{tag = "icon-conveyor0 (WEST)"; icon_state = "conveyor0"; dir = 8},/obj/item/target/clown,/turf/open/floor/plasteel,/area/arrival/start) +"az" = (/obj/machinery/conveyor/auto{tag = "icon-conveyor0 (SOUTHWEST)"; icon_state = "conveyor0"; dir = 10},/obj/item/target/clown,/turf/open/floor/plasteel,/area/arrival/start) +"aA" = (/obj/effect/step_trigger/teleporter{teleport_x = 3; teleport_y = 6; teleport_z = 2},/turf/open/floor/plasteel/stairs,/area/arrival/start) +"aB" = (/obj/effect/landmark/latejoin,/turf/open/floor/plasteel,/area/arrival/start) +"aC" = (/obj/machinery/power/smes/magical,/turf/open/floor/plasteel,/area/arrival/start) +"aD" = (/turf/open/floor/plasteel/stairs,/area/arrival/start) +"aE" = (/obj/machinery/power/terminal{tag = "icon-term (NORTH)"; icon_state = "term"; dir = 1},/obj/structure/cable{tag = "icon-0-4"; icon_state = "0-4"},/turf/open/floor/plasteel,/area/arrival/start) +"aF" = (/obj/structure/cable{tag = "icon-2-8"; icon_state = "2-8"},/turf/open/floor/plasteel,/area/arrival/start) +"aG" = (/obj/machinery/light,/turf/open/floor/plasteel,/area/arrival/start) +"aH" = (/obj/machinery/power/terminal,/obj/machinery/power/apc{pixel_y = -24},/obj/structure/cable,/turf/open/floor/plasteel,/area/arrival/start) +"aI" = (/obj/machinery/gravity_generator/main/station,/turf/open/space,/area/arrival/start) +"aJ" = (/obj/effect/step_trigger/teleporter{teleport_x = 4; teleport_y = 18; teleport_z = 3},/turf/open/floor/plasteel/stairs,/area/arrival/start) +"aK" = (/turf/open/open_z,/area/arrival/start) +"aL" = (/obj/effect/step_trigger/teleporter{teleport_x = 3; teleport_y = 5; teleport_z = 1},/turf/open/floor/plasteel/stairs,/area/arrival/start) +"aM" = (/obj/effect/step_trigger/teleporter{teleport_x = 4; teleport_y = 18; teleport_z = 2},/turf/open/floor/plasteel/stairs,/area/arrival/start) +"aN" = (/obj/effect/step_trigger/teleporter{teleport_x = 4; teleport_y = 17; teleport_z = 4},/turf/open/floor/plasteel/stairs,/area/arrival/start) +"aO" = (/turf/open/floor/plasteel/black,/area/arrival/start) +"aP" = (/obj/effect/turf_decal/stripes/line{tag = "icon-warningline (WEST)"; icon_state = "warningline"; dir = 8},/turf/open/floor/plasteel/black,/area/arrival/start) +"aQ" = (/obj/effect/turf_decal/stripes/line,/turf/open/floor/plasteel/black,/area/arrival/start) +"aR" = (/obj/effect/turf_decal/stripes/corner{tag = "icon-warninglinecorner (NORTH)"; icon_state = "warninglinecorner"; dir = 1},/obj/effect/turf_decal/stripes/corner{tag = "icon-warninglinecorner (WEST)"; icon_state = "warninglinecorner"; dir = 8},/turf/open/floor/plasteel/black,/area/arrival/start) +"aS" = (/obj/effect/turf_decal/bot,/obj/effect/turf_decal/stripes/line{tag = "icon-warningline (NORTH)"; icon_state = "warningline"; dir = 1},/turf/open/floor/plasteel/black,/area/arrival/start) +"aT" = (/obj/effect/turf_decal/stripes/corner{tag = "icon-warninglinecorner (EAST)"; icon_state = "warninglinecorner"; dir = 4},/turf/open/floor/plasteel/black,/area/arrival/start) +"aU" = (/obj/machinery/autolathe,/turf/open/floor/plasteel/black,/area/arrival/start) +"aV" = (/obj/machinery/atmospherics/components/unary/vent_pump,/turf/open/floor/plasteel/black,/area/arrival/start) +"aW" = (/obj/machinery/atmospherics/components/unary/vent_scrubber,/turf/open/floor/plasteel/black,/area/arrival/start) +"aX" = (/turf/open/floor/plasteel/darkpurple/corner,/area/arrival/start) +"aY" = (/obj/structure/table,/obj/item/stack/cable_coil,/turf/open/floor/plasteel/black,/area/arrival/start) +"aZ" = (/obj/structure/table,/turf/open/floor/plasteel/black,/area/arrival/start) +"ba" = (/obj/machinery/pipedispenser,/turf/open/floor/plasteel/black,/area/arrival/start) +"bb" = (/turf/open/floor/plasteel/darkpurple/side{tag = "icon-darkpurple (EAST)"; icon_state = "darkpurple"; dir = 4},/area/arrival/start) +"bc" = (/obj/structure/table,/obj/item/stack/sheet/glass,/obj/item/stack/sheet/metal,/turf/open/floor/plasteel/black,/area/arrival/start) +"bd" = (/obj/machinery/holopad,/turf/open/floor/plasteel/black,/area/arrival/start) +"be" = (/obj/structure/table,/obj/item/weapon/storage/toolbox/mechanical,/turf/open/floor/plasteel/black,/area/arrival/start) +"bf" = (/obj/machinery/droneDispenser,/turf/open/floor/plasteel/black,/area/arrival/start) +"bg" = (/obj/effect/turf_decal/stripes/line{tag = "icon-warningline (WEST)"; icon_state = "warningline"; dir = 8},/obj/machinery/atmospherics/components/unary/vent_pump,/turf/open/floor/plasteel/black,/area/arrival/start) +"bh" = (/obj/structure/table,/obj/machinery/cell_charger,/turf/open/floor/plasteel/black,/area/arrival/start) +"bi" = (/obj/structure/table,/obj/item/weapon/stock_parts/cell,/obj/item/stack/cable_coil{pixel_y = 2},/obj/item/stack/cable_coil,/turf/open/floor/plasteel/black,/area/arrival/start) +"bj" = (/obj/structure/table,/obj/item/weapon/storage/belt/utility,/obj/item/weapon/crowbar,/obj/item/clothing/glasses/welding,/turf/open/floor/plasteel/black,/area/arrival/start) +"bk" = (/obj/effect/turf_decal/stripes/line{tag = "icon-warningline (NORTH)"; icon_state = "warningline"; dir = 1},/obj/machinery/vending/assist,/turf/open/floor/plasteel/darkpurple,/area/arrival/start) +"bl" = (/turf/open/floor/plasteel/darkpurple/corner{tag = "icon-darkpurplecorners (EAST)"; icon_state = "darkpurplecorners"; dir = 4},/area/arrival/start) +"bm" = (/turf/open/floor/plasteel/darkpurple/side{tag = "icon-darkpurple (NORTH)"; icon_state = "darkpurple"; dir = 1},/area/arrival/start) +"bn" = (/obj/machinery/vending/tool,/turf/open/floor/plasteel/darkpurple,/area/arrival/start) +"bo" = (/turf/open/floor/plasteel/whitepurple/side{tag = "icon-whitepurple (WEST)"; icon_state = "whitepurple"; dir = 8},/area/arrival/start) +"bp" = (/turf/open/floor/plasteel/whitepurple/side{tag = "icon-whitepurple (EAST)"; icon_state = "whitepurple"; dir = 4},/area/arrival/start) +"bq" = (/obj/effect/step_trigger/teleporter{teleport_x = 4; teleport_y = 17; teleport_z = 3},/turf/open/floor/plasteel/stairs,/area/arrival/start) +"br" = (/obj/machinery/modular_computer/console,/turf/open/floor/plasteel/whitepurple,/area/arrival/start) +"bs" = (/obj/machinery/atmospherics/components/unary/vent_pump,/obj/structure/chair/office/light{tag = "icon-officechair_white (WEST)"; icon_state = "officechair_white"; dir = 8},/turf/open/floor/plasteel/white,/area/arrival/start) +"bt" = (/turf/open/floor/plasteel/whitepurple/corner{tag = "icon-whitepurplecorner (EAST)"; icon_state = "whitepurplecorner"; dir = 4},/area/arrival/start) +"bu" = (/turf/open/floor/plasteel/whitepurple,/area/arrival/start) +"bv" = (/obj/machinery/portable_atmospherics/canister/nitrogen,/obj/effect/turf_decal/bot,/turf/open/floor/plasteel/whitepurple,/area/arrival/start) +"bw" = (/obj/structure/table,/obj/machinery/camera{tag = "icon-camera (EAST)"; icon_state = "camera"; dir = 4},/turf/open/floor/plasteel/whitepurple,/area/arrival/start) +"bx" = (/obj/machinery/atmospherics/components/unary/vent_scrubber,/turf/open/floor/plasteel/whitepurple/side,/area/arrival/start) +"by" = (/turf/open/floor/plasteel/whitepurple/side,/area/arrival/start) +"bz" = (/turf/open/floor/plasteel/white,/area/arrival/start) +"bA" = (/obj/structure/grille,/obj/structure/window/fulltile,/turf/open/floor/plating,/area/arrival/start) +"bB" = (/obj/machinery/door/airlock/science,/turf/open/floor/plasteel/white,/area/arrival/start) +"bC" = (/obj/machinery/airalarm,/turf/closed/wall,/area/arrival/start) +"bD" = (/obj/machinery/camera{tag = "icon-camera (EAST)"; icon_state = "camera"; dir = 4},/turf/open/floor/plasteel/whitepurple/side{tag = "icon-whitepurple (WEST)"; icon_state = "whitepurple"; dir = 8},/area/arrival/start) +"bE" = (/turf/open/floor/plasteel/whitepurple/side{tag = "icon-whitepurple (NORTHWEST)"; icon_state = "whitepurple"; dir = 9},/area/arrival/start) +"bF" = (/obj/structure/closet/wardrobe/science_white,/turf/open/floor/plasteel/whitepurple,/area/arrival/start) +"bG" = (/obj/structure/extinguisher_cabinet,/turf/closed/wall,/area/arrival/start) +"bH" = (/obj/machinery/light{tag = "icon-tube1 (WEST)"; icon_state = "tube1"; dir = 8},/turf/open/floor/plasteel/whitepurple/side{tag = "icon-whitepurple (WEST)"; icon_state = "whitepurple"; dir = 8},/area/arrival/start) +"bI" = (/obj/effect/turf_decal/stripes/line{tag = "icon-warningline (EAST)"; icon_state = "warningline"; dir = 4},/turf/open/floor/plasteel/whitepurple/side{tag = "icon-whitepurple (NORTHEAST)"; icon_state = "whitepurple"; dir = 5},/area/arrival/start) +"bJ" = (/obj/structure/lattice,/turf/open/open_z,/area/arrival/start) +"bK" = (/obj/machinery/light{tag = "icon-tube1 (EAST)"; icon_state = "tube1"; dir = 4},/turf/open/floor/plasteel/whitepurple/side{tag = "icon-whitepurple (EAST)"; icon_state = "whitepurple"; dir = 4},/area/arrival/start) +"bL" = (/obj/effect/turf_decal/stripes/line{tag = "icon-warningline (EAST)"; icon_state = "warningline"; dir = 4},/turf/open/floor/plasteel/whitepurple/side{tag = "icon-whitepurple (EAST)"; icon_state = "whitepurple"; dir = 4},/area/arrival/start) +"bM" = (/obj/machinery/atmospherics/components/unary/vent_pump,/turf/open/floor/plasteel/white,/area/arrival/start) +"bN" = (/obj/structure/window{tag = "icon-window (NORTH)"; icon_state = "window"; dir = 1},/obj/machinery/portable_atmospherics/scrubber,/turf/open/floor/plasteel/whitepurple/side{tag = "icon-whitepurple (EAST)"; icon_state = "whitepurple"; dir = 4},/area/arrival/start) +"bO" = (/obj/machinery/light{tag = "icon-tube1 (EAST)"; icon_state = "tube1"; dir = 4},/turf/open/open_z,/area/arrival/start) +"bP" = (/obj/effect/turf_decal/stripes/corner{tag = "icon-warninglinecorner (NORTH)"; icon_state = "warninglinecorner"; dir = 1},/turf/open/floor/plasteel/whitepurple/side{tag = "icon-whitepurple (WEST)"; icon_state = "whitepurple"; dir = 8},/area/arrival/start) +"bQ" = (/obj/structure/window,/obj/machinery/portable_atmospherics/canister/bz,/turf/open/floor/plasteel/whitepurple/side{tag = "icon-whitepurple (EAST)"; icon_state = "whitepurple"; dir = 4},/area/arrival/start) +"bR" = (/obj/effect/turf_decal/stripes/line{tag = "icon-warningline (EAST)"; icon_state = "warningline"; dir = 4},/turf/open/floor/plasteel/whitepurple/corner{tag = "icon-whitepurplecorner (EAST)"; icon_state = "whitepurplecorner"; dir = 4},/area/arrival/start) +"bS" = (/obj/structure/lattice/catwalk,/turf/open/open_z,/area/arrival/start) +"bT" = (/obj/effect/turf_decal/stripes/line{tag = "icon-warningline (WEST)"; icon_state = "warningline"; dir = 8},/turf/open/floor/plasteel/whitepurple/corner{tag = "icon-whitepurplecorner (NORTH)"; icon_state = "whitepurplecorner"; dir = 1},/area/arrival/start) +"bU" = (/obj/effect/turf_decal/stripes/line{tag = "icon-warningline (EAST)"; icon_state = "warningline"; dir = 4},/turf/open/floor/plasteel/whitepurple/corner,/area/arrival/start) +"bV" = (/obj/effect/turf_decal/stripes/line{tag = "icon-warningline (WEST)"; icon_state = "warningline"; dir = 8},/turf/open/floor/plasteel/whitepurple/corner{tag = "icon-whitepurplecorner (WEST)"; icon_state = "whitepurplecorner"; dir = 8},/area/arrival/start) +"bW" = (/obj/machinery/camera{tag = "icon-camera (WEST)"; icon_state = "camera"; dir = 8},/turf/open/floor/plasteel/whitepurple/side{tag = "icon-whitepurple (EAST)"; icon_state = "whitepurple"; dir = 4},/area/arrival/start) +"bX" = (/obj/machinery/atmospherics/components/unary/vent_scrubber,/turf/open/floor/plasteel/white,/area/arrival/start) +"bY" = (/obj/effect/turf_decal/stripes/corner{tag = "icon-warninglinecorner (EAST)"; icon_state = "warninglinecorner"; dir = 4},/turf/open/floor/plasteel/whitepurple/side{tag = "icon-whitepurple (WEST)"; icon_state = "whitepurple"; dir = 8},/area/arrival/start) +"bZ" = (/obj/structure/table,/obj/item/weapon/hand_labeler,/obj/item/stack/cable_coil,/obj/item/stack/cable_coil{pixel_y = 2},/turf/open/floor/plasteel/whitepurple,/area/arrival/start) +"ca" = (/obj/structure/table,/obj/machinery/cell_charger,/obj/machinery/light{tag = "icon-tube1 (EAST)"; icon_state = "tube1"; dir = 4},/turf/open/floor/plasteel/whitepurple,/area/arrival/start) +"cb" = (/turf/open/floor/plasteel/whitepurple/corner,/area/arrival/start) +"cc" = (/obj/effect/turf_decal/stripes/line{tag = "icon-warningline (EAST)"; icon_state = "warningline"; dir = 4},/turf/open/floor/plasteel/whitepurple/side{tag = "icon-whitepurple (SOUTHEAST)"; icon_state = "whitepurple"; dir = 6},/area/arrival/start) +"cd" = (/turf/open/floor/plasteel/whitepurple/side{tag = "icon-whitepurple (SOUTHWEST)"; icon_state = "whitepurple"; dir = 10},/area/arrival/start) +"ce" = (/obj/structure/table,/obj/item/weapon/storage/toolbox/mechanical,/turf/open/floor/plasteel/whitepurple,/area/arrival/start) +"cf" = (/obj/structure/table,/obj/item/weapon/storage/belt/utility,/turf/open/floor/plasteel/whitepurple,/area/arrival/start) +"cg" = (/obj/structure/table,/obj/item/device/radio,/turf/open/floor/plasteel/whitepurple,/area/arrival/start) +"ch" = (/obj/machinery/modular_computer/console,/turf/open/floor/carpet,/area/arrival/start) +"ci" = (/turf/open/floor/plasteel/barber,/area/arrival/start) +"cj" = (/obj/item/weapon/twohanded/required/kirbyplants,/turf/open/floor/plasteel/barber,/area/arrival/start) +"ck" = (/turf/open/floor/carpet,/area/arrival/start) +"cl" = (/obj/structure/table,/turf/open/floor/carpet,/area/arrival/start) +"cm" = (/obj/structure/chair/office/light{tag = "icon-officechair_white (WEST)"; icon_state = "officechair_white"; dir = 8},/turf/open/floor/plasteel/barber,/area/arrival/start) + +(1,1,1) = {" +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaababababababababababababababababababaa +aaabacacacacadacacacacacacadacacacacabaa +aaabacacacacacacacacacacacacacacacacabaa +aaabacacacacacacacacacacacacacacacacabaa +aaabaeacacacafagahagaiagahajacacacakabaa +aaabacacacacalacacacacacacamacacacacabaa +aaabacacacacanacacaoaoacacapacacacacabaa +aaabacacacacalacaqababaracasacacacacabaa +aaabacacacacatacaqababaracapacacacacabaa +aaabacacacacalacacauauacacamacacacacabaa +aaabacacacacanacacacacacacapacacacacabaa +aaabaeacacacavawaxayaxawaxazacacacakabaa +aaabacacacacacacacacacacacacacacacacabaa +aaabababacacacacacacacacacacacacacacabaa +aaabaAabacacacacacaBacacacacaCacacacabaa +aaabaDabacacacacacacacacacacaEaFacacabaa +aaabaDacacacaGacacacacacacaGacaHacacabaa +aaababababababababababababababababababaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaI +"} + +(1,1,2) = {" +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaababababababababababababababababababaa +aaabaJacacacacacacacacacacacacacacacabaa +aaabacaKaKaKaKaKaKaKaKaKaKaKaKaKaKacabaa +aaabacaKaKaKaKaKaKaKaKaKaKaKaKaKaKacabaa +aaabacaKaKaKaKaKaKaKaKaKaKaKaKaKaKacabaa +aaabacaKaKaKaKaKaKaKaKaKaKaKaKaKaKacabaa +aaabacaKaKaKaKaKaKaKaKaKaKaKaKaKaKacabaa +aaabacaKaKaKaKaKaKaKaKaKaKaKaKaKaKacabaa +aaabacaKaKaKaKaKaKaKaKaKaKaKaKaKaKacabaa +aaabacaKaKaKaKaKaKaKaKaKaKaKaKaKaKacabaa +aaabacaKaKaKaKaKaKaKaKaKaKaKaKaKaKacabaa +aaabacaKaKaKaKaKaKaKaKaKaKaKaKaKaKacabaa +aaabacacacaKaKaKaKaKaKaKaKaKaKaKaKacabab +aaabacabacaKaKaKaKaKaKaKaKaKaKaKaKacacab +aaabaDabacaKaKaKaKaKaKaKaKaKaKaKaKaCacab +aaabaLabacaKaKaKaKaKaKaKaKaKaKaKaKaEaFab +aaabaDabacacacacacacacacacacacacacacaHab +aaababababababababababababababababababab +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaI +"} + +(1,1,3) = {" +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaabaMacabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaabaNacabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaababacababababaaaaaaaaaaaaaaaaaaaaaaaa +aaaaabacacacacabababababaaaaaaaaaaaaaaaa +aaaaababababacabaOaOaPabaaaaaaaaaaaaaaaa +aaaaaaaaabaQaRaSaSaSaTabaaaaaaaaaaaaaaaa +aaaaaaaaabaUaPaOaOaOaOabaaaaaaaaaaaaaaaa +aaaaaaaaabaOaPaOaVaOaWabaaaaaaaaaaaaaaaa +aaaaaaaaabaOaPaXaYaOaZabaaaaaaaaaaaaaaaa +aaaaaaaaabbaaPbbbcbdbeababababaaaaaaaaaa +aaaaaaaaabbfbgbbbhbibjabaCacabaaaaaaaaaa +aaaaaaaaabbkaTblbmbmbmabaEaFabaaaaaaaaaa +aaaaaaaaabbnaOaOaOaOaOabacaHabaaaaaaaaaa +aaaaaaaaabababababababababababaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaI +"} + +(1,1,4) = {" +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaabbobpabaaaaabababababababaaaaaaaaaaaa +aaabbqbpabaaaaabbrbsbtbubvabaaaaaaaaaaaa +aaabbobpabaaaaabbwbxbybybzabaaaaaaaaaaaa +aaabbobpabaaaaabbAbAbAabbBbCbAbAabaaaaaa +aaabbDbpbCabababaKaKaKbAbEbFbFbFabaaaaaa +aabGbHbtbIaKaKbJaKaKaKbAbobzbzbKabaaaaaa +aaabbobzbLaKaKbJaKaKaKbAbobzbMbNabaaaaaa +aaabbobMbLaKaKbJaKaKbOabbPbzbzbQabaaaaaa +aabBbobzbRbSbSbSbSbSbSbBbTbzbzbpabaaaaaa +aabBbobzbUbSbSbSbSbSbSbBbVbzbzbWabaaaaaa +aaabbobXbLaKaKbJaKaKbOabbYbzbXbZabaaaaaa +aabGbobzbLaKaKbJaKaKaKbAbobzbzcaabaaaaaa +aaabbHcbccaKaKbJaKaKaKbAcdcecfcgabaaaaaa +aaabababababababbAbAbAabbBababababaaaaaa +aaaaaaaaabaCacabchchchcicicjabaaaaaaaaaa +aaaaaaaaabaEaFabckckclcmciciabaaaaaaaaaa +aaaaaaaaabacaHababababababababaaaaaaaaaa +aaaaaaaaababababaaaaaaaaaaaaaaaaaaaaaaaI +"} diff --git a/_maps/multiz_test.dm b/_maps/multiz_test.dm new file mode 100644 index 00000000000000..01a0a9db1ad0cd --- /dev/null +++ b/_maps/multiz_test.dm @@ -0,0 +1,21 @@ +#if !defined(MAP_FILE) + + // MultiZ Station + + #define TITLESCREEN "title" + + #define MINETYPE "lavaland" + + #include "map_files\debug\multiz_test.dmm" + + #define MAP_PATH "map_files/debug" + #define MAP_FILE "multiz_test.dmm" + #define MAP_NAME "MultiZ Station" + + #define MAP_TRANSITION_CONFIG list(MAIN_STATION = UNAFFECTED) + +#elif !defined(MAP_OVERRIDE) + + #warn a map has already been included, ignoring MultiZ Station. + +#endif diff --git a/code/__DEFINES/atmospherics.dm b/code/__DEFINES/atmospherics.dm index cb607c8501e5e1..6e07674d1ce71c 100644 --- a/code/__DEFINES/atmospherics.dm +++ b/code/__DEFINES/atmospherics.dm @@ -169,4 +169,7 @@ #define ATMOS_PASS_NO 0 #define ATMOS_PASS_PROC -1 //ask CanAtmosPass() #define ATMOS_PASS_DENSITY -2 //just check density -#define CANATMOSPASS(A, O) ( A.CanAtmosPass == ATMOS_PASS_PROC ? A.CanAtmosPass(O) : ( A.CanAtmosPass == ATMOS_PASS_DENSITY ? !A.density : A.CanAtmosPass ) ) \ No newline at end of file +#define CANATMOSPASS(A, O) ( A.CanAtmosPass == ATMOS_PASS_PROC ? A.CanAtmosPass(O) : ( A.CanAtmosPass == ATMOS_PASS_DENSITY ? !A.density : A.CanAtmosPass ) ) + +//MultiZ / Atmos Spreading +#define ATMOS_DIRS cardinal+list(UP,DOWN) \ No newline at end of file diff --git a/code/__HELPERS/icon_smoothing.dm b/code/__HELPERS/icon_smoothing.dm index 108c2f1c54bc0c..c6bd07fc1f30b2 100644 --- a/code/__HELPERS/icon_smoothing.dm +++ b/code/__HELPERS/icon_smoothing.dm @@ -259,7 +259,7 @@ A.cut_overlay(A.bottom_left_corner) A.bottom_left_corner = se LAZYADD(New, se) - + if(New) A.add_overlay(New) @@ -394,3 +394,10 @@ icon_state = "smooth" smooth = SMOOTH_TRUE|SMOOTH_DIAGONAL|SMOOTH_BORDER canSmoothWith = null + + + +//Called by SSicon_smooth after this atom has smoothed +/atom/proc/post_smooth() + if(zshadow) + zshadow.SyncAppearance() \ No newline at end of file diff --git a/code/controllers/subsystem/air.dm b/code/controllers/subsystem/air.dm index 5bc767d61f5f23..33220cc6441c61 100644 --- a/code/controllers/subsystem/air.dm +++ b/code/controllers/subsystem/air.dm @@ -278,6 +278,13 @@ var/datum/subsystem/air/SSair add_to_active(T) queued_for_activation.Cut() + //Recalculated, for Multi-Z (In an ideal world I'd move setup_allturfs() here + //but it's sadly not that simple) + for(var/t in block(locate(1, 1, 1), locate(world.maxx, world.maxy, world.maxz))) + var/turf/T = t + T.CalculateAdjacentTurfs() + CHECK_TICK + /datum/subsystem/air/proc/setup_allturfs() var/list/turfs_to_init = block(locate(1, 1, 1), locate(world.maxx, world.maxy, world.maxz)) var/list/active_turfs = src.active_turfs diff --git a/code/controllers/subsystem/icon_smooth.dm b/code/controllers/subsystem/icon_smooth.dm index bedead1ea3c1a1..6e0b61d92a9a74 100644 --- a/code/controllers/subsystem/icon_smooth.dm +++ b/code/controllers/subsystem/icon_smooth.dm @@ -32,6 +32,7 @@ var/datum/subsystem/icon_smooth/SSicon_smooth if(!A || A.z <= 2) continue smooth_icon(A) + A.post_smooth() CHECK_TICK ..() \ No newline at end of file diff --git a/code/controllers/subsystem/multiz.dm b/code/controllers/subsystem/multiz.dm new file mode 100644 index 00000000000000..1898d0c353baaf --- /dev/null +++ b/code/controllers/subsystem/multiz.dm @@ -0,0 +1,20 @@ +var/datum/subsystem/z_levels/SSz + +/datum/subsystem/z_levels + name = "Z Levels" + flags = SS_NO_FIRE + init_order = 12 //before SSatoms + var/list/vertical_connections //assoc list of "[Z number]" = list("[Other Z Number]" = TRUE/FALSE) + var/list/zshadows + +/datum/subsystem/z_levels/New() + NEW_SS_GLOBAL(SSz) + + +/datum/subsystem/z_levels/stat_entry() + var/c = 0 + for(var/z in vertical_connections) + var/list/L = vertical_connections[z] + if(L) + c += L.len //this will count A<->B twice, since it's A->B and B->A + ..("ZP:[c], ZS:[LAZYLEN(zshadows)]") //"Z Pairs", "Z Shadows" \ No newline at end of file diff --git a/code/modules/atmospherics/environmental/LINDA_system.dm b/code/modules/atmospherics/environmental/LINDA_system.dm index ae4841c5e6ff8b..d8790fb107ad78 100644 --- a/code/modules/atmospherics/environmental/LINDA_system.dm +++ b/code/modules/atmospherics/environmental/LINDA_system.dm @@ -14,18 +14,18 @@ /turf/open/CanAtmosPass(turf/T) var/R if(blocks_air || T.blocks_air) - R = 1 + R = TRUE for(var/obj/O in contents+T.contents) var/turf/other = (O.loc == src ? T : src) if(!CANATMOSPASS(O, other)) - R = 1 + R = TRUE if(O.BlockSuperconductivity()) //the direction and open/closed are already checked on CanAtmosPass() so there are no arguments var/D = get_dir(src, T) atmos_supeconductivity |= D D = get_dir(T, src) T.atmos_supeconductivity |= D - return 0 //no need to keep going, we got all we asked + return FALSE //no need to keep going, we got all we asked atmos_supeconductivity &= ~get_dir(src, T) T.atmos_supeconductivity &= ~get_dir(T, src) @@ -39,10 +39,19 @@ /turf/proc/CalculateAdjacentTurfs() var/list/atmos_adjacent_turfs = src.atmos_adjacent_turfs - for(var/direction in cardinal) + for(var/direction in ATMOS_DIRS) var/turf/T = get_step(src, direction) if(!T) continue + + if(direction == UP) + if(!T.z_open) + continue + + else if(direction == DOWN) + if(!z_open) + continue + if(CANATMOSPASS(T, src)) LAZYINITLIST(atmos_adjacent_turfs) LAZYINITLIST(T.atmos_adjacent_turfs) @@ -76,7 +85,7 @@ var/matchingDirections = 0 var/turf/S = get_step(curloc, direction) - for (var/checkDirection in cardinal) + for (var/checkDirection in ATMOS_DIRS) var/turf/checkTurf = get_step(S, checkDirection) if(!S.atmos_adjacent_turfs || !S.atmos_adjacent_turfs[checkTurf]) continue diff --git a/code/modules/atmospherics/gasmixtures/gas_types.dm b/code/modules/atmospherics/gasmixtures/gas_types.dm index 74f025e93e3bba..c7432c8c0e2745 100644 --- a/code/modules/atmospherics/gasmixtures/gas_types.dm +++ b/code/modules/atmospherics/gasmixtures/gas_types.dm @@ -91,7 +91,7 @@ var/list/hardcoded_gases = list("o2","n2","co2","plasma") //the main four gases, icon = 'icons/effects/tile_effects.dmi' mouse_opacity = 0 layer = FLY_LAYER - appearance_flags = TILE_BOUND + appearance_flags = TILE_BOUND|RESET_COLOR|RESET_ALPHA /obj/effect/overlay/gas/New(state) . = ..() diff --git a/code/modules/atmospherics/machinery/atmosmachinery.dm b/code/modules/atmospherics/machinery/atmosmachinery.dm index c1c4af14fae929..0df6eb0997cae8 100644 --- a/code/modules/atmospherics/machinery/atmosmachinery.dm +++ b/code/modules/atmospherics/machinery/atmosmachinery.dm @@ -67,7 +67,7 @@ Pipelines + Other Objects -> Pipe network node_connects.len = device_type for(DEVICE_TYPE_LOOP) - for(var/D in cardinal) + for(var/D in ATMOS_DIRS) if(D & GetInitDirections()) if(D in node_connects) continue diff --git a/code/modules/atmospherics/machinery/other/zvent.dm b/code/modules/atmospherics/machinery/other/zvent.dm index 0df9d17410e3fe..d9f1378cab52f1 100644 --- a/code/modules/atmospherics/machinery/other/zvent.dm +++ b/code/modules/atmospherics/machinery/other/zvent.dm @@ -1,3 +1,15 @@ + +/* + Remie note: + I added proper multiZ, but this thing is ancient + I "updated" it, and it DOES work, but it's + not in RPDs, pipe dispensers etc and some of its + content (on/off, volume_rate) aren't implemented. + + Use this for ruins and stuff I guess, or fix it up proper. +*/ + + /obj/machinery/zvent name = "interfloor air transfer system" @@ -21,9 +33,13 @@ //all this object does, is make its turf share air with the ones above and below it, if they have a vent too. if(isturf(loc)) //if we're not on a valid turf, forget it - for (var/new_z in list(-1,1)) //change this list if a fancier system of z-levels gets implemented - var/turf/open/zturf_conn = locate(x,y,z+new_z) + var/turf/T = loc + for (var/ddir in list(DOWN,UP)) //change this list if a fancier system of z-levels gets implemented //meow + var/turf/open/zturf_conn = get_step(loc, ddir) if (istype(zturf_conn)) + if(!AreZsConnected(zturf_conn.z, T.z)) + continue + var/obj/machinery/zvent/zvent_conn= locate(/obj/machinery/zvent) in zturf_conn if (istype(zvent_conn)) //both floors have simulated turfs, share() diff --git a/code/modules/atmospherics/machinery/pipes/multiz.dm b/code/modules/atmospherics/machinery/pipes/multiz.dm new file mode 100644 index 00000000000000..706dacfb7f9008 --- /dev/null +++ b/code/modules/atmospherics/machinery/pipes/multiz.dm @@ -0,0 +1,26 @@ + +//where for art thou duncathan + +/obj/machinery/atmospherics/pipe/simple/multiz + icon = 'icons/obj/atmospherics/pipes/multiz.dmi' + var/basestate + +/obj/machinery/atmospherics/pipe/simple/multiz/update_icon() + icon_state = "[basestate][invisibility ? "-f" : "" ]" + + +/obj/machinery/atmospherics/pipe/simple/multiz/up + initialize_directions = SOUTH|UP + basestate = "up" + +/obj/machinery/atmospherics/pipe/simple/multiz/up/SetInitDirections() + initialize_directions = dir|UP + + +/obj/machinery/atmospherics/pipe/simple/multiz/down + initialize_directions = SOUTH|DOWN + basestate = "down" + +/obj/machinery/atmospherics/pipe/simple/multiz/down/SetInitDirections() + initialize_directions = dir|DOWN + diff --git a/code/modules/multiz/atoms.dm b/code/modules/multiz/atoms.dm new file mode 100644 index 00000000000000..f859ed23f6058a --- /dev/null +++ b/code/modules/multiz/atoms.dm @@ -0,0 +1,119 @@ + +/atom + var/atom/movable/zshadow/zshadow + + +//TODO: Simplify for base atoms? (their shadows would never move, so they don't need a zshadow movable atom) +/atom/proc/CreateZShadow() + if(!zshadow) //if one exists, just sync it + zshadow = new() + zshadow.owner = src + zshadow.Sync() + return zshadow + + +//Can we fall through to the Z below? (regardless of open turfs, etc.) +//This is so mobs with jetpacks, thrown items, etc. can ignore falling +/atom/proc/CanFallThroughZ() + if(!has_gravity()) + return FALSE + return TRUE + + +/atom/movable/CanFallThroughZ() + . = ..() + if(.) + if(throwing) + return FALSE + + +/mob/CanFallThroughZ() + . = ..() + if(.) + var/obj/item/weapon/tank/jetpack/J = get_jetpack() + if(istype(J) && J.allow_thrust(0.01, src)) //working jetpack + return FALSE + + + +//Hooks: +//TODO: move to existing locations + +/atom/proc/SetupZShadow(mapload = FALSE) + if(mapload) //This is before SSz, so we can't rely on connections yet + var/turf/U = get_step(src, UP) + if(U && U.z_open) + CreateZShadow() + else if(GetAboveConnectedTurf(src)) + CreateZShadow() + +/atom/Initialize(mapload) + ..() + SetupZShadow(mapload) + +/turf/Initialize(mapload) + ..() + if(z_open) + var/turf/D = get_step(src, DOWN) + if(D) + ConnectVerticalZs(z, D.z) + D.SetupZShadow() + for(var/a in D) + var/atom/A = a + A.SetupZShadow(mapload) + + SetupZShadow(mapload) + +/atom/setDir(dir) + ..() + if(zshadow) + zshadow.setDir(dir) //dir is not an appearance var, so we can update it quickly + +/atom/Destroy() + . = ..() + if(zshadow) + qdel(zshadow) + +/atom/movable/Moved() + ..() + if(zshadow) + zshadow.SyncLoc() + else + if(GetAboveConnectedTurf(src)) + CreateZShadow() + + +//Get this to cascade somehow... +/obj/update_icon() + ..() + if(zshadow) + zshadow.SyncAppearance() + +//Cascade somehow. +/mob/update_icons() + ..() + if(zshadow) + zshadow.SyncAppearance() + +/turf/AfterChange() + ..() + if(zshadow) + zshadow.SyncAppearance() + + +/turf/add_decal(decal,group) + ..() + if(zshadow) + zshadow.SyncAppearance() + + +/turf/remove_decal(group) + ..() + if(zshadow) + zshadow.SyncAppearance() + + +/turf/open/update_visuals() + ..() + if(zshadow) + zshadow.SyncAppearance() \ No newline at end of file diff --git a/code/modules/multiz/turfs.dm b/code/modules/multiz/turfs.dm new file mode 100644 index 00000000000000..4b508f465eb60b --- /dev/null +++ b/code/modules/multiz/turfs.dm @@ -0,0 +1,31 @@ + +/turf + var/z_open = FALSE //are we see the Z below us through this turf? (true/false) + + +/turf/open/open_z + icon = null + icon_state = "" + desc = "" + name = "zopen" + invisibility = 101 //Not real!! + z_open = TRUE + + +/turf/open/open_z/Entered(atom/movable/AM, atom/oloc) + ..() + var/turf/T = GetBelowConnectedTurf(src) + if(AtomCanFallThrough(AM) && T) + AM.forceMove(T) + + +/turf/open/open_z/proc/AtomCanFallThrough(atom/movable/AM) + . = FALSE + if(AM.CanFallThroughZ()) + . = TRUE + if(locate(/obj/structure/lattice/catwalk) in src) + . = FALSE + + +/turf/open/open_z/CreateZShadow() //just no + return diff --git a/code/modules/multiz/z_helpers.dm b/code/modules/multiz/z_helpers.dm new file mode 100644 index 00000000000000..a960cb9e9743c3 --- /dev/null +++ b/code/modules/multiz/z_helpers.dm @@ -0,0 +1,60 @@ + +//Connects A and B (intended to be numbers, eg: 2, 3) inside SSz.vercial_connections +//(Mentions vertical to avoid confusing with the existing z-transition system, which is """horizontal""") +/proc/ConnectVerticalZs(A, B) + LAZYINITLIST(SSz.vertical_connections) + var/list/L = SSz.vertical_connections["[A]"] + if(!L) + L = list() + L["[B]"] = TRUE + SSz.vertical_connections["[A]"] = L + L = SSz.vertical_connections["[B]"] + if(!L) + L = list() + L["[A]"] = TRUE + SSz.vertical_connections["[B]"] = L + + +//Check A and B are connected, without the need for a turf or z_open hole +//Used for sounds, explosions, etc. +/proc/AreZsConnected(A, B) + if(!LAZYLEN(SSz.vertical_connections)) + return FALSE + var/list/L = SSz.vertical_connections["[A]"] //only check one of the pairs, as it's a twoway thing A<->B so finding A->B is enough + if(L) + return L["[B]"] + + +//Are we z-connected above, and is there a turf there? +//THE TURF DOES NOT NEED TO BE Z-OPEN +/proc/GetAboveConnectedTurf(atom/A) + var/turf/Aturf = get_turf(A) //so we always have A's x,y,z coords + var/turf/T = get_step(A, UP) + if(Aturf && T && AreZsConnected(Aturf.z, T.z)) + return T + + +//Are we z-connected below, and is there a turf there? +//THE TURF DOES NOT NEED TO BE Z-OPEN +/proc/GetBelowConnectedTurf(atom/A) + var/turf/Aturf = get_turf(A) + var/turf/T = get_step(A, DOWN) + if(AreZsConnected(Aturf.z, T.z)) + return T + + +//Same as GetAboveConnectedTurf(), but checks the turf is z_open (used for zshadows, looking up, etc.) +/proc/GetZOpenAbove(atom/A) + var/turf/T = GetAboveConnectedTurf(A) + if(!T || !T.z_open) + return + return T + + +//Same as GetBelowConnectedTurf(), but checks the turf is z_open + //I don't see much use for this one, included as a pair to the above +/proc/GetZOpenBelow(atom/A) + var/turf/T = GetBelowConnectedTurf(A) + if(!T || !T.z_open) + return + return T diff --git a/code/modules/multiz/zshadows.dm b/code/modules/multiz/zshadows.dm new file mode 100644 index 00000000000000..5988698b0ec25f --- /dev/null +++ b/code/modules/multiz/zshadows.dm @@ -0,0 +1,63 @@ + + +//An appearance, in movable atom form, designed to show through Zs +//System only visibly displays 2 z of depth, for visual clarity+performance +/atom/movable/zshadow + var/atom/owner + +/atom/movable/zshadow/Initialize() + ..() + LAZYADD(SSz.zshadows, src) + +/atom/movable/zshadow/Move() //loc = only bby. + return + +/atom/movable/zshadow/CanFallThroughZ() //amusing, but no + return + +/atom/movable/zshadow/Destroy() + if(!QDELETED(owner)) //Nothing destroys these if their owner exists, they *ARE* their owner as far as we're concerned + return QDEL_HINT_LETMELIVE + LAZYREMOVE(SSz.zshadows, src) + return ..() + +/atom/movable/zshadow/examine(mob/user) + if(owner) + owner.examine(user) + +/atom/movable/zshadow/CreateZShadow() //cascade upwards + if(istype(owner, /atom/movable/zshadow)) //but only owner->shadow->shadow, no more (more than 2 levels of depth wouldn't be visible) + return + ..() + +/atom/movable/zshadow/proc/SyncAppearance() + var/visibilityLevel = 2 + if(!istype(owner, /atom/movable/zshadow)) + visibilityLevel = 1 + + var/mutable_appearance/MA = new(owner) + MA.color = (visibilityLevel == 1) ? "#555555" : "#111111"//visible : visible barely + MA.density = FALSE + MA.opacity = FALSE + MA.layer *= 0.01 //a shrunken version of our layer (so we correctly layer as our owner would, but locked below our turf) + MA.verbs = list() //so you don't try to "pick-up" the shadow + appearance = MA + + if(zshadow) + zshadow.SyncAppearance() //cascade upwards + +//forceMove is deliberately ignored here, don't you dare change it +/atom/movable/zshadow/proc/SyncLoc() + if(isturf(owner) || owner && isturf(owner.loc)) + loc = GetAboveConnectedTurf(owner) + var/turf/Tloc = loc + if(!isturf(loc) || !Tloc.z_open) //if we're not supposed to show through + loc = null + Moved() + if(loc && zshadow) + zshadow.SyncLoc() //cascade upwards + +//lazy +/atom/movable/zshadow/proc/Sync() + SyncAppearance() + SyncLoc() \ No newline at end of file diff --git a/icons/obj/atmospherics/pipes/multiz.dmi b/icons/obj/atmospherics/pipes/multiz.dmi new file mode 100644 index 0000000000000000000000000000000000000000..a3bbbee0b282a47d18520c3dd92d38d190da1705 GIT binary patch literal 1884 zcmXAqc{H0@AII;LAYNl{EL8+mp^MSVXxfSdu^qJ)RjO%7Rn!_gAu?(yJruQ_(1{rx z)5BZ3Q>rD5r6|K#dLpRct)i$BMD%?+^T)lv<=lJj_uTvaoSWnB>YyN}B?kadaB?JH zfFt|+kd=Yw4y%AZIHV1q9Vhzg8MVGSchvdB(RclW zo{zlE{xYALJwABeq}LrTEM{l>9S6=28vh)X>#XX0K`l(J_`;XIjp8P}=c(JdaCyE7 zKa#5&<9Qp-nHB{uJ ztu-#smn!DFnr234cKU07cA09aTM<)ClZK}W(}S^7-l_CAWtK@_CL6mxe9*to(8dZT zCp)Vh?yPMt`MgT|rhCt|`vKEmbzqdhHVEU}*NyTdVi99?ig4W2bc|s5xKoB27pE4& z;o%0Fvk!B6Kt=%lRpL5g`gLl@r%y-YJmolnqr^0R@j{3n5b_!(=iYi>}R`8NsbD zzc-(!1%MmTv9ZNmakVjTVd44-Ar+u~{rx+6JjD5tjBx&=@Ix!{d;rGdJozsII7aH~ z>ctUJAA+iE-Y=;2Juy2iT5V)SL@1U9<)!2um1hTrByYCXEm7*^kX7XY{)CrrK0mKD z19C^4(kTtu_(A!nwkEY|K7?Ew5_5!fL$r z;_p1DXY7T!SS&74+S^*;=W&T?TeW+{SkI4W_`N=ft;WX2ObJ)LWw$#T>_40#6&aRu zx!qG!x?t|~sakocq#+7qVa**J9L(gAZd|L(aDGV!dv*T?T8@Oa!xIPttHHqu&$mRP zzC#C1^rJ81#n9Ws(fYR}U|!`A*g_WDUIP#Vn^RnXv1$I(T8^< z^u$mNHd=?OErxO{a)3L-+#FREs0jv60?vU{H9ZwEgzI8~yvG=J^fF3s3;8ii0ybkk4y;@nSeHPXQ)Cs=K>8 zabrP&c)-1&C$kFY65y-8D`5$2Rot!tpqEe6%=$HDC1vc^5A3C86QHfDn}7U|3nzao zO}{ekg0V`G1>1W&=9YsUePus}>W+R(IN*c$vo*7{v=o5XtK*hMy@|h+)i*TIf`d^@ zOG`V2@|sf2?Vn1xiRx1B#^X4(;Av(^!p1Lcs(#o?xaW0)a0I}OWs7&VNYbLNU@#oIj zYIm1WZVNSogM;7Rq0b@!K%r3fSMJt?l-K0gS3`YI?59?;0@|J&$7w0dx1`(2fPxKM zO!t*`j|Vtl|Z!w)Sd*nv1fIJwOIvM->~KfTUipnMa9s< zLpFvjAv)GD&xr>gocWh*qt|kpQ$5OA`eA(amqu>L13HlZxJ&BvV1h957oXlL$9p+$ zkRampbRLrZrpB%*2T>5-n=JY)aFlhd=iP1lZx5A5yXgS68!3`n1Qu4TJy~kh*(Rna zV)3RyoSY5>-&nK2)PH zc;gmlsk!|UkrcK0#>>C1u)gcgzOZy(q`~vtuShAFAf08@5R4 Date: Sat, 13 May 2017 15:00:08 +0100 Subject: [PATCH 05/10] Modernisation + revert/merge fixes --- code/__DEFINES/atmospherics.dm | 2 +- code/controllers/subsystem/multiz.dm | 9 +--- .../effects/decals/Cleanable/humans.dm | 52 ++++++++++++------- .../objects/effects/decals/Cleanable/misc.dm | 38 ++++++++++++-- .../effects/decals/Cleanable/robots.dm | 2 +- .../environmental/LINDA_system.dm | 5 +- .../atmospherics/machinery/atmosmachinery.dm | 2 +- code/modules/multiz/z_helpers.dm | 22 ++++---- code/modules/multiz/zshadows.dm | 10 ++-- 9 files changed, 88 insertions(+), 54 deletions(-) diff --git a/code/__DEFINES/atmospherics.dm b/code/__DEFINES/atmospherics.dm index 2e0d0953dbd76f..7f054de56a8acc 100644 --- a/code/__DEFINES/atmospherics.dm +++ b/code/__DEFINES/atmospherics.dm @@ -170,4 +170,4 @@ #define ATMOS_PASS_NO 0 #define ATMOS_PASS_PROC -1 //ask CanAtmosPass() #define ATMOS_PASS_DENSITY -2 //just check density -#define CANATMOSPASS(A, O) ( A.CanAtmosPass == ATMOS_PASS_PROC ? A.CanAtmosPass(O) : ( A.CanAtmosPass == ATMOS_PASS_DENSITY ? !A.density : A.CanAtmosPass ) )#define CANATMOSPASS(A, O) ( A.CanAtmosPass == ATMOS_PASS_PROC ? A.CanAtmosPass(O) : ( A.CanAtmosPass == ATMOS_PASS_DENSITY ? !A.density : A.CanAtmosPass ) ) +#define CANATMOSPASS(A, O) ( A.CanAtmosPass == ATMOS_PASS_PROC ? A.CanAtmosPass(O) : ( A.CanAtmosPass == ATMOS_PASS_DENSITY ? !A.density : A.CanAtmosPass ) ) diff --git a/code/controllers/subsystem/multiz.dm b/code/controllers/subsystem/multiz.dm index 1898d0c353baaf..de738723365bce 100644 --- a/code/controllers/subsystem/multiz.dm +++ b/code/controllers/subsystem/multiz.dm @@ -1,17 +1,12 @@ -var/datum/subsystem/z_levels/SSz - -/datum/subsystem/z_levels +SUBSYSTEM_DEF(z_levels) name = "Z Levels" flags = SS_NO_FIRE init_order = 12 //before SSatoms var/list/vertical_connections //assoc list of "[Z number]" = list("[Other Z Number]" = TRUE/FALSE) var/list/zshadows -/datum/subsystem/z_levels/New() - NEW_SS_GLOBAL(SSz) - -/datum/subsystem/z_levels/stat_entry() +/datum/controller/subsystem/z_levels/stat_entry() var/c = 0 for(var/z in vertical_connections) var/list/L = vertical_connections[z] diff --git a/code/game/objects/effects/decals/Cleanable/humans.dm b/code/game/objects/effects/decals/Cleanable/humans.dm index 9075e5a2523ffa..a39c4fbe93404a 100644 --- a/code/game/objects/effects/decals/Cleanable/humans.dm +++ b/code/game/objects/effects/decals/Cleanable/humans.dm @@ -20,6 +20,16 @@ blood_DNA |= C.blood_DNA.Copy() ..() +/obj/effect/decal/cleanable/blood/old + name = "dried blood" + desc = "Looks like it's been here a while. Eew." + bloodiness = 0 + +/obj/effect/decal/cleanable/blood/old/Initialize() + ..() + icon_state += "-old" //This IS necessary because the parent /blood type uses icon randomization. + blood_DNA["Non-human DNA"] = "A+" + /obj/effect/decal/cleanable/blood/splatter random_icon_states = list("gibbl1", "gibbl2", "gibbl3", "gibbl4", "gibbl5") @@ -50,7 +60,7 @@ random_icon_states = list("gib1", "gib2", "gib3", "gib4", "gib5", "gib6") mergeable_decal = 0 -/obj/effect/decal/cleanable/blood/gibs/New() +/obj/effect/decal/cleanable/blood/gibs/Initialize() ..() reagents.add_reagent("liquidgibs", 5) @@ -83,13 +93,23 @@ /obj/effect/decal/cleanable/blood/gibs/torso random_icon_states = list("gibtorso") - /obj/effect/decal/cleanable/blood/gibs/limb random_icon_states = list("gibleg", "gibarm") /obj/effect/decal/cleanable/blood/gibs/core random_icon_states = list("gibmid1", "gibmid2", "gibmid3") +/obj/effect/decal/cleanable/blood/gibs/old + name = "old rotting gibs" + desc = "Space Jesus, why didn't anyone clean this up? It smells terrible." + bloodiness = 0 + +/obj/effect/decal/cleanable/blood/gibs/old/Initialize() + ..() + setDir(pick(1,2,4,8)) + icon_state += "-old" + blood_DNA["Non-human DNA"] = "A+" + /obj/effect/decal/cleanable/blood/drip name = "drips of blood" @@ -139,25 +159,17 @@ /obj/effect/decal/cleanable/blood/footprints/update_icon() cut_overlays() - for(var/Ddir in cardinal) + for(var/Ddir in GLOB.cardinal) if(entered_dirs & Ddir) - var/image/I - if(bloody_footprints_cache["entered-[blood_state]-[Ddir]"]) - I = bloody_footprints_cache["entered-[blood_state]-[Ddir]"] - else - I = image(icon,"[blood_state]1",dir = Ddir) - bloody_footprints_cache["entered-[blood_state]-[Ddir]"] = I - if(I) - add_overlay(I) + var/image/bloodstep_overlay = GLOB.bloody_footprints_cache["entered-[blood_state]-[Ddir]"] + if(!bloodstep_overlay) + GLOB.bloody_footprints_cache["entered-[blood_state]-[Ddir]"] = bloodstep_overlay = image(icon, "[blood_state]1", dir = Ddir) + add_overlay(bloodstep_overlay) if(exited_dirs & Ddir) - var/image/I - if(bloody_footprints_cache["exited-[blood_state]-[Ddir]"]) - I = bloody_footprints_cache["exited-[blood_state]-[Ddir]"] - else - I = image(icon,"[blood_state]2",dir = Ddir) - bloody_footprints_cache["exited-[blood_state]-[Ddir]"] = I - if(I) - add_overlay(I) + var/image/bloodstep_overlay = GLOB.bloody_footprints_cache["exited-[blood_state]-[Ddir]"] + if(!bloodstep_overlay) + GLOB.bloody_footprints_cache["exited-[blood_state]-[Ddir]"] = bloodstep_overlay = image(icon, "[blood_state]2", dir = Ddir) + add_overlay(bloodstep_overlay) alpha = BLOODY_FOOTPRINT_BASE_ALPHA+bloodiness @@ -170,7 +182,7 @@ var/obj/item/clothing/shoes/S = shoe . += "some [initial(S.name)] \icon[S]\n" - user << . + to_chat(user, .) /obj/effect/decal/cleanable/blood/footprints/replace_decal(obj/effect/decal/cleanable/C) if(blood_state != C.blood_state) //We only replace footprints of the same type as us diff --git a/code/game/objects/effects/decals/Cleanable/misc.dm b/code/game/objects/effects/decals/Cleanable/misc.dm index 97df69802f6e1a..f1b0a9ce40605b 100644 --- a/code/game/objects/effects/decals/Cleanable/misc.dm +++ b/code/game/objects/effects/decals/Cleanable/misc.dm @@ -11,7 +11,7 @@ icon_state = "ash" mergeable_decal = 0 -/obj/effect/decal/cleanable/ash/New() +/obj/effect/decal/cleanable/ash/Initialize() ..() reagents.add_reagent("ash", 30) pixel_x = rand(-5, 5) @@ -21,7 +21,7 @@ name = "large pile of ashes" icon_state = "big_ash" -/obj/effect/decal/cleanable/ash/large/New() +/obj/effect/decal/cleanable/ash/large/Initialize() ..() reagents.add_reagent("ash", 30) //double the amount of ash. @@ -40,9 +40,13 @@ /obj/effect/decal/cleanable/greenglow name = "glowing goo" desc = "Jeez. I hope that's not for lunch." - luminosity = 1 + light_color = LIGHT_COLOR_GREEN icon_state = "greenglow" +/obj/effect/decal/cleanable/greenglow/Initialize(mapload) + ..() + set_light(1) + /obj/effect/decal/cleanable/greenglow/ex_act() return @@ -100,6 +104,14 @@ viruses = null return ..() +/obj/effect/decal/cleanable/vomit/old + name = "crusty dried vomit" + desc = "You try not to look at the chunks, and fail." + +/obj/effect/decal/cleanable/vomit/old/Initialize() + ..() + icon_state += "-old" + /obj/effect/decal/cleanable/tomato_smudge name = "tomato smudge" desc = "It's red." @@ -145,7 +157,7 @@ if(severity == 1) //so shreds created during an explosion aren't deleted by the explosion. qdel(src) -/obj/effect/decal/cleanable/shreds/New() +/obj/effect/decal/cleanable/shreds/Initialize() pixel_x = rand(-10, 10) pixel_y = rand(-10, 10) ..() @@ -156,3 +168,21 @@ icon = 'icons/effects/tomatodecal.dmi' icon_state = "salt_pile" gender = NEUTER + +/obj/effect/decal/cleanable/glitter + name = "generic glitter pile" + desc = "The herpes of arts and crafts." + icon = 'icons/effects/tile_effects.dmi' + gender = NEUTER + +/obj/effect/decal/cleanable/glitter/pink + name = "pink glitter" + icon_state = "plasma" + +/obj/effect/decal/cleanable/glitter/white + name = "white glitter" + icon_state = "nitrous_oxide" + +/obj/effect/decal/cleanable/glitter/blue + name = "blue glitter" + icon_state = "freon" diff --git a/code/game/objects/effects/decals/Cleanable/robots.dm b/code/game/objects/effects/decals/Cleanable/robots.dm index ebcf6f9f7ca3b0..862d21ad6b3afa 100644 --- a/code/game/objects/effects/decals/Cleanable/robots.dm +++ b/code/game/objects/effects/decals/Cleanable/robots.dm @@ -48,7 +48,7 @@ blood_state = BLOOD_STATE_OIL bloodiness = MAX_SHOE_BLOODINESS -/obj/effect/decal/cleanable/oil/New() +/obj/effect/decal/cleanable/oil/Initialize() ..() reagents.add_reagent("oil", 30) diff --git a/code/modules/atmospherics/environmental/LINDA_system.dm b/code/modules/atmospherics/environmental/LINDA_system.dm index 617850c145b20d..81ffd046063f51 100644 --- a/code/modules/atmospherics/environmental/LINDA_system.dm +++ b/code/modules/atmospherics/environmental/LINDA_system.dm @@ -39,8 +39,7 @@ /turf/proc/CalculateAdjacentTurfs() var/list/atmos_adjacent_turfs = src.atmos_adjacent_turfs - for(var/direction in cardinal) - for(var/direction in atmos_dirs) + for(var/direction in GLOB.atmos_dirs) var/turf/T = get_step(src, direction) if(!T) continue @@ -86,7 +85,7 @@ var/matchingDirections = 0 var/turf/S = get_step(curloc, direction) - for (var/checkDirection in atmos_dirs) + for (var/checkDirection in GLOB.atmos_dirs) var/turf/checkTurf = get_step(S, checkDirection) if(!S.atmos_adjacent_turfs || !S.atmos_adjacent_turfs[checkTurf]) continue diff --git a/code/modules/atmospherics/machinery/atmosmachinery.dm b/code/modules/atmospherics/machinery/atmosmachinery.dm index 1497d79905947c..9fee93743e5986 100644 --- a/code/modules/atmospherics/machinery/atmosmachinery.dm +++ b/code/modules/atmospherics/machinery/atmosmachinery.dm @@ -65,7 +65,7 @@ Pipelines + Other Objects -> Pipe network node_connects.len = device_type for(DEVICE_TYPE_LOOP) - for(var/D in atmos_dirs) + for(var/D in GLOB.atmos_dirs) if(D & GetInitDirections()) if(D in node_connects) continue diff --git a/code/modules/multiz/z_helpers.dm b/code/modules/multiz/z_helpers.dm index a960cb9e9743c3..52b8dc83f79795 100644 --- a/code/modules/multiz/z_helpers.dm +++ b/code/modules/multiz/z_helpers.dm @@ -1,26 +1,24 @@ -//Connects A and B (intended to be numbers, eg: 2, 3) inside SSz.vercial_connections +//Connects A and B (intended to be numbers, eg: 2, 3) inside SSz_levels.vercial_connections //(Mentions vertical to avoid confusing with the existing z-transition system, which is """horizontal""") /proc/ConnectVerticalZs(A, B) - LAZYINITLIST(SSz.vertical_connections) - var/list/L = SSz.vertical_connections["[A]"] - if(!L) - L = list() + LAZYINITLIST(SSz_levels.vertical_connections) + var/list/L = SSz_levels.vertical_connections["[A]"] + LAZYINITLIST(L) L["[B]"] = TRUE - SSz.vertical_connections["[A]"] = L - L = SSz.vertical_connections["[B]"] - if(!L) - L = list() + SSz_levels.vertical_connections["[A]"] = L + L = SSz_levels.vertical_connections["[B]"] + LAZYINITLIST(L) L["[A]"] = TRUE - SSz.vertical_connections["[B]"] = L + SSz_levels.vertical_connections["[B]"] = L //Check A and B are connected, without the need for a turf or z_open hole //Used for sounds, explosions, etc. /proc/AreZsConnected(A, B) - if(!LAZYLEN(SSz.vertical_connections)) + if(!LAZYLEN(SSz_levels.vertical_connections)) return FALSE - var/list/L = SSz.vertical_connections["[A]"] //only check one of the pairs, as it's a twoway thing A<->B so finding A->B is enough + var/list/L = SSz_levels.vertical_connections["[A]"] //only check one of the pairs, as it's a twoway thing A<->B so finding A->B is enough if(L) return L["[B]"] diff --git a/code/modules/multiz/zshadows.dm b/code/modules/multiz/zshadows.dm index 5988698b0ec25f..0be6c2d8fd60c0 100644 --- a/code/modules/multiz/zshadows.dm +++ b/code/modules/multiz/zshadows.dm @@ -6,8 +6,8 @@ var/atom/owner /atom/movable/zshadow/Initialize() - ..() - LAZYADD(SSz.zshadows, src) + . = ..() + LAZYADD(SSz_levels.zshadows, src) /atom/movable/zshadow/Move() //loc = only bby. return @@ -15,10 +15,10 @@ /atom/movable/zshadow/CanFallThroughZ() //amusing, but no return -/atom/movable/zshadow/Destroy() - if(!QDELETED(owner)) //Nothing destroys these if their owner exists, they *ARE* their owner as far as we're concerned +/atom/movable/zshadow/Destroy(force) + if(!QDELETED(owner) && !force) //Nothing destroys these if their owner exists, they *ARE* their owner as far as we're concerned return QDEL_HINT_LETMELIVE - LAZYREMOVE(SSz.zshadows, src) + LAZYREMOVE(SSz_levels.zshadows, src) return ..() /atom/movable/zshadow/examine(mob/user) From 441bd0f7ec7559652a1d29c5cf04d343ed32ffda Mon Sep 17 00:00:00 2001 From: Remie Richards Date: Sat, 13 May 2017 15:09:05 +0100 Subject: [PATCH 06/10] Multiz Test map is now loaded the standard way. --- _maps/multiz_test.dm | 22 +--------------------- _maps/multiz_test.json | 0 2 files changed, 1 insertion(+), 21 deletions(-) create mode 100644 _maps/multiz_test.json diff --git a/_maps/multiz_test.dm b/_maps/multiz_test.dm index 01a0a9db1ad0cd..fcc252ff9868a6 100644 --- a/_maps/multiz_test.dm +++ b/_maps/multiz_test.dm @@ -1,21 +1 @@ -#if !defined(MAP_FILE) - - // MultiZ Station - - #define TITLESCREEN "title" - - #define MINETYPE "lavaland" - - #include "map_files\debug\multiz_test.dmm" - - #define MAP_PATH "map_files/debug" - #define MAP_FILE "multiz_test.dmm" - #define MAP_NAME "MultiZ Station" - - #define MAP_TRANSITION_CONFIG list(MAIN_STATION = UNAFFECTED) - -#elif !defined(MAP_OVERRIDE) - - #warn a map has already been included, ignoring MultiZ Station. - -#endif +#define FORCE_MAP "_maps/multiz_test.json" diff --git a/_maps/multiz_test.json b/_maps/multiz_test.json new file mode 100644 index 00000000000000..e69de29bb2d1d6 From c3ffeba80daa7a544465d48b5238365cab7eafa0 Mon Sep 17 00:00:00 2001 From: Remie Richards Date: Sat, 13 May 2017 15:11:26 +0100 Subject: [PATCH 07/10] Rest in peace Zvent. --- .../atmospherics/machinery/other/zvent.dm | 51 ------------------- tgstation.dme | 1 - 2 files changed, 52 deletions(-) delete mode 100644 code/modules/atmospherics/machinery/other/zvent.dm diff --git a/code/modules/atmospherics/machinery/other/zvent.dm b/code/modules/atmospherics/machinery/other/zvent.dm deleted file mode 100644 index d9f1378cab52f1..00000000000000 --- a/code/modules/atmospherics/machinery/other/zvent.dm +++ /dev/null @@ -1,51 +0,0 @@ - -/* - Remie note: - I added proper multiZ, but this thing is ancient - I "updated" it, and it DOES work, but it's - not in RPDs, pipe dispensers etc and some of its - content (on/off, volume_rate) aren't implemented. - - Use this for ruins and stuff I guess, or fix it up proper. -*/ - - -/obj/machinery/zvent - name = "interfloor air transfer system" - - icon = 'icons/obj/atmospherics/components/unary_devices.dmi' - icon_state = "vent_map" - density = 0 - anchored=1 - - var/on = 0 - var/volume_rate = 800 - -/obj/machinery/zvent/New() - ..() - SSair.atmos_machinery += src - -/obj/machinery/zvent/Destroy() - SSair.atmos_machinery -= src - return ..() - -/obj/machinery/zvent/process_atmos() - - //all this object does, is make its turf share air with the ones above and below it, if they have a vent too. - if(isturf(loc)) //if we're not on a valid turf, forget it - var/turf/T = loc - for (var/ddir in list(DOWN,UP)) //change this list if a fancier system of z-levels gets implemented //meow - var/turf/open/zturf_conn = get_step(loc, ddir) - if (istype(zturf_conn)) - if(!AreZsConnected(zturf_conn.z, T.z)) - continue - - var/obj/machinery/zvent/zvent_conn= locate(/obj/machinery/zvent) in zturf_conn - if (istype(zvent_conn)) - //both floors have simulated turfs, share() - var/turf/open/myturf = loc - var/datum/gas_mixture/conn_air = zturf_conn.air //TODO: pop culture reference - var/datum/gas_mixture/my_air = myturf.air - if (istype(conn_air) && istype(my_air)) - my_air.share(conn_air) - air_update_turf() diff --git a/tgstation.dme b/tgstation.dme index 4cc6ed56820b8f..e6d8c276fc8763 100644 --- a/tgstation.dme +++ b/tgstation.dme @@ -1073,7 +1073,6 @@ #include "code\modules\atmospherics\machinery\components\unary_devices\vent_scrubber.dm" #include "code\modules\atmospherics\machinery\other\meter.dm" #include "code\modules\atmospherics\machinery\other\miner.dm" -#include "code\modules\atmospherics\machinery\other\zvent.dm" #include "code\modules\atmospherics\machinery\pipes\manifold.dm" #include "code\modules\atmospherics\machinery\pipes\manifold4w.dm" #include "code\modules\atmospherics\machinery\pipes\multiz.dm" From c1331192dc4bb718e18d2591e150280580194291 Mon Sep 17 00:00:00 2001 From: Razharas Date: Mon, 15 May 2017 14:54:19 +0300 Subject: [PATCH 08/10] Makes vines 3d Makes vines 3d --- code/modules/events/spacevine.dm | 42 ++++++++++++++++++-------------- 1 file changed, 24 insertions(+), 18 deletions(-) diff --git a/code/modules/events/spacevine.dm b/code/modules/events/spacevine.dm index bbeedee68f5c75..b854561b5e1ba5 100644 --- a/code/modules/events/spacevine.dm +++ b/code/modules/events/spacevine.dm @@ -60,7 +60,10 @@ return /datum/spacevine_mutation/proc/on_spread(obj/structure/spacevine/holder, turf/target) - return + var/turf/T = get_turf(holder) + if(((T.z > target.z) && !(T.z_open)) || ((T.z < target.z) && !(target.z_open))) + holder.spread(GLOB.cardinal) //adding 3rd dimention means there is now 1 in 3 chance to try and spread into ceiling or floor so to prevent the 33% spread slow on failed attempt to grow up or down it will try to spread in the same plane + . = TRUE /datum/spacevine_mutation/proc/on_buckle(obj/structure/spacevine/holder, mob/living/buckled) return @@ -169,6 +172,8 @@ quality = MINOR_NEGATIVE /datum/spacevine_mutation/vine_eating/on_spread(obj/structure/spacevine/holder, turf/target) + if(..()) + return var/obj/structure/spacevine/prey = locate() in target if(prey && !prey.mutations.Find(src)) //Eat all vines that are not of the same origin qdel(prey) @@ -180,6 +185,8 @@ quality = NEGATIVE /datum/spacevine_mutation/aggressive_spread/on_spread(obj/structure/spacevine/holder, turf/target) + if(..()) + return target.ex_act(severity, null, src) // vine immunity handled at /mob/ex_act /datum/spacevine_mutation/aggressive_spread/on_buckle(obj/structure/spacevine/holder, mob/living/buckled) @@ -446,7 +453,7 @@ /datum/spacevine_controller/Topic(href, href_list) if(..() || !check_rights(R_ADMIN, FALSE)) return - + if(href_list["purge_vines"]) if(alert(usr, "Are you sure you want to delete this spacevine cluster?", "Delete Vines", "Yes", "No") != "Yes") return @@ -512,14 +519,13 @@ growth_queue -= SV for(var/datum/spacevine_mutation/SM in SV.mutations) SM.process_mutation(SV) - if(SV.energy < 2) //If tile isn't fully grown + if(SV.energy < 2) if(prob(20)) SV.grow() - else //If tile is fully grown + else SV.entangle_mob() - //if(prob(25)) - SV.spread() + SV.spread(GLOB.atmos_dirs) if(i >= length) break @@ -554,24 +560,24 @@ to_chat(V, "The vines [pick("wind", "tangle", "tighten")] around you!") buckle_mob(V, 1) -/obj/structure/spacevine/proc/spread() - var/direction = pick(GLOB.cardinal) +/obj/structure/spacevine/proc/spread(list/dirs) + var/direction = pick(dirs) var/turf/stepturf = get_step(src,direction) - for(var/datum/spacevine_mutation/SM in mutations) - SM.on_spread(src, stepturf) - stepturf = get_step(src,direction) //in case turf changes, to make sure no runtimes happen - if(!locate(/obj/structure/spacevine, stepturf)) - if(stepturf.Enter(src)) - if(master) - master.spawn_spacevine_piece(stepturf, src) + if(stepturf) + for(var/datum/spacevine_mutation/SM in mutations) + SM.on_spread(src, stepturf) + stepturf = get_step(src,direction) //in case turf changes, to make sure no runtimes happen + if(!locate(/obj/structure/spacevine, stepturf)) + if(stepturf.Enter(src)) + if(master) + master.spawn_spacevine_piece(stepturf, src) /obj/structure/spacevine/ex_act(severity, target) if(istype(target, type)) //if its agressive spread vine dont do anything return - var/i for(var/datum/spacevine_mutation/SM in mutations) - i += SM.on_explosion(severity, target, src) - if(!i && prob(100/severity)) + . += SM.on_explosion(severity, target, src) + if(!. && prob(100/severity)) qdel(src) /obj/structure/spacevine/temperature_expose(null, temp, volume) From 271d02e3d1865c97322f427425be5036f14c656e Mon Sep 17 00:00:00 2001 From: Razharas Date: Mon, 15 May 2017 17:31:50 +0300 Subject: [PATCH 09/10] Checking zlevel connection on creation or movement Checking zlevel connection on creation or movement --- code/modules/events/spacevine.dm | 28 +++++++++++++++++++++++++--- 1 file changed, 25 insertions(+), 3 deletions(-) diff --git a/code/modules/events/spacevine.dm b/code/modules/events/spacevine.dm index b854561b5e1ba5..9812cb39d5f74d 100644 --- a/code/modules/events/spacevine.dm +++ b/code/modules/events/spacevine.dm @@ -327,11 +327,29 @@ max_integrity = 50 var/energy = 0 var/datum/spacevine_controller/master = null - var/list/mutations = list() + var/list/mutations + var/list/spread_flags /obj/structure/spacevine/Initialize() ..() add_atom_colour("#ffffff", FIXED_COLOUR_PRIORITY) + mutations = list() + spread_flags = list() + if(AreZsConnected(src.z, src.z + 1)) + spread_flags["[UP]"] = TRUE + if(AreZsConnected(src.z, src.z - 1)) + spread_flags["[DOWN]"] = TRUE + +/obj/structure/spacevine/Move() + ..() + if(AreZsConnected(src.z, src.z + 1)) + spread_flags["[UP]"] = TRUE + else + spread_flags.Remove("[UP]") + if(AreZsConnected(src.z, src.z - 1)) + spread_flags["[DOWN]"] = TRUE + else + spread_flags.Remove("[DOWN]") /obj/structure/spacevine/examine(mob/user) ..() @@ -525,7 +543,7 @@ else SV.entangle_mob() - SV.spread(GLOB.atmos_dirs) + SV.spread() if(i >= length) break @@ -560,7 +578,11 @@ to_chat(V, "The vines [pick("wind", "tangle", "tighten")] around you!") buckle_mob(V, 1) -/obj/structure/spacevine/proc/spread(list/dirs) +/obj/structure/spacevine/proc/spread(var/list/dirs) + if(!dirs) + dirs = GLOB.cardinal + for(var/A in spread_flags) + dirs += text2num(A) var/direction = pick(dirs) var/turf/stepturf = get_step(src,direction) if(stepturf) From 19955879bdd7d464c4a37887d52cdbbc5541e324 Mon Sep 17 00:00:00 2001 From: Razharas Date: Mon, 15 May 2017 23:39:05 +0300 Subject: [PATCH 10/10] Makes explosions 3d Makes explosions 3d --- code/game/objects/explosion.dm | 87 +++++++++++++++++++++------------- 1 file changed, 53 insertions(+), 34 deletions(-) diff --git a/code/game/objects/explosion.dm b/code/game/objects/explosion.dm index 11079bf847e2e2..be4e5be451d32c 100644 --- a/code/game/objects/explosion.dm +++ b/code/game/objects/explosion.dm @@ -1,27 +1,66 @@ -/proc/explosion(turf/epicenter, devastation_range, heavy_impact_range, light_impact_range, flash_range, adminlog = 1, ignorecap = 0, flame_range, silent = 0, smoke = 1) +/proc/explosion(turf/hypocenter, devastation_range, heavy_impact_range, light_impact_range, flash_range, adminlog = 1, ignorecap = 0, flame_range, silent = 0, smoke = 1) set waitfor = 0 - src = null //so we don't abort once src is deleted - epicenter = get_turf(epicenter) - if(!epicenter) - return - - if(isnull(flame_range)) - flame_range = light_impact_range - if(isnull(flash_range)) - flash_range = devastation_range - - // Archive the uncapped explosion for the doppler array + src = null + var/start = world.timeofday + var/turf/epicenter = hypocenter var/orig_dev_range = devastation_range var/orig_heavy_range = heavy_impact_range var/orig_light_range = light_impact_range - - if(!ignorecap && epicenter.z != ZLEVEL_MINING) + if(!ignorecap && hypocenter.z != ZLEVEL_MINING) //Clamp all values to MAX_EXPLOSION_RANGE devastation_range = min(GLOB.MAX_EX_DEVESTATION_RANGE, devastation_range) heavy_impact_range = min(GLOB.MAX_EX_HEAVY_RANGE, heavy_impact_range) light_impact_range = min(GLOB.MAX_EX_LIGHT_RANGE, light_impact_range) flash_range = min(GLOB.MAX_EX_FLASH_RANGE, flash_range) flame_range = min(GLOB.MAX_EX_FLAME_RANGE, flame_range) + var/range = max(devastation_range, heavy_impact_range, light_impact_range, flame_range) + if(adminlog) + message_admins("Explosion with size ([devastation_range], [heavy_impact_range], [light_impact_range], [flame_range]) in area: [get_area(epicenter)] [ADMIN_COORDJMP(epicenter)]") + log_game("Explosion with size ([devastation_range], [heavy_impact_range], [light_impact_range], [flame_range]) in area [epicenter.loc.name] ([epicenter.x],[epicenter.y],[epicenter.z])") + flat_explosion(hypocenter, devastation_range, heavy_impact_range, light_impact_range, flash_range, ignorecap, flame_range, silent, smoke) + var/z_range = round(range / 2) + var/counter = 1 + var/z_scale + while(counter < z_range) + if(!AreZsConnected(epicenter.z, epicenter.z + 1)) + break + z_scale = cos(arcsin(counter / z_range)) + epicenter = get_step(epicenter, UP) + flat_explosion(epicenter, round(devastation_range * z_scale), round(heavy_impact_range * z_scale), round(light_impact_range * z_scale), round(flash_range * z_scale), ignorecap, round(flame_range * z_scale), silent, smoke) + counter++ + counter = 1 + epicenter = hypocenter + while(counter < z_range) + if(!AreZsConnected(epicenter.z, epicenter.z - 1)) + break + z_scale = cos(arcsin(counter / z_range)) + epicenter = get_step(epicenter, DOWN) + flat_explosion(epicenter, round(devastation_range * z_scale), round(heavy_impact_range * z_scale), round(light_impact_range * z_scale), round(flash_range * z_scale), ignorecap, round(flame_range * z_scale), silent, smoke) + counter++ + + var/took = (world.timeofday-start)/10 + //You need to press the DebugGame verb to see these now....they were getting annoying and we've collected a fair bit of data. Just -test- changes to explosion code using this please so we can compare + if(GLOB.Debug2) + log_world("## DEBUG: Explosion([hypocenter.x],[hypocenter.y],[hypocenter.z])(d[devastation_range],h[heavy_impact_range],l[light_impact_range]): Took [took] seconds.") + + //Machines which report explosions. + for(var/array in GLOB.doppler_arrays) + var/obj/machinery/doppler_array/A = array + A.sense_explosion(epicenter,devastation_range,heavy_impact_range,light_impact_range,took,orig_dev_range,orig_heavy_range,orig_light_range) + + return 1 + +/proc/flat_explosion(turf/epicenter, devastation_range, heavy_impact_range, light_impact_range, flash_range, ignorecap = 0, flame_range, silent = 0, smoke = 1) + set waitfor = 0 + src = null //so we don't abort once src is deleted + epicenter = get_turf(epicenter) + if(!epicenter) + return + + if(isnull(flame_range)) + flame_range = light_impact_range + if(isnull(flash_range)) + flash_range = devastation_range //DO NOT REMOVE THIS SLEEP, IT BREAKS THINGS //not sleeping causes us to ex_act() the thing that triggered the explosion @@ -34,15 +73,10 @@ var/static/explosionid = 1 var/id = explosionid++ - var/start = world.timeofday var/max_range = max(devastation_range, heavy_impact_range, light_impact_range, flame_range) var/list/cached_exp_block = list() - if(adminlog) - message_admins("Explosion with size ([devastation_range], [heavy_impact_range], [light_impact_range], [flame_range]) in area: [get_area(epicenter)] [ADMIN_COORDJMP(epicenter)]") - log_game("Explosion with size ([devastation_range], [heavy_impact_range], [light_impact_range], [flame_range]) in area [epicenter.loc.name] ([epicenter.x],[epicenter.y],[epicenter.z])") - // Play sounds; we want sounds to be different depending on distance so we will manually do it ourselves. // Stereo users will also hear the direction of the explosion! @@ -88,7 +122,6 @@ var/x0 = epicenter.x var/y0 = epicenter.y - var/z0 = epicenter.z var/list/affected_turfs = spiral_range_turfs(max_range, epicenter) @@ -182,20 +215,6 @@ UnexplodeT.explosion_level = 0 exploded_this_tick.Cut() - var/took = (world.timeofday-start)/10 - //You need to press the DebugGame verb to see these now....they were getting annoying and we've collected a fair bit of data. Just -test- changes to explosion code using this please so we can compare - if(GLOB.Debug2) - log_world("## DEBUG: Explosion([x0],[y0],[z0])(d[devastation_range],h[heavy_impact_range],l[light_impact_range]): Took [took] seconds.") - - //Machines which report explosions. - for(var/array in GLOB.doppler_arrays) - var/obj/machinery/doppler_array/A = array - A.sense_explosion(epicenter,devastation_range,heavy_impact_range,light_impact_range,took,orig_dev_range,orig_heavy_range,orig_light_range) - - return 1 - - - /proc/secondaryexplosion(turf/epicenter, range) for(var/turf/tile in spiral_range_turfs(range, epicenter)) tile.ex_act(2)