From 04ec014ea49c052d5c7b64095d2a4053f65c6753 Mon Sep 17 00:00:00 2001 From: FalseIncarnate Date: Wed, 19 Jul 2017 00:06:17 -0400 Subject: [PATCH 01/15] Plumbing Update Sinks, Toilets, and Urinals can now be unanchored and moved with a wrench. Standard sinks and toilets can also be rotated when unanchored by hitting them with a wrench again. - Urinals and kitchen sinks cannot be rotated because they looked horrible in other directional states. - I removed the directional states from them because we don't use them and MAN were they bad. When re-anchoring a sink or urinal, it will automagically offset itself to match its direction. This means sinks will appear against walls (or at least the edge of the tile). While unanchored, sinks cannot be used to wash hands or objects. Toilets can still have things hidden in their cistern while unanchored, however. At this time, showers cannot be moved and there is no way to obtain new fixtures. I'll be adding that later in this PR. --- code/game/objects/structures/watercloset.dm | 166 ++++++++++++++++++-- icons/obj/watercloset.dmi | Bin 12615 -> 13089 bytes 2 files changed, 153 insertions(+), 13 deletions(-) diff --git a/code/game/objects/structures/watercloset.dm b/code/game/objects/structures/watercloset.dm index d3cc48d46bf..5223b438404 100644 --- a/code/game/objects/structures/watercloset.dm +++ b/code/game/objects/structures/watercloset.dm @@ -50,9 +50,61 @@ /obj/structure/toilet/update_icon() icon_state = "toilet[open][cistern]" + if(!anchored) + pixel_x = 0 + pixel_y = 0 + layer = OBJ_LAYER + else + if(dir == SOUTH) + pixel_x = 0 + pixel_y = 8 + if(dir == NORTH) + pixel_x = 0 + pixel_y = -8 + layer = FLY_LAYER /obj/structure/toilet/attackby(obj/item/I, mob/living/user, params) + if(iswrench(I)) + if(anchored) + var/response = "Disconnect" + if(cistern) + response = alert(user, "Do you want to stash [I] or disconnect [src]?", "Wrench", "Stash", "Disconnect", "Cancel") + if(response == "Stash") + stash_goods(I, user) + else if(response == "Disconnect") + user.visible_message("[user] begins disconnecting [src]...", "You begin disconnecting [src]...") + if(do_after(user, 40 * I.toolspeed, target = src)) + if(!loc || !anchored) + return + user.visible_message("[user] disconnected [src]!", "You disconnected [src]!") + anchored = 0 + return + else + var/response = "Connect" + if(cistern) + response = alert(user, "Do you want to stash [I], rotate / connect [src]?", "Wrench", "Stash", "Rotate or Connect", "Cancel") + if(response == "Stash") + stash_goods(I, user) + return + if(response == "Cancel") + return + response = alert(user, "Do you want to rotate or connect [src]?", "Wrench", "Rotate", "Connect", "Cancel") + if(response == "Rotate") + var/list/choices = list("North" = NORTH, "East" = EAST, "South" = SOUTH, "West" = WEST) + var/selected = input(user,"Select a direction for the connector.", "Connector Direction") in choices + dir = choices[selected] + update_icon() //is this necessary? probably not + else if(response == "Connect") + user.visible_message("[user] is connecting [src].", "You are connecting [src]...") + if(do_after(user, 40 * I.toolspeed, target = src)) + if(!loc || anchored) + return + user.visible_message("[user] connected [src]!", "You connected [src]!") + anchored = 1 + update_icon() + return + if(istype(I, /obj/item/weapon/crowbar)) to_chat(user, "You start to [cistern ? "replace the lid on the cistern" : "lift the lid off the cistern"]...") playsound(loc, 'sound/effects/stonedoor_openclose.ogg', 50, 1) @@ -106,20 +158,25 @@ to_chat(user, "You need a tighter grip!") if(cistern) - if(I.w_class > WEIGHT_CLASS_NORMAL) - to_chat(user, "[I] does not fit!") - return - if(w_items + I.w_class > WEIGHT_CLASS_HUGE) - to_chat(user, "The cistern is full!") - return - if(!user.drop_item()) - to_chat(user, "\The [I] is stuck to your hand, you cannot put it in the cistern!") - return - I.loc = src - w_items += I.w_class - to_chat(user, "You carefully place [I] into the cistern.") + stash_goods(I, user) return +/obj/structure/toilet/proc/stash_goods(obj/item/I, mob/user) + if(!I) + return + if(I.w_class > WEIGHT_CLASS_NORMAL) + to_chat(user, "[I] does not fit!") + return + if(w_items + I.w_class > WEIGHT_CLASS_HUGE) + to_chat(user, "The cistern is full!") + return + if(!user.drop_item()) + to_chat(user, "\The [I] is stuck to your hand, you cannot put it in the cistern!") + return + I.loc = src + w_items += I.w_class + to_chat(user, "You carefully place [I] into the cistern.") + /obj/structure/toilet/secret var/secret_type = null @@ -141,6 +198,27 @@ /obj/structure/urinal/attackby(obj/item/I, mob/user, params) + if(iswrench(I)) + if(anchored) + user.visible_message("[user] begins disconnecting [src]...", "You begin to disconnect [src]...") + if(do_after(user, 40 * I.toolspeed, target = src)) + if(!loc || !anchored) + return + user.visible_message("[user] disconnected [src]!", "You disconnected [src]!") + anchored = 0 + pixel_x = 0 + pixel_y = 0 + else + user.visible_message("[user] begins connecting [src]...", "You begin to connect [src]...") + if(do_after(user, 40 * I.toolspeed, target = src)) + if(!loc || anchored) + return + user.visible_message("[user] connected [src]!", "You connected [src]!") + anchored = 1 + pixel_x = 0 + pixel_y = 32 + return + if(istype(I, /obj/item/weapon/grab)) var/obj/item/weapon/grab/G = I if(!G.confirm()) @@ -398,7 +476,9 @@ return if(!Adjacent(user)) return - + if(!anchored) + to_chat(user, "This [src] isn't connected, wrench it into position first!") + return if(ishuman(user)) var/mob/living/carbon/human/H = user var/obj/item/organ/external/temp = H.bodyparts_by_name["r_hand"] @@ -445,6 +525,45 @@ if(!(istype(O))) return + if(iswrench(O) && !istype(src, /obj/structure/sink/puddle)) //puddles laugh at your attempt to disconnect them. you can't remove a puddle from the ground with a wrench! + var/obj/item/weapon/wrench/W = O + if(anchored) + var/response = alert(user, "Would you like to wash [W] or disconnect [src]?", "Wrench", "Wash", "Disconnect") + if(response == "Disconnect") + user.visible_message("[user] is disconnecting [src].", "You are disconnecting [src]...") + if(do_after(user, 40 * W.toolspeed, target = src)) + if(!loc || !anchored) + return + user.visible_message("[user] disconnected [src]!", "You disconnected [src]!") + anchored = 0 + update_icon() + return + else if(response == "Cancel") + return + else + var/response + if(istype(src, /obj/structure/sink/kitchen)) + response = "Connect" //Kitchen sinks can't be rotated because they only have one directional state (SOUTH) + else + response = alert(user, "Would you like to rotate or connect [src]?", "Wrench", "Rotate", "Connect", "Cancel") + if(response == "Connect") + user.visible_message("[user] is connecting [src].", "You are connecting [src]...") + if(do_after(user, 40 * W.toolspeed, target = src)) + if(!loc || anchored) + return + user.visible_message("[user] connected [src]!", "You connected [src]!") + anchored = 1 + update_icon() + else if(response == "Rotate") + var/list/choices = list("North" = NORTH, "East" = EAST, "South" = SOUTH, "West" = WEST) + var/selected = input(user,"Select a direction for the connector.", "Connector Direction") in choices + dir = choices[selected] + update_icon() //is this necessary? probably not + return + + if(!anchored) + to_chat(user, "This [src] isn't connected, wrench it into position first!") + return busy = 1 var/wateract = 0 @@ -453,6 +572,27 @@ if(wateract) O.water_act(20,310.15,src) +/obj/structure/sink/update_icon() + ..() + if(!anchored) + pixel_x = 0 + pixel_y = 0 + else + if(istype(src, /obj/structure/sink/puddle)) + return + if(istype(src, /obj/structure/sink/kitchen)) + pixel_x = 0 + pixel_y = 28 + return + else //normal sinks + if(dir == NORTH || dir == SOUTH) + pixel_x = 0 + pixel_y = (dir == NORTH) ? -30 : 30 + else + pixel_x = (dir == EAST) ? 12 : -12 + pixel_y = 0 + + /obj/structure/sink/kitchen name = "kitchen sink" icon_state = "sink_alt" diff --git a/icons/obj/watercloset.dmi b/icons/obj/watercloset.dmi index 61ea7ad3aac04a9d2efa7a82725d0ac2ec3630a5..f1bd3ce0e99fa02dd7cf10966b6c71a8a35ea765 100644 GIT binary patch literal 13089 zcmW++1ymGm7hYiLEOlZsBi48VCQAy z>Ez+<{lMvk5Miu|27HpA=ZK%~2vx?J^J6G9-pRo?R7NA2;~d9Ztcclsp+HW|GHR-}<> zh5pt?zG-w}Ell;?$0=$eu*qX1wbWLRw016nvR&JXZ>Ln?aXeO3`-deCDzNhP?AC~X z0c3gv=dkxRN#s5(_qO=AeB^LYzApa^7Y7u)O|OW5Wdp16GVdY_B)&drWJE@*g4%Dh&H*?)QolYXUCp5h4R*l&`w5;;f>qvRr85Xozdh z*F-4)Yo9XGyrfN1pA@zFH5&hTg2G(K7O3HV*#x~r%0jn%utj1EGhu9+IYfq)rcrly zfqkoU-%V^du(#n9JQjE$M>n@Q&Q)BMk$@g7Va!q2ONB1X?vJT`9bl-9ROnGU=>t!0 zD!#oh$$Ib_PDJhs4`QDd=u2(4rpcK*|O0YplQJCqQN zy0Kf)**WXYH{px0mk~tyJSv6i#Q11lJf@Svla3DBoyf-o(EzJg2T$vlpre$bvoW-= zpjvIUl04+HT6;1$sd$RpMmULPHJ`(X)1i6P9ZGT}j}Nn~C`nYNt<(#y>G=d-S*;}M zQrUhXE_TT$cu`rpT3Vi8U0vM*Cq4Q1FO64%=7KF%N{lG>&^A%{mIWmyKeci<))wZB zZA((U6=mGVH#ISoJe0}hJy6P+&X2Hm!(XeGZ%I0XcL@kP!Vu%My!cfYS7^OkwpcAK zQlRcF7HX-TojVAh(0kE<(DRPFd}_(uYI>sE8(Tu_#*rq}Z%9~4$QHi2rj*#+-@mSV zC2{7D$;`?!WqW{#eW%DaQ-q+PpzwR*Qq<|K5rs?RXMZBGyP@P@W>*l2Q%p(wHA|`h zo_%jh3l%B^qy)zWDT#}Tm7)B1er|Ud`~U;hM1RRX{0YdDs)q_kwoqngkWEk%YV>9w z%d#*r2&cajm*{J!eG%pLs~-z=PPO5h?oO^xtnG9}kr*7gvtv&w_-t#Nw1t39g56oh z4T&8Z_f;uWLu2g9YSC4SlGpLN7AsERA!$@4?9yFepX5^>JqkbX2gb3KX-W^b%O+RI z@pDuNc+FK=c>vn(spBp!`r>0eHV8xM=f*CKf|8K)!Awr2lL8USqr}!bcoUSIeW*8! z<LlS}Q?^mk{+%;vU0SPAF&uhm4s| z3dX$3G77dNo)D)4&qYgj zTT!wT*xFe6gMkCxg0hC~&l-r_n;4mHlkT@6EipjmO`b13YuzI!g<&Zha(H;$eYPTT zy44gf`l6b})&?A2Q!s!;!b*wc1p1-z!4(BDFvClFr$Xa!{_O0P%}DwPQgG-B2Ji-dNp(yI~US*LUIFtV;i#3=)#KEaA-u^V{{5#njGW@Q$@^GJ{r$;$??~keAqj*i=r+s7?=92`@rtwV6U{@< zv)qgCrz!TNW@4sO$i2#J{?b~g2IiJg!pB&3SbrY#l ztb`-Bz1|@ef)S>SDek$T!~wK*9_q-1fD} zWW!$cuD?usMzKckj%*{+dR&-jRX_lmGLjK&c60@Q^ph5O-}xvDnA_UglLSrv=N>(! z9H4A;M6rnPhJexl+ppTKZFG<2^y(>=u&J?|wIheu&2HPeTf69!GfRozk6tAQ+Z1mC zK10#3G|*?{q>_B=3e3JmA{F(=t3e?1efnS9D^g_Dh{hshn#U+`Ku0!Xh4@+3<^O!; zbTFBjm&yYmtFP77iRXkV{1#|~C6^IgDp`avGGv%IP(F0zw>$utDqrdJ5^0M`P>1 zXys|?B_07LuaH>6Qm1dkEe#xA%1+6&JzY^@eUdw@Xh%btW}6h;v6mnAyYBSGi41Pg zOwj}AGk7a^#d%P<3bj}U9^(oVSg-XvU7_q^aFUCM4z^nUE97_;UMpDnBdn+=)&)(DrDps#B>OQVF$1G5)p()b0L?Aq{^v=3vWiDuIxA zzD)|D+R}n)M887k#}4YQr)hak6ha?S|0OX&r(3Wua7PA5ape70@7a5e_O0+_0qT?q zUW{U!O?LJ{%F6ks}y| zejs+9n1_ybun1xwqcE%!n~Lb;Y#e0w*o%-T6nAwEV)w6^w z4q^f2PZx;ko%l43^P$CRO5g$|?R{lcHJJGgczV=P6jsqq^MD5L#ml?p3h&X0?0usX zbauA8GcNK45Aac}sGnFE%Dny?O-C665w#md&vyxckvr)V49%a99rRXU zDO}}o`lP^8vbq>0$yC*GUXMVlt=$ojacaj)!Z~E8{NJLqX+s2SBU!+I_!Ni z_SSvJt?KvyR(yPS*f}kTBw(*@^^`Pbdt%HW7$t=oRpwO;PiMsBAFR%l3tm-RRBNaq z6QXC09gzLq#npUaNi$JsmsZYYLH{XAjfaJ(+e3MEk*6#=fYIXeCVE_sVeO6*T|RQb z!LDg(to(V-gndv9Qb8dQg-ASVI)&+PyPKfgIz$S2Zvq6^*xc^5m{pEpqlia@vLw%= zCKK(Gg$3$S5O(vAl@eZtL_wE1e*#)D0h?CA*PI&~NtUQp}XM;MFV0-r0(? zoZi{Zu#3qe2VaB`fAsH*^3raxqLUa{?Il?)XTNla;l$A&B23u0{f{36E44I@J5iG~ z)*l-k9Y()U2vBIx$#EU!ZCQ7|~tPpldLOR1A>ciK8oDtpwC5zrtVki%!E8)WCWKjHV{(eiZ zzYOU!;oG8eLW^n&BG_Zk8=a9cPM*GYc*|{3Q({yV zBDi(C*orHh1~I={gVB?$<865$yYSaKEnStLQEz6Z`R@{&(vf~zUGpU1?#*W_VW=N@ zEOFhwOCRj#zf-^2t{30nCla-ioo}()%0#mdoF2@j*+oow4LKO2D*eU*sTBw&7A;7xx=gVj%7-kl=pwcHHB7VZRdnsqO4kVufwUr)(lwOAc<5zO~6LX>>M zf5tQyQI@cZX6(Gh<)BDvRji7o+p#*@S5Ecw*u=ds@Lq|ULb+T2#e+iUl}g$WEYiXe7C z9sPc!cvRM2YGqsOKgkQ}9ZR&}AsiKk@_(x@^FaA?d+vJKBn8@F5F)}_yO5?M`vlK$ z5)gRSvp9(<5=wl#w;{fv#MhgGZ)_3rS!8I+tCT*L?TLFuo%~O(`E6JjIw;uZKoX1` zmAEh0APiV}N@RDF9}6Q(>R5_Xq;O@9eB!+j=~QO1xQKr%We`?QZvO&yB0rU#OwrKN3m zCkC0N@bmJ%PmY0wiTpZ0TVo)?m0aj>_Sgvus538!)X z2!hZi=fF3o$k%_j1=ZCOB|K`zCv+K#NJN#c{w-@=AM-`*hpTmGWxYrWFLvp%SE%Sw z*T{mc4-AuKJ;PvLAS-#Ujbl(;iR(oD$pWJML`Et4groH9#2>tMKE)}Wn0Yle3}+z1 zVi0()WNWHh5L_&dP))75tD=n-XkOr6Rc{7=|IY;LWv|_H*kRErZZ|Td-WVu=PGWQ* z8Y1{RWuOv>fE?xMRy%knkP?M?&9YmdfCKd#3c4WL+!3A7()MALI5zWfBtEE|5nUCt z$DC|ygcCi;;tkXd{k^y_;dEpI$mxq0R?15;^fK(1Ho6;w&iFO0Q-ETDyoZ7ei9i`B z0rB!g`D0vz`pTCdr1VPyYDSjApT}gu{wFI3vE`Nl=9lF`yH&otAcAoM_K7B*jN&iM zhUEvtW4^-Exy*J3SJ>$I_E+{Sz_Q)&?Gf4#9*Mkwoy?4P>u7`$YlA^EcHyD$AvU?! zuXAr75WD#lLT-Qe1~C~1*z$v!f-kaH$-26(7hS^jRQ#`x7BYem52s-~-;ICtCg1dK zW;)~%9~>M^PELYABECnIrlzKNtMQVwlQh`!TNTyS%0@;M2Zx6`W@fR%t3a14;KU;M zTyZ^BON!XA$~?wvcl^zK)oT&I6B=OVckV2=`uh5UiVEB|-(xvoYE{RzX^yCu((N`+ z*#2JYFv}i}BCzTJ|Aa&YCY`@bupi(5*L%D_rRaLvpy=ujxmo@|EADIc^!Si)Xn+l5 z-xo)JexThf`_boxJqCba1DidBp=W6AXT7-G*l$5&VDm=T%-!oHcjcfU@!K19h-_P% ziN79eQeut!s?lLHum1?)|F>hkZN@QVM>*>IuvZqil;1_tm{8Z0(H)|l?qbcULa zSCV;g?FP!SH=ZTK!>alQ2BLW%y$NHVan-i6JIR;*e$6V=gi&&?TUOB4Mm>_w)6`1o z)DwkEq1%aZtU9?gBBbW|jeZ=9M$8*Jc~4^>!oKJ#@Y4}hX`+Mld=OLFeg3eZ>T@{#f}7FQ%ORv+H# zxj91#_#iVslm2M$51Rq&l}c1eQqb3mikaZ2lP_f40*uN1KUAqrGVGe>FMd^c79UDYb29V%rfWsp6pJ`-UCr(MTpm^ z<8mc@=f4s=Zll?r+*r1@V#{OxbH&HUFH1Qa&EyXcwu`agHx@<#q~)_ll_!dfYoTcP zhnm*bR)G)24FG5g3sD9VXywh!vY{e(1Xj@|jslB|izGt6g7%&qB3?UjAZT3=CLx{r zeqiey8vJk@OWM&b@`LuBhrCafNLS__S~{) zma(IwgF$0;-(gOaAelkYDKEI{ z^l_0{2$ab=J&@BhN{0vvZZ~77b23^49Sg>)Sxfz^moM_e63nVvagN)3ogTyF<>k%w zW{yhD5+&dtZ!>w&wEDjyoIaT&La5hqRGjcKUfP?9)gc$rP4ckle!3a#x~;S?%uG)+ zo#9$xtHw__9uGty6W}&6!>KrQ{%a_N=+Dn+VLG+m#5HYgX6BYkU%#2g6)Q`7HRAfKk!kMO5457e zEpz+F$AY>36A~A3lZ%U4XE~K-O<53+9K2KHjlTmKp&6+eX zpE8d_K_rO-ad{8=Xv`<8Kft3Um1wy*Swt$k{RZ%J;{Z`LGH1oxOyZkUD5^cY@gw(d zMm^R*8et3;xXvZcvBu`*TjJNFnj#4>(1moKR0tK|LLwn|^|O8N*5!n0l)LRlz61bm zwO0*{2HfU<@DrFB7>>^rlSQ}@<|58suPTK#HAJ+^;z<;PYWt=(n>Jq;v?JEn*V6>o#|O+J;k|UPDotO~Ra8|a zi0+metqeTA#^+w(C$j(DRjDx<-pd63@IhPKn9S?%;T1<7J;4W?PR<7-9$%>yrte*i zc(b#@g{`fD{Sl`}M_`a^OKk383ZzcviZHE@raX`h7^1HCu#^RZDfBWWKxg=hi2d`2 zliqKk!MOaEBm4XNo4cxwe}v!9xn`JCTz7wIbL&;BZchZn0?C|uD2|>Y&w+s@cdd;>)w%-1Y;?$t0M*eegcwnN~ZZJ$;s=viVU#; z^p1*5gs2an5Jsl-is7H)*2lM6GBQj#IsT#f(mVGGj!Y*l|5-cD4nN;fD)M@5`|OKh z<*!n|l{{Gq)G%|k2NzZbQHGfY%&z(DSPy?)mb4siiM^(nN$`!OjQ~S;cqfX`*~!sS z4le=NJ^|a@mf*UxhC&8@m(KGH3Vuyh)6hU}*5o#OVf6a!1;gv2Cj};A`H`ONf?#x_ z{k{9~Tygx*hrM)PD=Xs>Rr*h}v$H$INvp-HM-Mlj3rZgR^-}9|S9b^Y_P!R@PWbj^ z(E)zI#JIGyWW(_xw?fjyhOfS{k@YHm1qdi7M-|wRibq;r47?~-h*2L4o<^&Ghef0u z=~GvNXWqBtCW%hc4=`^805!yydM zsQFO%c^T69?b}LwE@O*7sUGl;q6N88SMy(9u8`6)cjZ!Lm^`&&eNDsFeCd!yjP-#H z1+;p<(y{U5g8qE`67v0$iFfFc2s(X4hkCFk2d6U zlca5x78F)#N-V7@#0!}~7+fMAV{ zLh=;ObdOiWITAjoVRth+`ud}>h_|k;cpwiu51PVBMNs$l2*uRQ1-j7NJ4+GdA@iTh zjywHd6Q*Z%!S-VZS=ga-DP0t8vP~FUH|v&7ZnU>0&o8Nybvfw*_ZTOc>=~eEsw?v*0}C4bi#oRH*dQ%_#_mxS&|0wyY*~keChc z|KMFY9v1wyi5+Br7nqXk!a}0>I)gl3o~jt21fQnm%(E3j8W9GP9#=kiiCW3*?bjE~ z_4y`O)iE$ai8Gk;OS@_b-YDYxh@+>4uCl-w%HOLY9}4HyC{`qW(Brie+SjE=!h&vo zlmD&kbv~l4(#|n?akkm*FDX%77(dy5UNA?scXXsKlC01*VkBUUGDejIHMX#jV&?xZ zS%>%7y*+Bt{ckjEVh>hL9=0gwKhK32(!YisVFo!lxv||$N zjjKq&$*s4uc-@$ov_<_rGek{l!=6HEL_B0%C(q~P%4~X--ip>|9miPNKTvOcEEmvF z+US0tA3#O@)TDhMzx1o77Stq`$3_E5O#&t5=O+T|_r6DyR%@{VT!Xxr7D%ml1qI13 zf-EiRK_B_u9P)+jM}kZDf&xyfZ0Y)97t?K?sxT(>G=ieu0>@2cIr0J?QCh*wV4{j! zwBKZF#}F=YA540Es!PxQ1_1QYN8uSpEtWL;F1v^LPmw{p%TGG(O5e6`hZ2+}|FMU! zbhGGxA(lXTy{tt)t=|$edFh$zFjJWw*}-#UkfU2pm+40>ardA+1>AQ=bo?aeHz$B& z_cq@9vCx?PlfF!oike{lpBw{zzE~et zrD$wI;eQ@38QU+9Y_f(hAzaONOLXg{4)ocDk}1TAE8^nf8i~})T@^h)H^glcE4Y|* z+kg>c+X4XTQsCl%fJd~&^(=&nihaQ20(mDDi_zu@Jb{kCTMG#PSQ-0|B#u_Am$g55 z3s}NN8YO#AFoijt%K|ME6SAT_Z&l_&|?H=>P7oLE(;+&JfX65Or`S{VRh;wS1? z3_RkWEeR2zi-Xlp29Ha6_wz_~r-_O0GX zLEq6dPF^Hjg-#}*c6(XRXu8uheCtPi3h<0vV*PfvC_Na=|8GICwS(B$Tqu|iz3XZ3 zhCFDQ;<~fI4DCPJfH#Sh4ugqk`)yx9oBl~Ia-D_At}E5PhRP!8I_x}0vOq?$aih@L zsy~F8q4$*VqQIa)_2Z41*f4`IVSHXd8lcoiD5;cl?zDZxu;P|p7Peq`Fu3?|^+f?e zNvxx1(v11aZ48-`*q57A=QGz@lL4&)hR~dxpR2KBfZ%pu*TWb{pgdwM25Q` zmg;tQi;%GtZ5mf7<4V7%cL!yuSeNm0T9|$-BaH=Jp%`YY4)2KRk+lpjN|wmHlc{K& z!p9BS2fR+m>kH&j7yA_@f=R$dgKdF&1)?&)vy?^6$cg1Dp8Tes}35AJOS&7Py6qVH@t21Nn6Soy*AC z_0XTyc}vc*6npDXx$^g`gB&^!Y%dD3^EJb1;WGwCMm9hTz_B|1MW)HU_hRWIJrKJ6 z@5-N|)AK@JmHqr|Mr&XFKFuAw*UTo(Z1W%HOAR;;X1mHvv;(4_3rpwvAokO+()SVA zD$(Y}XLkPIoT{C0lmF#lzn6U-rthlTjx}cuwRBNi5&QPTwS3aFu*kYzflVQ^3(^fP z18bk3dv{u5xKv|W6f@nM+vUZp4JS&YyXCRFj&mvb zC&~9JqS!9ySH%^nd>m63*Vw5|zN!v1lN;7zTaC!)?gUuzABna$p_Y5FAp98?B6i)! zkC5K_nyRs-4RPL8dFJTioptiY9%`B2klyJlE!MYE8Ey}1+XA(Zg2%Y3CUTqc(#H1M z4}`Ep?6e!c7^>G|7c(f+Wi|T5=fjF?oSdH(7+=vEnaE|@m*ILH=JyQV3A2!KO}*pt zxR`knot+Q4IItu|Sw?#Q7>q=Eo371;y^8x9_WBTId*}TWf1+Dx>#fHHslDNY3lm@r zZqcpn`k+uTE{{WL(fYYA=YOYVo%|B9|GT&H$(YjM=^OUmPI)Y0fQi2sc8y=CSOYLp zO8398S+IK30zbgLLd&f$_XECv;GIBF5ds0s*wW8ki5p!v-0bNGExK!Zg{tgROwsh=@`)wBV1+&P1CtK-OtsZ zU;wNrBtmO9btYb~K745w_z+c4T3v-nVTjvDAbC%q@ zXn|^{QM1e%Q=}JM8dU)E#3IoO9M*D(W-W=z@WtokZwZrE z1l^QcBtHV`kbh;Xn-V#}hj?~5Ib)|#suz}mD91_pnp}U8-u>tbXrq;2C@pP%Zp^Gwm;bSUTR1rx86~SY z@fIn=K5Ll{+<Xrh4F5AOH0Xy2wvt9DIHKn{RT8oXxuN&zBQ{3F z*RNJRQ%WhkdDklGh5~Ax9H@(|(z$oY$bRe(UKcZ^pH|j!To)QK;jgMaG28#*mD-$N zPk1xRUQt5y0NjpjIz%gJQ2hRDRy6btD1jv&X2RrUWl_R=7{tWIQ|CDIo#VzWfroD6 z;)B6^a5Q_}P_aq`c5YgJ6;Mar-<&3jdwmy@exs;}&cVTv(wZ^)+t-tyXPLjierTTd z6JU}$;n6{@y{y!Jc~X?r?RD;;VbRB|#a#wH~meO*>{9!}i1*N$$tzPwh-h+T? zr!y)XagwI4QFk%({GB=O?GJU<-EuXItf3NiiiX{pU7#DdTEWy^;M592j{1~_Y(2nG;fLdM(YG+**HV~=bTeEd?B z#Px~KfGY7yTgJQgoEG30=h$$^P_Z|sxIulTYwlBX^Pqjf(?`haX*Ne1p$uux`tXAg|XcFH$klV_aU)6J^KB ztbF{J&dns}y8&4)p;<9Skonu^`{oTT9Q7&sPR7<-l#{CP%omn3{q6sfSCV5~d8&ea zyUhU^4IbfuM%N|gqfn2!BHtp0cOBG&!=&MV1f^+{iTo``waQBZegnYAkZRrP7-xn;?e&s zdJEx~X4ERsXmTS7y=hwQlN6@J>v#T3*2KctwY1jjjKV=J`IN7}jIp0|O8I{_eWMuK zTb7+ z*-osf6R2`#WhkrRh~FDLGVDPkxAQ*D#93Z{Q%0V;=kcGb+{uYYzeqbE4l)jP%k3RD z1~`k67I7)1mnNKK*zDuT?wsCoG<~-U<~^XL=UKiB&81ouIs$)l=)5R}Qy(`nm>}z> zf-0M-lDJjL3yompYxJ$p@uRye>|`w##s33dMF2daX?^jBe5_GfGC!NfF+{h+R~H}4 znEp)_d2qnk9L!Lfx^C-&7Q)~}%5VD|yE7-4&9wxNxthX{r2l|d^IL)E(vK!z)UB&= z(y1(x7awx`!F7u@#JTw#!oL75d$1)LK2IHKGV2M)d}gM@K92KF(vnia-aE}mA<=gG z^oQ0ylUB8+Rh~~Tw21e!37=k6YX5hzMuLBJ0 z+`cn+~~Hvdm#y$l_nlYyweV+dUqwqrW==bzs^P2NVAs&&rh#y%7I z@B2x(Ic<&UrYYBI)H^7&TR}2Lml@KwtJ4}<)bFSeu%U5TqPA)J(lXJvVQCnxf-B8- zvJ^#mJm>NZpJ7>&k4MYmS@D|&QJV&&Kg62L{2Nq|Ko5VEwZ;l`P#RcO4K)OFB7#i(}O?1 zWBPmf!tuB(MH2O=9VW)#Bpk0v-2->wmZFuaCuPs|_O?=bSjn!J@A^J$Qx5S9iy$Y0a9E(|3w^)J}!-w}ArDEu915zEvjY^eC&qcTM%96{tV;9Pi zB+XoBm&wJv46p2DV@}?)&=ry$8mQ>CvZleZowv7#rWRo&Q;)QeJM(8sXGnZhoki!s(fd8Q-qma zl>z0van$&L+=$IBa}%}}QUdJD62#p)0J~f`3K7jQMcHR>nk6;ZPtn3(z&1@1vv0U^ zHxrIrq?`Tr(T{W3;mQ!XpGNO~)%AJ@EhYXTHCL^M3ngGMh_nrVbbFgu+`Y{J+7#Tm zzW9cs(N?<_Bh`lhfTIr&R*4_!S6e9Ay@UOPYlD+ppPX^qD7qu<6SWw&P5JLW!_-L} zgmck3zfR{YZNf9hmle$F+Asc;${pz@s7L0GX*59Wo~2p&q~a@}V?jedzQ*iVodOS(c#J4u()fDH`M;7~tw(I2w5d`Go3DugtO z-Tr2EX6P-!=@~mrI>lNy&RE66$!ReAU1c?LRTlLDsaN|w@o4 z%m7b-jvkxlmul~j(h%$0bU56&^50<~b$m<32@xzOsW2d~m>=Z-_UF>%@ v+1^-R(@FZKSL?Icr>X2`4J}4wc_PE;FZAve*{OlHBM79TsHspTXBGZGIsZY( literal 12615 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 From e0837b1254bdf39b2884b8f81f71b3fa0936f8d4 Mon Sep 17 00:00:00 2001 From: FalseIncarnate Date: Sun, 23 Jul 2017 02:10:57 -0400 Subject: [PATCH 02/15] Showers You can now detach showers with a welding tool Cleaned up some code regarding shower mist - Also made boiling shower water make mist faster, and freezing shower water can disperse mist Made a new proc for /atom/movable to handle transferring fingerprints from one atom to another --- code/game/atoms_movable.dm | 11 ++ code/game/objects/structures/watercloset.dm | 108 ++++++++++++++++---- 2 files changed, 99 insertions(+), 20 deletions(-) diff --git a/code/game/atoms_movable.dm b/code/game/atoms_movable.dm index 61eec85e9cc..1ce51657e85 100644 --- a/code/game/atoms_movable.dm +++ b/code/game/atoms_movable.dm @@ -359,3 +359,14 @@ dense_object_backup = AM break . = dense_object_backup + +/atom/movable/proc/transfer_prints_to(atom/movable/target = null, overwrite = FALSE) + if(!target) + return + if(overwrite) + target.fingerprints = fingerprints + target.fingerprintshidden = fingerprintshidden + else + target.fingerprints += fingerprints + target.fingerprintshidden += fingerprintshidden + target.fingerprintslast = fingerprintslast diff --git a/code/game/objects/structures/watercloset.dm b/code/game/objects/structures/watercloset.dm index 5223b438404..92f5e75c6e9 100644 --- a/code/game/objects/structures/watercloset.dm +++ b/code/game/objects/structures/watercloset.dm @@ -47,7 +47,6 @@ open = !open update_icon() - /obj/structure/toilet/update_icon() icon_state = "toilet[open][cistern]" if(!anchored) @@ -63,7 +62,6 @@ pixel_y = -8 layer = FLY_LAYER - /obj/structure/toilet/attackby(obj/item/I, mob/living/user, params) if(iswrench(I)) if(anchored) @@ -188,6 +186,7 @@ w_items += secret.w_class + /obj/structure/urinal name = "urinal" desc = "The HU-452, an experimental urinal." @@ -237,6 +236,7 @@ to_chat(user, "You need a tighter grip!") + /obj/machinery/shower name = "shower" desc = "The HS-451. Installed in the 2550s by the Nanotrasen Hygiene Division." @@ -251,6 +251,24 @@ var/watertemp = "normal" //freezing, normal, or boiling var/mobpresent = 0 //true if there is a mob on the shower's loc, this is to ease process() +/obj/machinery/shower/New(turf/T, newdir = SOUTH, building = FALSE) + ..() + dir = newdir + if(building) + pixel_x = 0 + pixel_y = 0 + switch(newdir) + if(SOUTH) + pixel_y = 16 + if(NORTH) + pixel_y = -5 + layer = FLY_LAYER + +/obj/machinery/shower/Destroy() + if(mymist) + qdel(mymist) + return ..() + //add heat controls? when emagged, you can freeze to death in it? /obj/effect/mist @@ -276,9 +294,9 @@ /obj/machinery/shower/attackby(obj/item/I as obj, mob/user as mob, params) if(I.type == /obj/item/device/analyzer) to_chat(user, "The water temperature seems to be [watertemp].") - if(istype(I, /obj/item/weapon/wrench)) + if(iswrench(I)) to_chat(user, "You begin to adjust the temperature valve with the [I].") - if(do_after(user, 50, target = src)) + if(do_after(user, 50 * I.toolspeed, target = src)) switch(watertemp) if("normal") watertemp = "freezing" @@ -287,33 +305,57 @@ if("boiling") watertemp = "normal" user.visible_message("[user] adjusts the shower with the [I].", "You adjust the shower with the [I].") + update_icon() //letsa update whenever we change the temperature, since the mist might need to change + if(iswelder(I)) + if(on) + to_chat(user, "Turn [src] off before you attempt to cut it loose.") + return + var/obj/item/weapon/weldingtool/WT = I + if(WT.isOn()) + user.visible_message("[user] begins to cut [src] loose.", "You begin to cut [src] loose.") + if(do_after(user, 40 * WT.toolspeed, target = src)) + if(!src || !WT.remove_fuel(0, user)) + return + if(on) //in case someone turned it back on while you were working, make sure we shut that all down + on = 0 + if(mymist) + qdel(mymist) + ismist = 0 + user.visible_message("[user] cuts [src] loose!", "You cut [src] loose!") + var/obj/item/mounted/shower/S = new /obj/item/mounted/shower(get_turf(user)) + transfer_prints_to(S, TRUE) + qdel(src) + else + to_chat(user, "[WT] must be on for this task.") if(on) I.water_act(100, convertHeat(), src) /obj/machinery/shower/update_icon() //this is terribly unreadable, but basically it makes the shower mist up overlays.Cut() //once it's been on for a while, in addition to handling the water overlay. - if(mymist) - qdel(mymist) - if(on) overlays += image('icons/obj/watercloset.dmi', src, "water", MOB_LAYER + 1, dir) + var/mist_time = 50 //5 seconds at normal temperature to build up mist if(watertemp == "freezing") + mist_time = 70 //7 seconds on freezing temperature to disperse existing mist + if(watertemp == "boiling") + mist_time = 20 //2 seconds on boiling temperature to build up mist + addtimer(src, "update_mist", mist_time) + else + addtimer(src, "update_mist", 250) //25 seconds for mist to disperse after being turned off + +/obj/machinery/shower/proc/update_mist() + if(on) + if(watertemp == "freezing") + if(mymist) + qdel(mymist) + ismist = 0 return - if(!ismist) - spawn(50) - if(src && on) - ismist = 1 - mymist = new /obj/effect/mist(loc) - else - ismist = 1 - mymist = new /obj/effect/mist(loc) - else if(ismist) ismist = 1 mymist = new /obj/effect/mist(loc) - spawn(250) - if(src && !on) - qdel(mymist) - ismist = 0 + else + if(mymist) + qdel(mymist) + ismist = 0 /obj/machinery/shower/Crossed(atom/movable/O) ..() @@ -450,6 +492,32 @@ return + +/obj/item/mounted/shower + name = "shower fixture" + desc = "A self-adhering shower fixture. Simply stick to a wall, no plumber needed!" + icon = 'icons/obj/watercloset.dmi' + icon_state = "shower" + item_state = "buildpipe" + +/obj/item/mounted/shower/try_build(turf/on_wall, mob/user, proximity_flag) + //overriding this because we don't care about other items on the wall, but still need to do adjacent checks + if(!on_wall || !user) + return + if(proximity_flag != 1) //if we aren't next to the wall + return + if(!(get_dir(on_wall,user) in cardinal)) + to_chat(user, "You need to be standing next to a wall to place \the [src].") + return + return 1 + +/obj/item/mounted/shower/do_build(turf/on_wall, mob/user) + var/obj/machinery/shower/S = new /obj/machinery/shower(get_turf(user), get_dir(on_wall, user), 1) + transfer_prints_to(S, TRUE) + qdel(src) + + + /obj/item/weapon/bikehorn/rubberducky name = "rubber ducky" desc = "Rubber ducky you're so fine, you make bathtime lots of fuuun. Rubber ducky I'm awfully fooooond of yooooouuuu~" //thanks doohl From eecf6028daf09aed7cbb5cb61d8368485e7daf8a Mon Sep 17 00:00:00 2001 From: FalseIncarnate Date: Sun, 23 Jul 2017 02:31:06 -0400 Subject: [PATCH 03/15] NEW AND IMPROVED NORTH SINKS! Now with 95% less shitty sprites - Percentage not guarenteed in any way. --- icons/obj/watercloset.dmi | Bin 13089 -> 13027 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/icons/obj/watercloset.dmi b/icons/obj/watercloset.dmi index f1bd3ce0e99fa02dd7cf10966b6c71a8a35ea765..4b00c72866fae130e8d01d0e202f7441f7e2bf8a 100644 GIT binary patch delta 12855 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 delta 12917 zcmW++1ymGW8(z8_1nCk`q`Mndx?4bENdf7eB^BwCkWN35kdRKL8w3Odq`MXb78dx& z|C~K%_srh8_l@U$-k8~ND1z0}paH?2^s^aP9_$G))w=u-o0-okqL{u4_}MbXyrsg4C7N@IeSMP9dkNNn7ZH>-V&=_uFXvMDp(#uaxC<&}rhrb_5ot zrdYcBzQj0wqo^$}@5fM041^4`kU8SZ<91`h-|(j*yP;6~;rC%Akz^^H9QO105h*E9 zYBW->7vgOxcD`tCa7BLobO4^h3VD$RF3zF|O}QLdm%Z)A6(v%gcIH=P4N7o^Ag2z9 zRVP#~#C4$5^`yLL;rjgKlyI_Mobof)sSR}Y1hrCj14H-)p?AsrAT~dKY{<-%H%IY2 zeJtY$I-A?z=tu8Y9=oi6ij>|)8C4qh(ckWtB-I9 z+Ot36H2<|vnP^`yBx_De*!&nxxIac?tLF^T^0;V%UZ519o4$DBaYfm1PVHP$<0|v$ zo137%)wwTbcF*v(5Y&8Dgb*ip_c`uWf)^u!J-A{xqiz?$o|qZ&JCNf>Rq;{Ram8XsHPUlJoJS78}cub$fsS_){etqO8a$ z;iX&|f{apUzL9~b<{%-6ZkV8wjs1IhLB4vH>~x=e&Y;{;Q^^8;2AOiaf`_w0epy-G zFcM7k^_|Mj&RHM92|pxEUIZ;;R2JQt<=(PnOfQu$6TpJ(OcdZi=)vu4LZ%H%vCzt~ zIGJ16(QP(c$?x(wY`vJBUwBE`M>Q-1&v&RM1kl;LT3R0e{rmSCH1_20-}K&z+6(rysj(7xLtCT~n^rV9LUd}~ zxSKe@jD1UTgAGmmyH~ZbG<-BE6+KXz*v@zGcHLn?=ZB~w2q3Cbl9J_U|DByV9E9A#A+<3dJ|27r1xhnON1$40K4wu) z(2;2MemqiOXJr=4d?O{@*Us=H+WSX8F64}M-7V9D%8*Rg`H(s(Bx-vbMkDfQ6WF3? zA!d~3a*=mO;f2M2QVrA68vARr=q5`e;B;As8!vp9Jo*B-@DSc3f1l5UCM58dWh`}? z#?$?x$<$F*-lyA2&6%0cg9Io`;;olXnSt5Ny@&>pO628WQe13&j_m)W|SCRnFeQ ztKgK62L`jaj%_F(g-klu$H?8R6o6TOc7ERO_VP$*kfVTV7XGGoC=Cw^bHvNa{)Mxh zKN#0}+x(!1Nu>3IFw$9!guTo9X{nj6$3?5cXnYo#g3RCUQ`~Yk^g3xq!o=t|(zn=t zilV_I_>^pdvbgpbp$l>RoYN!){KRPJ&sb%4$8vBWrcyU(svKCGJGj@j0RVa2NC?zE zb-^sm`jT~YtP|dOr~-kv%uw5ICfR4apU;*GRmep7C<&oeF&9|Mk|k=6C&}L6LVgIa z%1M1jN2lrGT67?$L6$d9gz?Wukmv_I?kHzQ-VA=t$0($Uhucj}yu0t>4@xKo`R!|B zVj^xg?7F;yjfRFXc5f>Qa9oA2tT(P-$#=g!J0s=b;0*tbb$V-BKuT=5)KB`Nn94*(1ei6!dL)qoTkH@359NRWvJLm z)G?DK$(K9G(jZaEqr+}cJ>E^Z+;v$;wHj)Okc4wPF0{xUjeo`mw|j60kmkC)iRk7~ z{qKzEgH_VmpHGIh{I0o*QH|ASvB}r@8F^R=HanANJ<|to+6(UdkFIe}gUs9@HCW_B zd{*bLeez`ENC2GzEXebYR(y=e?|SHjc7pV(?&%ODnw(@CZ{d}?TtBDcCoVn}t3uj= z;ESP?%NoTuYxK{FF?Cx!85N6OwBPpNLArlW+g|)7VI@8Np0?G~#}|}RKrP>WqVzXa zT~kYog_9G9q8V#|kK;oPby=nuZe`7@0x8wR{nigI=!-yjNc&t#Y7kocoq8n#x#j%^r5u7ZXG!(Q10YEQ7;AiVQHd!f`8i79_t^drjsJ6U z662I4dG_C(p;G^{49FH=%p38Snmnk7{v%_7nvW2`5+5lc&Qof%o&O_iULE9wmX<6S zqD^lSWq--v{i+C|VPYESMUWH5$BZxm$58sd%S59Hsv8qoBJQ^?tUAE?qi%Bx%X2xiW{Mq{8oT;)==iePeM^6H z2WxU>De24M^OO*~k_|9&sDXaffj$%G7b(|n;O*Bal#1ba4FqDj$Mj=sMV7J#`K=h0 z?l}sY=+JJgh$yF~A{LC8lfe`=0a{OxwLaC~iyvQMmm8ZnPhr*n> zf zk$X8=GV(DK2n~Lst&0oo(B?UNp(}4kt9p9I)~mcw=NDwyZzE}l6Itc>ASCdQHC@Cq z9e3AX4k9>^c{{Co#^&*;cF4-Z(o;fW905_u#HCKZ$ZL88qKu1%b!)n^()KuSSjB;! zCfzC4s#T+x$RlFi;KFNl{wFImUChpk35X$N zK9(w%AP*WWOdFo!^87}YHuMDNoFY+eVlOF-FV2cNRK-(b{TAH(&!q~NOUEz ze*^7-^*cXeDIy+?IoflXOCzNpZ&C2mZtB3bVxD6O;RSa$(6>A$4P}aK_>h#S*DcZ) zv@MUXG7`Sodm66Qz8R4sOqV(#fL&s@!NoO*)7|ia9Ip|6&vbgLtDBrOB~Y%wN{05` z&JGtdL}2F}p|r*?IpI6dA^K7S&xG$kTy5fP&2>T8W+tq$3T;8LWe z3DA<;WMmXjXR%oG?7L(CiW)RQu-$O4_fzp%lvAQyjPjAyvYMeBQck zw>k^yjphro8{gP6SWwq^?|E4d@IvIxoCUl(tbDAGW2bzEHaRg;YW$fmv#dUGFgsI< z*vSgbVIdGm!Q_RZG=mZpDb18u53WKbEmwa%BwidVIrmJt9Kuetlf=kbafjM{gBI_G zl|1@O_aa!@h90t7y zqy4(w>f+)ujy75Nu@)SnIg|c@66C1A?_I%UlYiay9-(j9QA$3blc&ccM@d|At51TD zkI>V%hG?mL~#v5a+G{L|Qm!L2eXe@-ly0 z!{uX?Sv@S_EeD{uS-1hK#@XB&iG?~$vdGbCF7YIFQY++;@kEs(5hXP(Q{ExT`An}h z$W#x}EzNU3V!?{Bd!WAvM0uZM!NXJVHg7ww)yD^L6B4?CGX@BG;BNiu2}SJI#F$YC zS}Gm7{PS48&dAAMxSgrz0_p_lwoqeMWX~TiQ200Jz~A|z(q_`IE}h(q!u}JqT2Ctp z_q&RkVlM?O5UC{72@oFw8p7eLG)DQwp& z@{$`^*GjfV|3eGa_J=3TI2n}lXMG!v-sEP_#O#A>E16^Ip=~Rb(&(F;kwpn}tEUMz z?;lvmY}AP2l~BCeysh)3xKH%%72)b^#b3_s>}KA&>04re;)f0TY~W5ovi|*0+1u3cn9$ zNeTIhmyU}ewCUQD@E0@y;{x-~W%^)L-|8M4Q=!l!!~cqE%<5Gq%6xikkPbkysNV3~ zhKMz=kVN!ADPuNOnJa=AOL_3PnN@yThHn~_o;G~ljr&cx9+lW!>w}&ZZ~yAWwE?}{ znZ+m?>9d<>tSRrrIS8&p1!j=aAyzflbO|MOb#?p|JE4S^5LdP@XAX{z11Oz16sRs3 z$=AgdBvv)lr11NmS9&8L|MK;6z+6ECw?(&A*p8RSyl*>zgORux~zH0np#^SrfQ_k=x%Zc%yl>)gZMlL@HsUFyCUc znT-JpnjXxf-$71!4>_8mtNz4?XcP|&zR?jVSlNBx?18>GCY%PoV89zDFK$jyOgiqy zm{uOdbK3P!uTUt6=x;BXVU0LFOL3fVI0;$-$v=l$imORmS((SzP1`D$v*BKcn6|k* z9*!Ik@ZYU5mAXTl(+1$^1vux!rX^crd@_ig(V@tRoqt8J1QHF5XIrblr~kMnY$c&G z)3E$`7a$!#kA;Q&-nJC)fVFg5itulHvvfK*X_5gyq3p3(IYauoflZrkVkyE zoGvmCeg2+n9S@q%R@Ix^iUoQd!dqA|AtsSzj_9Lb4pk1z+skb1O9CbZ_l2zwy zeav|K1~fj2-TLnS^zT#i0{p2~`@6tyGCHTkB!b@M9fY4DB^R+VMYZ;`Ex5jpH1S?L zA+gI?TspdJ^>=ye+L#}5FG8a`C+A6WM2Tw;Ou4d0Q!59)HZV+?^9Y-5fwJ_mF1}Go z6@fF|dnaG&-%Jcb_>pAdATLK{rM*627^k6%liXuBLz$}g-)GrHN1xgA7< z#`ed$Te$EU`e!sO5sbM*M$x6MgJ>x{wxcK_NCgX)I!=!z<>m-CRw|y`QElrKs9KP~fe3RF*dt2wdwZe%GOa~_?k5CM{UHst zpiC9YXSL$`m6MCybkD*RQsBe5R=YSSg>!>0iXoef7ApD(F9<=zenMpOSZoija54(+ zt?XK1Ds&^ZMi@f*r1Jx}v$Ni;VUS4w84R9rhzLUraVoxinRk5$Aa@F=Mcsez4&pEm za2ABHhMa#~rR?guTy%{vcoA@UxR4c$ygLE-zL4_V;IUQ6naWz4jx3pRwPmdL&iJeO z>X+jF$MoQxUwDBW_lAas!pcg5Hoqf9@ZRcX_Z`JE9K45RRb(nn@Uj^KDKxjfb z5{EHBKEz+}{~O-lo=|r^tW$S&hh8neWsvf-dAPqzJTSroi}LfsUtck4Ab(PTlUW7l80JwFd%h(rOB_*)@Bx9z>%C(>#-_3kp!UZ ze*3S6LVn2vNi*U`jL1pJXJY?uep6Bb%Guc1xVyjaC5(jLHa0ccZS*JPUtan(G&MP5 zB5}dPDNbDfT@zag_&ysU8tyJ6w0cVOtyBNG4xXD~)qcGy%1KC-#y07D=uh~+9(cLcSD3SEW*@~N_NCgkDx10}C8OG^J&bviSxUPJx^EnVvU?yHN~(?PbRKe3$oq@(;Q zfk)FzOL5=6eS6%MnVDJP;4fS9hkP=cP5!LFi_3Z0XCS(~82J)?T(J}oJo}NI^w|%Jb^m7tdW(E3U$)tjq{(N{^ePJfcKW)?F9gZwp6n}X zn`H8fh-@`uYjU$#1s{pTY1qpC>!!~OfJBSxR{WzjKfw7OP*PH|G?+Oovq+Lgyt~fk z!_evfgmivyi43J%!++sSnDrE9Az6=F#4^jrW&G}LwBx?gzA!UA&3Z~;gQuP_;dC?* ziAqG+#SW+8GY0%YBf)xn$^h4^^C7EkYqPMlR{iwZJibIt&O7%K13qsJyhP>htvMYX z9sR0z1jOzyD*UHbs_y}1Mf?`^C`|&5l3Nzm&k`m)zqPV0o%+GSHD=4)-qDdrUciL( zdHm$!V$Nx9l|@s|F^(|eei=$b-D)%NDbq*w2aWGTHPd9Y`xlEQ?Td%(qc8}0(m;Iv zogoI>@#TY~PzTMKOA{ZikT%f#CG*c_WJvujMbI zL^fvTqf?a>abBdQI8`EhApvzZ`T%*dpTkJQ@`B|kuec=T(U{n(&oap)7K7=?y=Xn) z>ck1X)pO0~*CN@&W||J|`cm+2(Oa0&$ziWVZ54LNamx;&@0W+uw{ku&c6W!WFS^YWj0d6 zS5Oo?TW-bpS4r#rYaMxc*4*5HumZX5TV*HKtu2zqEh!!MN&2ng2?@ zf;2i{sd4AZ!7RZ%(}>dr%zupY4A5s!&-IbsZHk@5yt1|vX6}yYL=!zdK0M47AjX6x z;#t}gUv}0~%Oh?w`5r+rU((h#Hd0wMxzC=PygYrv{Id8#nUzdwq~~K{2o~wy?(KM< z6j8=OFXN}Gssv=U;lu3g>^52QYRT&1-Bm_m>0N+9T0`FI&cN<2@TsV7!mlrf5ex@b zmZha7yJv6nDrL;<1RK76|SLao+-4y!0diqjx( zB5tJ(6rUuGvug zeb#G@-%QR9y>V)N`kr0<4I%EDm~d9K6aF*(IRiAP5xozEi>vF@)KvK5qPg)9wpa9g z7~-rPW%~Mc6^zH!>Q|a4;+;fcUi9Dj4^LMp7}&bl%ZUbA zy8|9T7@^FF_uW*sf)fhOO~kg?$90bO0#`4Jt@E*%2|v1Ww+bdq9PVZcelLU%C#L`OiTwF&1=^ z>H7LrPoN>uqgER;rKrB%yPpu|=*YZzG?EYa6D*5WAOfbG{s z$Bp5S3G>tX5ZKs$4qn(?Y8Q2zLKF7p)tYsaJHvJ9;|sbJeQw5}U6u*&2^mgO+-VJP2Z87s(`UUQx|vwBX6orIxU>E~hsiO`3(I=#;wTp=EGoL6PqfwJ+EtNr z`JSOtdiwjb`M1A$*!-y={Wz)s&C7?U*@b7RuSn1Ir^4ixu1+9u>pI_nw=N9oy! z{rYSE z8Vbz**2Ka|q)*{$PaSHc1)|ArBM%=Iy2^uMX@0JTzAc*9pk9&j#YzBl6WiD1Mu6a} zpH#oAdR-0~s&#YCo}6xU2gpd*6eUcypB2v0?j9a$il-=djhG0VqK(leLrtx$WZ8uN zOVJZJ@@S7<^!OdaZBiPQoR&8I1*WI>W)!KU6uG|h+j8hm*Vs7mQfx&%7Vg-ljd4Vd zxBfQ@jCI?s907M$R$V|Mz$;6_tPXexqZjv-cbhz$Q!KaZRededkaHAk1G}SJe^()_ zrMli7UJyu2_t2z!o3Qkwwhq!Hna@ejpOy?sE+|L>59kfYkke?f0|SJrgaNF!1Vlur z&V#M3nIP|k+#L(VU?U-AyTO4c)%J{iaf_LD57pQc23o;D^lQ-Kq}C%(5Rqk-Y|Lir z1jTzz_72Pu(zhWLmnZs6T(3Y_AHEZtVbNhvXXv||rO$MY9 zGC#RyiT^^a!K!;%hiTfdC3f<{E6s7H>SI&~-=R^ieg$K;Kb`c=o!S(5-38h4ol3}( z7=fJ+I7Nih`Z_vRxXhT4{PW1{?Ab`xZu9S;N!zd-vxle7-7zuPkZl-;5$j~Wj2tzu z)nR{c^eCrNK>{=JmxxXXgzW5vvVx(7v}T@kf@6V4@3&ijc6y6{;+JdF(h<-96J)^O z5BKe=EWKSA;@8~;OZ&y4UCs~=KTk8@u*A4l=E(H1NG6pmX+=s(N-K$OxvR40`?{1} zQY8;tUK_Y#Y)csAUupt;2>5unq=B78MWqjXzM$m%!fLd6f>5~Q_vQjJAWk0kj@-#+ z^`h>pKp{IY@=d1q7)OlTr2=H;{tvH%h0~I{(@2w{eIvT)WJ%RUYTxF(fa8#M70Ai} zm?GcPJ!j^V%CIIuLeBSBQ!oiJ5&RMou_#ms#LbH%dHvYgh2Iw;{Q2ZY7P5s0-`{s> z550bEFjCleIE|klg?PazA6U1wY+y3oX&$lpH6ayz#4f#dy;GbSf+_TGLrhyo$+5XG zOhK%!hutfx;AQH|PN2{N<3EMKS4lLEgGm^BZ66>T0m-h4okb~bD>Z(`YT}uCTzrQL zV2QDQrQF$SIE0gB@R0bV(5O)T-IaypFtZp*LVjR6sMb3ug{({7G%RvhWz!%BPb4A) zv*cj)Ng;7*oRe4bjOEI8ETyXChpQ8pQ@2*%G|%g!?~vSjU_PNe_oMr=eL(2rK$%Q9 zu|hjmx%A5G;Hk;JdWlMt^`5stRO`|)W})1fS^cK+*3v&f~J=Y6AMdYWDvenrVJBmEfEvRs@OG(wXQvnyN8P6N7j0bi2i?w~0xicfQEm(CPc@XOh#M5!g2V9*8563G z`AO*#rB4biy>rC4F;_zHX05ICwxXORx+JD@r~TJ=##-;2CviX>;Fjl4@T1W!$tCg3 zhIHP%qGo@ugjouuq8<;|kf-K-9_1P#iR*%Lhuv-i!9PAvEiOJg4gcj; z_pyaZv%FVCfdNzGEDP4>26i&|>K~U7Yt{(~37-YUTav+cMxk~Xa~VV(w9`J$+SS!n zi|t?Whxs1sOxg-|VTxMwCTRte)k8+< zlfQo9(u)^9lPiKz{M<$PxCmELG=84CQla~fu$VY6j7nEV7n3XctD9D!ONBNzs^kCd zK$y5IRQy$#q%3t)n*3GS&%#oa&!Qvu=4Oc0W*fKVXYvUlNWdwQ*TuWsS}7--H&NXX>He~{H+PHP#o6bT#YQ??F9Mp zAD^~1p;vgaBLkQhB6mE-4^cjb+Ujv-jqyI!`IcBxo%Kqlo*LPoQ9hX~Ew}*)&4>xy)GRt!Y6EnqZ zSUG|BK|#;pjTk#6&(s?p&-0llF&_)~&-bk<(3Vj?Uk9U5KIVVsfamd_fR_hoTifAN zLP_pnt=FFC6fomES60v;yb_yR4Z&fOJe~)DoJ7N1m&-qc*`_>2?)~hodN8FidiadD zyIm1S5@;6SjaTa*CfVqDASbK;A25rl*|Z=8(y-`q>(jl!FK-1VkhCOVIy1HQ_fX}< z(vPrs_{#tJUStOc#7+yOR4X0Vz2hLV`~?l@KLTbyX{b;!3|qlb(2!zsOlJp(=ysJY zd(Ac-D=}h1z~-oJJ~yYIQS%-SVvAZjtZqYZ;^peyhi2io(S>C-)i~6~1bx&}Jgye1 z!}ATC@gEDuv67TEqAWi}z7})vdIgXo<8c*c(5-GwUxm>=wVq**&siBiWSkn)$+SAP z=s#bQJH2fH!Lk#-a0b$Dd4i#=B~=_PCd93<|i~4Ad@y3bUhr*&=M)+Z7sebJi9d$8z4c zN8npry=(m72dvep$=N&;23z6M$gRxO%T@`t$&5C+j?NJ>^OniKN&w2l@ z=#O(@L|3Z-&=qhL&=x^ONlC*YMYc)7yvI?lhcF_WBu4HnE-e|oZt^@Rw;;+OfChgR z$5Yh`!;I{COq-1AL9H9Se}{)1`RS8Q&y;GaK>p>6Ok-h<&S&V09CCR#sHlFtx8CP7 zW$#zk@ZA=^;UJ#Zc;U4FCM>f%yPWW0QTR*4Z*V>XJQ>+=j8WC1{`uRYc<3|OAxq!Q z07?o9Xc0Zkl2TG>bKC_k@#EIu!@6;)!H``9224LpvI>cpmtIf}wph1UCrMJ?Uqt0z zsiyt%VXJ>tL$ zH%uTMS9LjZ{-Ck%oW|0W!JuX@|4!Jv(*+%YJWkitsz0B3{Kk^t`l}|#PK5?`&QK{A zb>q&=4mdSju5-ljIf_5pt{BNh`M^rRNuk(ER_9o5?xVu0fB0=39n*1S-}EIV#C}PX zg_*NV3J0k$G3)hX`VR%#afkMazW%9zs+1wwDcC~()s^?DJ7WNe#w9MoDNOR!2|;jQ z3?rW$!`=Pv71L~9L1GtglKs<9)34^vw!Ml4pE6`xkigPs4qxP$(GlSDCm;^bwLT+e zwDN>SUvO+GiK8ypXwK7cuwq@GFp++YlV5rFufm&2DR2jCUlNNF>R`*)kAXeQ#+GLd zsfNy`wwpAQ>WJ(o)-(O>|4Lf&BLXGb!aawL0eLMxvA}O`OKgW>p7q6k#msLy=mv)= zB7TX;F{F?NSdZ#dlm`9;;g2o*O^AjNy*r*z#Vb&HG>ZU=S;3<>EljWvTB#i*CWZO! z9kgrlwMN(ZaxbJAjuwCk(u9K*=+eUA%#pplJ-x&9nYDdSLE+nfbe5e_z)M!Hou9bp zNlY&e@9$Ry=irK#XDc%^kt%VIVjqxW9$}H-z@pdViLwz;(_o}<-Hpm$75+2mNv04cr>glxHXoe^8ZP8_|A%qWTk zJF#$D#RRoa(!z>$I@3vvmEYRLnoGUh@mdvFH?PHMx_AT{W%t$%xSq_PhM1 zY+`5WTKd!Lg7%C~=ApoF8GA4Jgy#Re`bs6Nw>bRe`ys&Rh)rJ z#z0AEJgarK`X$RC`d7jed}GMDAxD=vTlT*9W*uP*(A&Wfx}Llz3d@sP5d}3JgQ{ zO152a^ygKv1I?pd6+OiK?AUo;hM+qFzA>Aj>ZgLMnrV}H)v1b1;8cH@S|1a|bXhql zSS?EZ2foYz#zoWG;#Z|OlkyZHPOT$;{SH5UB3x6ZSJhM@fn#%UV>!C|&2t8RW@ic^ z`^R{lxgnfxrG#uX)c)lC`vTgZ3%!=UHu<4%{vD^7${~O9Ha7sXezBG;ui%*&@B`Gd z2Tz7MW9m?w%|I+RgN+gIDBdSoNA?BY?nzcExvu;BUktEp2KCxjB|(F*Vu1`ZL4)YD z{x6tXi2G$Rm>0$gddmqsbmKGi~&0;M(1o^+#~V-z8ptbGSr%HnDeXx(Qly8Ze^KR zeK!8K9lh4D;(jOPz;&&QQjHDsr`Ab+jZ4EAl|1S8lVxaX`)yX1pXAS8 zQoJ$eSj(LxJ7C0EESp*?qvy5U4d*~#^gY0-Y#Od@rQo;dq!^gh2AJ9>xJU?86)iu@|q^ZaDhSvKy%3a@lnMG{XO7b(m zL~KpW@852-@Wq+ERv7bbl%*Dv1INyfdVPPidA?$C(~y^n=Zlvw|NWN0yYM4ibxSP{ zr@nr%6eCuU@G)BD5b(MYr3vRnr_E;KVcdRh&12fJ1AUe($5!u<&BL~gsOscoOWC#3 z7gZP=m!?RH^82qaz(HdGreN%mm`;q;o~v^it`2r|lX;jyU)d>TpCDcoSZNThL5^w? zyI@VX;8Ct(f9dq#DRi^FkRY?xpN8)tF!~N&d|`i8jPtQN3xIN8IcdE`t;gk+yNlV1 zs)9ad59VzhfL|;ehDzj`qwR4u%~BZcrRoqZ;F%{&!W#d2ScpX}GR}T}=g&Rt_}3V< zm(Jwzx9jCLMry)cTAoHN4_e@0Fhv{D=+>5ilt-Hpv?-)>ZSfWLH+$VW>@;6u5R<-q zxTXFSpX{Lk<*g%Z!mZKSy-(4!Z4}Fi;ek#P&#vNUpK;nGKGLQ5Oh~VDmLc(x)6+^e zP2DHI$`lXv6E&mq#66g|y-KSRDVzzGugF|= z*Hu@t+2U7rMrc*)^XJ0%c9B(#w?nU*5Tl}|Ei$3N=h{YWOxwnH%VUyd5G)YX#*Ncd zMVQ=gS%&N@ool{v783leJt%bc7q|}<*>k#4JV>P z|Iv5A+lVT|yJi!XF-D!yN0`m8AuOQl+QWP?pJp&#AV;%l^eR+^dla zWudm$M-QWeMo+sqx(>|R@2r1*P%;P-6hf3d#!G#D(J6uwJ>TnWvcIyuWR&sCtTE(- jrN7wA8Cs0Y@j?Mi=LWYbTy)@k5(0UlqODx5XcO^2iLm^l From bb6ff349dabb73a15c517c0af2bee653ad41a6f5 Mon Sep 17 00:00:00 2001 From: FalseIncarnate Date: Sun, 23 Jul 2017 02:32:18 -0400 Subject: [PATCH 04/15] Fixing offset/layer for north state sinks --- code/game/objects/structures/watercloset.dm | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/code/game/objects/structures/watercloset.dm b/code/game/objects/structures/watercloset.dm index 92f5e75c6e9..400c38a7415 100644 --- a/code/game/objects/structures/watercloset.dm +++ b/code/game/objects/structures/watercloset.dm @@ -642,6 +642,7 @@ /obj/structure/sink/update_icon() ..() + layer = OBJ_LAYER if(!anchored) pixel_x = 0 pixel_y = 0 @@ -655,7 +656,9 @@ else //normal sinks if(dir == NORTH || dir == SOUTH) pixel_x = 0 - pixel_y = (dir == NORTH) ? -30 : 30 + pixel_y = (dir == NORTH) ? -5 : 30 + if(dir == NORTH) + layer = FLY_LAYER else pixel_x = (dir == EAST) ? 12 : -12 pixel_y = 0 From 67c42ea2c0af8c0928626b8bd301d8399f4b4580 Mon Sep 17 00:00:00 2001 From: FalseIncarnate Date: Sun, 6 Aug 2017 21:29:42 -0400 Subject: [PATCH 05/15] Buildable toilets, urinals, sinks, mirrors Toilets, urinals, sinks, and mirrors are now buildable. Mirrors are also able to be unfastened from walls, shattered mirrors return a glass shard instead of a mirror item. --- code/game/objects/structures/mirror.dm | 66 ++++++++++--- code/game/objects/structures/watercloset.dm | 100 +++++++++++++++----- 2 files changed, 128 insertions(+), 38 deletions(-) diff --git a/code/game/objects/structures/mirror.dm b/code/game/objects/structures/mirror.dm index 83220bb6a33..6606bd5b1c7 100644 --- a/code/game/objects/structures/mirror.dm +++ b/code/game/objects/structures/mirror.dm @@ -9,8 +9,22 @@ var/shattered = 0 var/list/ui_users = list() -/obj/structure/mirror/attack_hand(mob/user as mob) - if(shattered) return +/obj/structure/mirror/New(turf/T, newdir = SOUTH, building = FALSE) + ..() + if(building) + switch(newdir) + if(NORTH) + pixel_y = -32 + if(SOUTH) + pixel_y = 32 + if(EAST) + pixel_x = -32 + if(WEST) + pixel_x = 32 + +/obj/structure/mirror/attack_hand(mob/user) + if(shattered) + return if(ishuman(user)) var/datum/nano_module/appearance_changer/AC = ui_users[user] @@ -22,14 +36,15 @@ AC.ui_interact(user) /obj/structure/mirror/proc/shatter() - if(shattered) return + if(shattered) + return shattered = 1 icon_state = "mirror_broke" playsound(src, "shatter", 70, 1) desc = "Oh no, seven years of bad luck!" -/obj/structure/mirror/bullet_act(var/obj/item/projectile/Proj) +/obj/structure/mirror/bullet_act(obj/item/projectile/Proj) if(prob(Proj.damage * 2)) if(!shattered) shatter() @@ -38,7 +53,19 @@ ..() -/obj/structure/mirror/attackby(obj/item/I as obj, mob/living/user as mob, params) +/obj/structure/mirror/attackby(obj/item/I, mob/living/user, params) + if(isscrewdriver(I)) + visible_message("[user] begins to unfasten the [src].", "You begin to unfasten the [name].") + if(do_after(user, 30 * I.toolspeed, target = src)) + if(shattered) + visible_message("[user] drops the broken shards to the floor.", "You drop the broken shards on the floor.") + new /obj/item/weapon/shard(get_turf(user)) + else + visible_message("[user] carefully places [src] on the floor.", "You carefully place [src] on the floor.") + new /obj/item/mounted/mirror(get_turf(user)) + qdel(src) + return + user.do_attack_animation(src) if(shattered) playsound(src.loc, 'sound/effects/hit_on_shattered_glass.ogg', 70, 1) @@ -52,8 +79,9 @@ playsound(src.loc, 'sound/effects/Glasshit.ogg', 70, 1) -/obj/structure/mirror/attack_alien(mob/living/user as mob) - if(islarva(user)) return +/obj/structure/mirror/attack_alien(mob/living/user) + if(islarva(user)) + return user.do_attack_animation(src) if(shattered) playsound(src.loc, 'sound/effects/hit_on_shattered_glass.ogg', 70, 1) @@ -62,10 +90,12 @@ shatter() -/obj/structure/mirror/attack_animal(mob/living/user as mob) - if(!isanimal(user)) return +/obj/structure/mirror/attack_animal(mob/living/user) + if(!isanimal(user)) + return var/mob/living/simple_animal/M = user - if(M.melee_damage_upper <= 0) return + if(M.melee_damage_upper <= 0) + return M.do_attack_animation(src) if(shattered) playsound(src.loc, 'sound/effects/hit_on_shattered_glass.ogg', 70, 1) @@ -74,7 +104,7 @@ shatter() -/obj/structure/mirror/attack_slime(mob/living/user as mob) +/obj/structure/mirror/attack_slime(mob/living/user) var/mob/living/carbon/slime/S = user if(!S.is_adult) return @@ -83,4 +113,16 @@ playsound(src.loc, 'sound/effects/hit_on_shattered_glass.ogg', 70, 1) return user.visible_message("[user] smashes [src]!") - shatter() \ No newline at end of file + shatter() + + +/obj/item/mounted/mirror + name = "mirror" + desc = "Some reflective glass ready to be hung on a wall. Don't break it!" + icon = 'icons/obj/watercloset.dmi' + icon_state = "mirror" + +/obj/item/mounted/mirror/do_build(turf/on_wall, mob/user) + var/obj/structure/mirror/M = new /obj/structure/mirror(get_turf(user), get_dir(on_wall, user), 1) + transfer_prints_to(M, TRUE) + qdel(src) \ No newline at end of file diff --git a/code/game/objects/structures/watercloset.dm b/code/game/objects/structures/watercloset.dm index 400c38a7415..f5bae8d95bd 100644 --- a/code/game/objects/structures/watercloset.dm +++ b/code/game/objects/structures/watercloset.dm @@ -492,32 +492,6 @@ return - -/obj/item/mounted/shower - name = "shower fixture" - desc = "A self-adhering shower fixture. Simply stick to a wall, no plumber needed!" - icon = 'icons/obj/watercloset.dmi' - icon_state = "shower" - item_state = "buildpipe" - -/obj/item/mounted/shower/try_build(turf/on_wall, mob/user, proximity_flag) - //overriding this because we don't care about other items on the wall, but still need to do adjacent checks - if(!on_wall || !user) - return - if(proximity_flag != 1) //if we aren't next to the wall - return - if(!(get_dir(on_wall,user) in cardinal)) - to_chat(user, "You need to be standing next to a wall to place \the [src].") - return - return 1 - -/obj/item/mounted/shower/do_build(turf/on_wall, mob/user) - var/obj/machinery/shower/S = new /obj/machinery/shower(get_turf(user), get_dir(on_wall, user), 1) - transfer_prints_to(S, TRUE) - qdel(src) - - - /obj/item/weapon/bikehorn/rubberducky name = "rubber ducky" desc = "Rubber ducky you're so fine, you make bathtime lots of fuuun. Rubber ducky I'm awfully fooooond of yooooouuuu~" //thanks doohl @@ -682,3 +656,77 @@ icon_state = "puddle-splash" ..() icon_state = "puddle" + + +////////////////////////////////// +// Bathroom Fixture Items // +////////////////////////////////// + + +/obj/item/mounted/shower + name = "shower fixture" + desc = "A self-adhering shower fixture. Simply stick to a wall, no plumber needed!" + icon = 'icons/obj/watercloset.dmi' + icon_state = "shower" + item_state = "buildpipe" + +/obj/item/mounted/shower/try_build(turf/on_wall, mob/user, proximity_flag) + //overriding this because we don't care about other items on the wall, but still need to do adjacent checks + if(!on_wall || !user) + return + if(proximity_flag != 1) //if we aren't next to the wall + return + if(!(get_dir(on_wall,user) in cardinal)) + to_chat(user, "You need to be standing next to a wall to place \the [src].") + return + return 1 + +/obj/item/mounted/shower/do_build(turf/on_wall, mob/user) + var/obj/machinery/shower/S = new /obj/machinery/shower(get_turf(user), get_dir(on_wall, user), 1) + transfer_prints_to(S, TRUE) + qdel(src) + + +/obj/item/weapon/bathroom_parts + name = "toilet in a box" + desc = "An entire toilet in a box, straight from Space Sweden. It has an unpronounceable name." + icon = 'icons/obj/storage.dmi' + icon_state = "largebox" + w_class = WEIGHT_CLASS_BULKY + var/result = /obj/structure/toilet + var/result_name = "toilet" + +/obj/item/weapon/bathroom_parts/urinal + name = "urinal in a box" + result = /obj/structure/urinal + result_name = "urinal" + +/obj/item/weapon/bathroom_parts/sink + name = "sink in a box" + result = /obj/structure/sink + result_name = "sink" + +/obj/item/weapon/bathroom_parts/New() + ..() + desc = "An entire [result_name] in a box, straight from Space Sweden. It has an [pick("unpronounceable", "overly accented", "entirely gibberish", "oddly normal-sounding")] name." + +/obj/item/weapon/bathroom_parts/attack_self(mob/user) + var/turf/T = get_turf(user) + if(!T) + to_chat(user, "You can't build that here!") + return + if(result in T.contents) + to_chat(user, "There's already \an [result_name] here.") + return + visible_message("[user] begins assembling a new [result_name].", "You begin assembling a new [result_name].") + if(do_after(user, 30, target = user)) + visible_message("[user] finishes building a new [result_name]!", "You finish building a new [result_name]!") + var/obj/structure/S = new result(T) + S.anchored = 0 + S.dir = user.dir + S.update_icon() + user.unEquip(src, 1) + qdel(src) + if(prob(50)) + new /obj/item/stack/sheet/cardboard(T) + From 3ea892b8130000ac813291804468d76a6bb6a383 Mon Sep 17 00:00:00 2001 From: FalseIncarnate Date: Sun, 6 Aug 2017 21:31:18 -0400 Subject: [PATCH 06/15] Orderable bathroom fixtures and autolathe mirrors Adds two new crates to supply ordering: Urination Station Crate, contains one toilet in a box and one urinal in a box. Costs 10 points. Hygeine Station Crate, contains one sink in a box and one shower fixture. Costs 10 points. Mirrors can now be produced in an autolathe from glass. --- code/datums/supplypacks.dm | 20 +++++++++++++++++++ .../research/designs/autolathe_designs.dm | 11 +++++++++- 2 files changed, 30 insertions(+), 1 deletion(-) diff --git a/code/datums/supplypacks.dm b/code/datums/supplypacks.dm index 739844051f6..e14d591428c 100644 --- a/code/datums/supplypacks.dm +++ b/code/datums/supplypacks.dm @@ -1646,6 +1646,26 @@ var/list/all_supply_groups = list(supply_emergency,supply_security,supply_engine ) containername = "shield control board crate" +///////////// Bathroom Fixtures + +/datum/supply_packs/misc/toilet + name = "Urination Station Crate" + cost = 10 + contains = list( + /obj/item/weapon/bathroom_parts, + /obj/item/weapon/bathroom_parts/urinal + ) + containername = "urination station crate" + +/datum/supply_packs/misc/hygiene + name = "Hygiene Station Crate" + cost = 10 + contains = list( + /obj/item/weapon/bathroom_parts/sink, + /obj/item/mounted/shower + ) + containername = "hygiene station crate" + ////////////////////////////////////////////////////////////////////////////// //////////////////////////// Vending ///////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////// diff --git a/code/modules/research/designs/autolathe_designs.dm b/code/modules/research/designs/autolathe_designs.dm index 99d4fa8fe22..111e43dce32 100644 --- a/code/modules/research/designs/autolathe_designs.dm +++ b/code/modules/research/designs/autolathe_designs.dm @@ -855,4 +855,13 @@ build_type = AUTOLATHE materials = list(MAT_GLASS = 750, MAT_METAL = 250) build_path = /obj/item/weapon/circuitboard/vendor - category = list("initial", "Electronics") \ No newline at end of file + category = list("initial", "Electronics") + +/datum/design/mirror + name = "mirror" + desc = "A mountable mirror." + id = "mirror" + build_type = AUTOLATHE + materials = list(MAT_GLASS = 2500) //1.25 glass sheets, broken mirrors will return a shard (1 sheet) + build_path = /obj/item/mounted/mirror + category = list("initial", "Miscellaneous") \ No newline at end of file From 438f4d33eedd44540b458530f9cf3e4f3368ca49 Mon Sep 17 00:00:00 2001 From: FalseIncarnate Date: Mon, 7 Aug 2017 22:19:37 -0400 Subject: [PATCH 07/15] Fixes cargo point exploit with watertank crate --- code/datums/supplypacks.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/datums/supplypacks.dm b/code/datums/supplypacks.dm index e14d591428c..50c141a1d4b 100644 --- a/code/datums/supplypacks.dm +++ b/code/datums/supplypacks.dm @@ -1248,7 +1248,7 @@ var/list/all_supply_groups = list(supply_emergency,supply_security,supply_engine /datum/supply_packs/misc/watertank name = "Water Tank Crate" contains = list(/obj/structure/reagent_dispensers/watertank) - cost = 6 + cost = 8 containertype = /obj/structure/largecrate containername = "water tank crate" From 1aecac849b7aa509220f9abb5c62d763badb3fcd Mon Sep 17 00:00:00 2001 From: FalseIncarnate Date: Sat, 19 Aug 2017 01:30:15 -0400 Subject: [PATCH 08/15] Code cleanup, spans, tenses Cleans up code for toilets and sinks attackby wrench interactions to be generally better and also include cancel options. Rotation and movement is now based on a var rather than the istype checks for sinks Fixes spans and tenses for visible messages Also changed a qdel to QDELL_NULL --- code/game/objects/structures/watercloset.dm | 142 +++++++++++--------- 1 file changed, 79 insertions(+), 63 deletions(-) diff --git a/code/game/objects/structures/watercloset.dm b/code/game/objects/structures/watercloset.dm index f5bae8d95bd..b8ce6abd543 100644 --- a/code/game/objects/structures/watercloset.dm +++ b/code/game/objects/structures/watercloset.dm @@ -64,44 +64,43 @@ /obj/structure/toilet/attackby(obj/item/I, mob/living/user, params) if(iswrench(I)) + var/choices = list() + if(cistern) + choices += "Stash" if(anchored) - var/response = "Disconnect" - if(cistern) - response = alert(user, "Do you want to stash [I] or disconnect [src]?", "Wrench", "Stash", "Disconnect", "Cancel") - if(response == "Stash") + choices += "Disconnect" + else + choices += "Connect" + choices += "Rotate" + + var/response = input(user, "What do you want to do?", "[src]") as null|anything in choices + if(!Adjacent(user) || !response) //moved away or cancelled + return + switch(response) + if("Stash") stash_goods(I, user) - else if(response == "Disconnect") - user.visible_message("[user] begins disconnecting [src]...", "You begin disconnecting [src]...") + if("Disconnect") + user.visible_message("[user] is disconnecting [src].", "You are disconnecting [src]...") if(do_after(user, 40 * I.toolspeed, target = src)) if(!loc || !anchored) return - user.visible_message("[user] disconnected [src]!", "You disconnected [src]!") + user.visible_message("[user] disconnects [src]!", "You disconnect [src]!") anchored = 0 - return - else - var/response = "Connect" - if(cistern) - response = alert(user, "Do you want to stash [I], rotate / connect [src]?", "Wrench", "Stash", "Rotate or Connect", "Cancel") - if(response == "Stash") - stash_goods(I, user) - return - if(response == "Cancel") - return - response = alert(user, "Do you want to rotate or connect [src]?", "Wrench", "Rotate", "Connect", "Cancel") - if(response == "Rotate") - var/list/choices = list("North" = NORTH, "East" = EAST, "South" = SOUTH, "West" = WEST) - var/selected = input(user,"Select a direction for the connector.", "Connector Direction") in choices - dir = choices[selected] - update_icon() //is this necessary? probably not - else if(response == "Connect") - user.visible_message("[user] is connecting [src].", "You are connecting [src]...") + update_icon() + if("Connect") + user.visible_message("[user] is connecting [src].", "You are connecting [src]...") if(do_after(user, 40 * I.toolspeed, target = src)) if(!loc || anchored) return - user.visible_message("[user] connected [src]!", "You connected [src]!") + user.visible_message("[user] connects [src]!", "You connect [src]!") anchored = 1 update_icon() - return + if("Rotate") + var/list/dir_choices = list("North" = NORTH, "East" = EAST, "South" = SOUTH, "West" = WEST) + var/selected = input(user,"Select a direction for the connector.", "Connector Direction") in dir_choices + dir = dir_choices[selected] + update_icon() //is this necessary? probably not + return if(istype(I, /obj/item/weapon/crowbar)) to_chat(user, "You start to [cistern ? "replace the lid on the cistern" : "lift the lid off the cistern"]...") @@ -199,20 +198,20 @@ /obj/structure/urinal/attackby(obj/item/I, mob/user, params) if(iswrench(I)) if(anchored) - user.visible_message("[user] begins disconnecting [src]...", "You begin to disconnect [src]...") + user.visible_message("[user] begins disconnecting [src]...", "You begin to disconnect [src]...") if(do_after(user, 40 * I.toolspeed, target = src)) if(!loc || !anchored) return - user.visible_message("[user] disconnected [src]!", "You disconnected [src]!") + user.visible_message("[user] disconnects [src]!", "You disconnect [src]!") anchored = 0 pixel_x = 0 pixel_y = 0 else - user.visible_message("[user] begins connecting [src]...", "You begin to connect [src]...") + user.visible_message("[user] begins connecting [src]...", "You begin to connect [src]...") if(do_after(user, 40 * I.toolspeed, target = src)) if(!loc || anchored) return - user.visible_message("[user] connected [src]!", "You connected [src]!") + user.visible_message("[user] connects [src]!", "You connect [src]!") anchored = 1 pixel_x = 0 pixel_y = 32 @@ -266,7 +265,7 @@ /obj/machinery/shower/Destroy() if(mymist) - qdel(mymist) + QDEL_NULL(mymist) return ..() //add heat controls? when emagged, you can freeze to death in it? @@ -312,7 +311,7 @@ return var/obj/item/weapon/weldingtool/WT = I if(WT.isOn()) - user.visible_message("[user] begins to cut [src] loose.", "You begin to cut [src] loose.") + user.visible_message("[user] begins to cut [src] loose.", "You begin to cut [src] loose.") if(do_after(user, 40 * WT.toolspeed, target = src)) if(!src || !WT.remove_fuel(0, user)) return @@ -321,7 +320,7 @@ if(mymist) qdel(mymist) ismist = 0 - user.visible_message("[user] cuts [src] loose!", "You cut [src] loose!") + user.visible_message("[user] cuts [src] loose!", "You cut [src] loose!") var/obj/item/mounted/shower/S = new /obj/item/mounted/shower(get_turf(user)) transfer_prints_to(S, TRUE) qdel(src) @@ -330,7 +329,7 @@ if(on) I.water_act(100, convertHeat(), src) -/obj/machinery/shower/update_icon() //this is terribly unreadable, but basically it makes the shower mist up +/obj/machinery/shower/update_icon() //this makes the shower mist up or clear mist (depending on water temperature) overlays.Cut() //once it's been on for a while, in addition to handling the water overlay. if(on) overlays += image('icons/obj/watercloset.dmi', src, "water", MOB_LAYER + 1, dir) @@ -510,6 +509,8 @@ desc = "A sink used for washing one's hands and face." anchored = 1 var/busy = 0 //Something's being washed at the moment + var/can_move = 1 //if the sink can be disconnected and moved + var/can_rotate = 1 //if the sink can be rotated to face alternate directions /obj/structure/sink/attack_hand(mob/user as mob) if(!user || !istype(user)) @@ -519,7 +520,7 @@ if(!Adjacent(user)) return if(!anchored) - to_chat(user, "This [src] isn't connected, wrench it into position first!") + to_chat(user, "[src] isn't connected, wrench it into position first!") return if(ishuman(user)) var/mob/living/carbon/human/H = user @@ -567,44 +568,56 @@ if(!(istype(O))) return - if(iswrench(O) && !istype(src, /obj/structure/sink/puddle)) //puddles laugh at your attempt to disconnect them. you can't remove a puddle from the ground with a wrench! + + if(iswrench(O)) var/obj/item/weapon/wrench/W = O + + var/choices = list() if(anchored) - var/response = alert(user, "Would you like to wash [W] or disconnect [src]?", "Wrench", "Wash", "Disconnect") - if(response == "Disconnect") - user.visible_message("[user] is disconnecting [src].", "You are disconnecting [src]...") - if(do_after(user, 40 * W.toolspeed, target = src)) + choices += "Wash" + if(can_move) + choices += "Disconnect" + else + choices += "Connect" + if(can_rotate) + choices += "Rotate" + + var/response = input(user, "What do you want to do?", "[src]") as null|anything in choices + if(!Adjacent(user) || !response) //moved away or cancelled + return + switch(response) + if("Wash") + busy = 1 + var/wateract = 0 + wateract = (W.wash(user, src)) + busy = 0 + if(wateract) + W.water_act(20,310.15,src) + if("Disconnect") + user.visible_message("[user] is disconnecting [src].", "You are disconnecting [src]...") + if(do_after(user, 40 * O.toolspeed, target = src)) if(!loc || !anchored) return - user.visible_message("[user] disconnected [src]!", "You disconnected [src]!") + user.visible_message("[user] disconnects [src]!", "You disconnect [src]!") anchored = 0 update_icon() - return - else if(response == "Cancel") - return - else - var/response - if(istype(src, /obj/structure/sink/kitchen)) - response = "Connect" //Kitchen sinks can't be rotated because they only have one directional state (SOUTH) - else - response = alert(user, "Would you like to rotate or connect [src]?", "Wrench", "Rotate", "Connect", "Cancel") - if(response == "Connect") - user.visible_message("[user] is connecting [src].", "You are connecting [src]...") - if(do_after(user, 40 * W.toolspeed, target = src)) + if("Connect") + user.visible_message("[user] is connecting [src].", "You are connecting [src]...") + if(do_after(user, 40 * O.toolspeed, target = src)) if(!loc || anchored) return - user.visible_message("[user] connected [src]!", "You connected [src]!") + user.visible_message("[user] connects [src]!", "You connect [src]!") anchored = 1 update_icon() - else if(response == "Rotate") - var/list/choices = list("North" = NORTH, "East" = EAST, "South" = SOUTH, "West" = WEST) - var/selected = input(user,"Select a direction for the connector.", "Connector Direction") in choices - dir = choices[selected] + if("Rotate") + var/list/dir_choices = list("North" = NORTH, "East" = EAST, "South" = SOUTH, "West" = WEST) + var/selected = input(user,"Select a direction for the connector.", "Connector Direction") in dir_choices + dir = dir_choices[selected] update_icon() //is this necessary? probably not - return + return if(!anchored) - to_chat(user, "This [src] isn't connected, wrench it into position first!") + to_chat(user, "[src] isn't connected, wrench it into position first!") return busy = 1 @@ -641,11 +654,14 @@ /obj/structure/sink/kitchen name = "kitchen sink" icon_state = "sink_alt" + can_rotate = 0 /obj/structure/sink/puddle //splishy splashy ^_^ name = "puddle" icon_state = "puddle" + can_move = 0 + can_rotate = 0 /obj/structure/sink/puddle/attack_hand(mob/M as mob) icon_state = "puddle-splash" @@ -677,7 +693,7 @@ if(proximity_flag != 1) //if we aren't next to the wall return if(!(get_dir(on_wall,user) in cardinal)) - to_chat(user, "You need to be standing next to a wall to place \the [src].") + to_chat(user, "You need to be standing next to a wall to place \the [src].") return return 1 @@ -720,7 +736,7 @@ return visible_message("[user] begins assembling a new [result_name].", "You begin assembling a new [result_name].") if(do_after(user, 30, target = user)) - visible_message("[user] finishes building a new [result_name]!", "You finish building a new [result_name]!") + visible_message("[user] finishes building a new [result_name]!", "You finish building a new [result_name]!") var/obj/structure/S = new result(T) S.anchored = 0 S.dir = user.dir From 676937a1cb19da8f6af8f9e68a47ee764f7ad211 Mon Sep 17 00:00:00 2001 From: FalseIncarnate Date: Sat, 19 Aug 2017 01:33:23 -0400 Subject: [PATCH 09/15] Mountables "rose" span removal Removes the rose class from spans in mountables code. More occurances of this ancient span class have been unearthed and will be handled in a separate PR since that'd end up being unnecessary bloat in this PR, plus some of those cases need some fixing anyways (span without /span) --- code/game/objects/items/mountable_frames/apc_frame.dm | 4 ++-- code/game/objects/items/mountable_frames/frames.dm | 4 ++-- code/game/objects/items/mountable_frames/mountables.dm | 4 ++-- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/code/game/objects/items/mountable_frames/apc_frame.dm b/code/game/objects/items/mountable_frames/apc_frame.dm index 11542cdd94c..fbdab5584f1 100644 --- a/code/game/objects/items/mountable_frames/apc_frame.dm +++ b/code/game/objects/items/mountable_frames/apc_frame.dm @@ -10,11 +10,11 @@ var/turf/turf_loc = get_turf(user) var/area/area_loc = turf_loc.loc if(area_loc.get_apc()) - to_chat(user, "This area already has an APC.") + to_chat(user, "This area already has an APC.") return //only one APC per area for(var/obj/machinery/power/terminal/T in turf_loc) if(T.master) - to_chat(user, "There is another network terminal here.") + to_chat(user, "There is another network terminal here.") return else var/obj/item/stack/cable_coil/C = new /obj/item/stack/cable_coil(turf_loc) diff --git a/code/game/objects/items/mountable_frames/frames.dm b/code/game/objects/items/mountable_frames/frames.dm index 0bc5a8f9be6..2bcbea8cbee 100644 --- a/code/game/objects/items/mountable_frames/frames.dm +++ b/code/game/objects/items/mountable_frames/frames.dm @@ -20,11 +20,11 @@ var/turf/turf_loc = get_turf(user) if(src.mount_reqs.Find("simfloor") && !istype(turf_loc, /turf/simulated/floor)) - to_chat(user, "[src] cannot be placed on this spot.") + to_chat(user, "[src] cannot be placed on this spot.") return if(src.mount_reqs.Find("nospace")) var/area/my_area = turf_loc.loc if(!istype(my_area) || (my_area.requires_power == 0 || istype(my_area,/area/space))) - to_chat(user, "[src] cannot be placed in this area.") + to_chat(user, "[src] cannot be placed in this area.") return return 1 diff --git a/code/game/objects/items/mountable_frames/mountables.dm b/code/game/objects/items/mountable_frames/mountables.dm index 1b720712fa9..7120f8c880d 100644 --- a/code/game/objects/items/mountable_frames/mountables.dm +++ b/code/game/objects/items/mountable_frames/mountables.dm @@ -21,11 +21,11 @@ if(proximity_flag != 1) //if we aren't next to the wall return if(!( get_dir(on_wall,user) in cardinal)) - to_chat(user, "You need to be standing next to a wall to place \the [src].") + to_chat(user, "You need to be standing next to a wall to place \the [src].") return if(gotwallitem(get_turf(user), get_dir(on_wall,user))) - to_chat(user, "There's already an item on this wall!") + to_chat(user, "There's already an item on this wall!") return return 1 From 76b8d3dcae406a02d4ec5bd3c260802e83b46f08 Mon Sep 17 00:00:00 2001 From: FalseIncarnate Date: Sat, 19 Aug 2017 01:42:44 -0400 Subject: [PATCH 10/15] two more cleanups missed these in the last cleanup commit --- code/game/objects/structures/watercloset.dm | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/code/game/objects/structures/watercloset.dm b/code/game/objects/structures/watercloset.dm index b8ce6abd543..0d56c8376c6 100644 --- a/code/game/objects/structures/watercloset.dm +++ b/code/game/objects/structures/watercloset.dm @@ -634,13 +634,14 @@ pixel_x = 0 pixel_y = 0 else - if(istype(src, /obj/structure/sink/puddle)) + //the following code will probably want to be updated in the future to be less reliant on hardcoded offsets based on the can_move/can_rotate values + if(!can_move) //puddles return - if(istype(src, /obj/structure/sink/kitchen)) + if(!can_rotate) //kitchen sinks pixel_x = 0 pixel_y = 28 return - else //normal sinks + else //normal sinks if(dir == NORTH || dir == SOUTH) pixel_x = 0 pixel_y = (dir == NORTH) ? -5 : 30 @@ -734,7 +735,7 @@ if(result in T.contents) to_chat(user, "There's already \an [result_name] here.") return - visible_message("[user] begins assembling a new [result_name].", "You begin assembling a new [result_name].") + visible_message("[user] begins assembling a new [result_name].", "You begin assembling a new [result_name].") if(do_after(user, 30, target = user)) visible_message("[user] finishes building a new [result_name]!", "You finish building a new [result_name]!") var/obj/structure/S = new result(T) From 7a19c938623721f7e5c172acf9d3ef0fc7c7d7e1 Mon Sep 17 00:00:00 2001 From: FalseIncarnate Date: Sat, 19 Aug 2017 18:37:09 -0400 Subject: [PATCH 11/15] More tense/spans cleanup --- code/game/objects/structures/mirror.dm | 6 +++--- code/game/objects/structures/watercloset.dm | 14 +++++++------- 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/code/game/objects/structures/mirror.dm b/code/game/objects/structures/mirror.dm index 6606bd5b1c7..b6162bf8f45 100644 --- a/code/game/objects/structures/mirror.dm +++ b/code/game/objects/structures/mirror.dm @@ -55,13 +55,13 @@ /obj/structure/mirror/attackby(obj/item/I, mob/living/user, params) if(isscrewdriver(I)) - visible_message("[user] begins to unfasten the [src].", "You begin to unfasten the [name].") + visible_message("[user] begins to unfasten the [src].", "You begin to unfasten the [name].") if(do_after(user, 30 * I.toolspeed, target = src)) if(shattered) - visible_message("[user] drops the broken shards to the floor.", "You drop the broken shards on the floor.") + visible_message("[user] drops the broken shards to the floor.", "You drop the broken shards on the floor.") new /obj/item/weapon/shard(get_turf(user)) else - visible_message("[user] carefully places [src] on the floor.", "You carefully place [src] on the floor.") + visible_message("[user] carefully places [src] on the floor.", "You carefully place [src] on the floor.") new /obj/item/mounted/mirror(get_turf(user)) qdel(src) return diff --git a/code/game/objects/structures/watercloset.dm b/code/game/objects/structures/watercloset.dm index 0d56c8376c6..8266daa684d 100644 --- a/code/game/objects/structures/watercloset.dm +++ b/code/game/objects/structures/watercloset.dm @@ -80,7 +80,7 @@ if("Stash") stash_goods(I, user) if("Disconnect") - user.visible_message("[user] is disconnecting [src].", "You are disconnecting [src]...") + user.visible_message("[user] starts disconnecting [src].", "You begin disconnecting [src]...") if(do_after(user, 40 * I.toolspeed, target = src)) if(!loc || !anchored) return @@ -88,7 +88,7 @@ anchored = 0 update_icon() if("Connect") - user.visible_message("[user] is connecting [src].", "You are connecting [src]...") + user.visible_message("[user] starts connecting [src].", "You begin connecting [src]...") if(do_after(user, 40 * I.toolspeed, target = src)) if(!loc || anchored) return @@ -117,7 +117,7 @@ var/obj/item/weapon/reagent_containers/RG = I if(RG.is_open_container()) if(RG.reagents.total_volume >= RG.volume) - to_chat(user, "\The [RG] is full.") + to_chat(user, "[RG] is full.") else RG.reagents.add_reagent("toiletwater", min(RG.volume - RG.reagents.total_volume, RG.amount_per_transfer_from_this)) to_chat(user, "You fill [RG] from [src]. Gross.") @@ -168,7 +168,7 @@ to_chat(user, "The cistern is full!") return if(!user.drop_item()) - to_chat(user, "\The [I] is stuck to your hand, you cannot put it in the cistern!") + to_chat(user, "[I] is stuck to your hand, you cannot put it in the cistern!") return I.loc = src w_items += I.w_class @@ -538,7 +538,7 @@ var/washing_face = 0 if(selected_area in list("head", "mouth", "eyes")) washing_face = 1 - user.visible_message("[user] start washing their [washing_face ? "face" : "hands"]...", \ + user.visible_message("[user] starts washing their [washing_face ? "face" : "hands"]...", \ "You start washing your [washing_face ? "face" : "hands"]...") busy = 1 @@ -594,7 +594,7 @@ if(wateract) W.water_act(20,310.15,src) if("Disconnect") - user.visible_message("[user] is disconnecting [src].", "You are disconnecting [src]...") + user.visible_message("[user] starts disconnecting [src].", "You begin disconnecting [src]...") if(do_after(user, 40 * O.toolspeed, target = src)) if(!loc || !anchored) return @@ -602,7 +602,7 @@ anchored = 0 update_icon() if("Connect") - user.visible_message("[user] is connecting [src].", "You are connecting [src]...") + user.visible_message("[user] starts connecting [src].", "You begin connecting [src]...") if(do_after(user, 40 * O.toolspeed, target = src)) if(!loc || anchored) return From 736c549f860db3d033b3f27513365ae44e28c107 Mon Sep 17 00:00:00 2001 From: FalseIncarnate Date: Tue, 12 Sep 2017 21:00:19 -0400 Subject: [PATCH 12/15] Shower tweak Showers no longer will apply water whenever check_heat is called, and will now attempt to wash you while you remain under them during their process() call (33% chance per process per mob) --- code/game/objects/structures/watercloset.dm | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/code/game/objects/structures/watercloset.dm b/code/game/objects/structures/watercloset.dm index 8266daa684d..6844f27f475 100644 --- a/code/game/objects/structures/watercloset.dm +++ b/code/game/objects/structures/watercloset.dm @@ -470,13 +470,16 @@ qdel(E) /obj/machinery/shower/process() - if(!on || !mobpresent) return + if(!on || !mobpresent) + return for(var/mob/living/carbon/C in loc) + if(prob(33)) + wash(C) //re-applies water and re-cleans mob while they remain under the shower, 33% chance per process to avoid message spam/quick death check_heat(C) /obj/machinery/shower/proc/check_heat(mob/M as mob) - M.water_act(100, convertHeat(), src) //convenience - if(!on || watertemp == "normal") return + if(!on || watertemp == "normal") + return if(iscarbon(M)) var/mob/living/carbon/C = M From 03fcf6384ae55e3b4588f3fbb50ffc2dc33bb099 Mon Sep 17 00:00:00 2001 From: FalseIncarnate Date: Tue, 12 Sep 2017 22:47:44 -0400 Subject: [PATCH 13/15] Renamed the Urination Station Crate Now with 100% less rhyming: "Lavatory Crate" --- code/datums/supplypacks.dm | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/code/datums/supplypacks.dm b/code/datums/supplypacks.dm index 50c141a1d4b..263cfc081ed 100644 --- a/code/datums/supplypacks.dm +++ b/code/datums/supplypacks.dm @@ -1649,13 +1649,13 @@ var/list/all_supply_groups = list(supply_emergency,supply_security,supply_engine ///////////// Bathroom Fixtures /datum/supply_packs/misc/toilet - name = "Urination Station Crate" + name = "Lavatory Crate" cost = 10 contains = list( /obj/item/weapon/bathroom_parts, /obj/item/weapon/bathroom_parts/urinal ) - containername = "urination station crate" + containername = "lavatory crate" /datum/supply_packs/misc/hygiene name = "Hygiene Station Crate" From fca1a3f06773b4252b258778a908d4f28710d324 Mon Sep 17 00:00:00 2001 From: FalseIncarnate Date: Tue, 12 Sep 2017 23:06:01 -0400 Subject: [PATCH 14/15] visible message and styling tweaks --- code/game/objects/structures/mirror.dm | 6 +++--- code/game/objects/structures/watercloset.dm | 6 +++--- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/code/game/objects/structures/mirror.dm b/code/game/objects/structures/mirror.dm index b6162bf8f45..4dcccb2145d 100644 --- a/code/game/objects/structures/mirror.dm +++ b/code/game/objects/structures/mirror.dm @@ -55,13 +55,13 @@ /obj/structure/mirror/attackby(obj/item/I, mob/living/user, params) if(isscrewdriver(I)) - visible_message("[user] begins to unfasten the [src].", "You begin to unfasten the [name].") + user.visible_message("[user] begins to unfasten [src].", "You begin to unfasten [src].") if(do_after(user, 30 * I.toolspeed, target = src)) if(shattered) - visible_message("[user] drops the broken shards to the floor.", "You drop the broken shards on the floor.") + user.visible_message("[user] drops the broken shards to the floor.", "You drop the broken shards on the floor.") new /obj/item/weapon/shard(get_turf(user)) else - visible_message("[user] carefully places [src] on the floor.", "You carefully place [src] on the floor.") + user.visible_message("[user] carefully places [src] on the floor.", "You carefully place [src] on the floor.") new /obj/item/mounted/mirror(get_turf(user)) qdel(src) return diff --git a/code/game/objects/structures/watercloset.dm b/code/game/objects/structures/watercloset.dm index 6844f27f475..54784c7948f 100644 --- a/code/game/objects/structures/watercloset.dm +++ b/code/game/objects/structures/watercloset.dm @@ -614,7 +614,7 @@ update_icon() if("Rotate") var/list/dir_choices = list("North" = NORTH, "East" = EAST, "South" = SOUTH, "West" = WEST) - var/selected = input(user,"Select a direction for the connector.", "Connector Direction") in dir_choices + var/selected = input(user, "Select a direction for the connector.", "Connector Direction") in dir_choices dir = dir_choices[selected] update_icon() //is this necessary? probably not return @@ -696,7 +696,7 @@ return if(proximity_flag != 1) //if we aren't next to the wall return - if(!(get_dir(on_wall,user) in cardinal)) + if(!(get_dir(on_wall, user) in cardinal)) to_chat(user, "You need to be standing next to a wall to place \the [src].") return return 1 @@ -738,7 +738,7 @@ if(result in T.contents) to_chat(user, "There's already \an [result_name] here.") return - visible_message("[user] begins assembling a new [result_name].", "You begin assembling a new [result_name].") + user.visible_message("[user] begins assembling a new [result_name].", "You begin assembling a new [result_name].") if(do_after(user, 30, target = user)) visible_message("[user] finishes building a new [result_name]!", "You finish building a new [result_name]!") var/obj/structure/S = new result(T) From a60a4935ac350620ea0c9d2610325743f2d897f1 Mon Sep 17 00:00:00 2001 From: FalseIncarnate Date: Tue, 12 Sep 2017 23:14:07 -0400 Subject: [PATCH 15/15] one more visiblemessage --- code/game/objects/structures/watercloset.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/game/objects/structures/watercloset.dm b/code/game/objects/structures/watercloset.dm index 54784c7948f..b8e176ba12a 100644 --- a/code/game/objects/structures/watercloset.dm +++ b/code/game/objects/structures/watercloset.dm @@ -740,7 +740,7 @@ return user.visible_message("[user] begins assembling a new [result_name].", "You begin assembling a new [result_name].") if(do_after(user, 30, target = user)) - visible_message("[user] finishes building a new [result_name]!", "You finish building a new [result_name]!") + user.visible_message("[user] finishes building a new [result_name]!", "You finish building a new [result_name]!") var/obj/structure/S = new result(T) S.anchored = 0 S.dir = user.dir