From 99147003ed331ec963bc078868e134be871b1f1d Mon Sep 17 00:00:00 2001 From: Seris02 Date: Sun, 9 Feb 2020 13:07:04 +0800 Subject: [PATCH 001/113] wall walking boooooooooooooooots --- code/modules/clothing/shoes/miscellaneous.dm | 64 +++++++++++++++++++ icons/mob/feet.dmi | Bin 20692 -> 21180 bytes icons/mob/feet_digi.dmi | Bin 26894 -> 27423 bytes icons/obj/clothing/shoes.dmi | Bin 15636 -> 15994 bytes 4 files changed, 64 insertions(+) diff --git a/code/modules/clothing/shoes/miscellaneous.dm b/code/modules/clothing/shoes/miscellaneous.dm index c0e566cc0e..764197155e 100644 --- a/code/modules/clothing/shoes/miscellaneous.dm +++ b/code/modules/clothing/shoes/miscellaneous.dm @@ -365,3 +365,67 @@ name = "black cowboy boots" desc = "A pair of black cowboy boots, pretty easy to scuff up." icon_state = "cowboyboots_black" + +/obj/item/clothing/shoes/wallwalkers + name = "wall walking boots" + desc = "Contrary to popular belief, these do not allow you to walk on walls. Through bluespace magic stolen from an organisation that hoards technology, they simply allow you to slip through the atoms that make up anything, but only while walking, for safety reasons. As well as this, they unfortunately cause minor breath loss as the majority of atoms in your lungs are sucked out into any solid object you walk through. Make sure not to overuse them." + icon_state = "walkboots" + var/walkcool = 0 + var/wallcharges = 4 + //sparks, maybe oxydamage instead + +/obj/item/clothing/shoes/wallwalkers/equipped(mob/user,slot) + ..() + if (slot == SLOT_SHOES) + LAZYADD(user.user_movement_hooks,src) + else + LAZYREMOVE(user.user_movement_hooks,src) + +/obj/item/clothing/shoes/wallwalkers/dropped(mob/user) + ..() + LAZYREMOVE(user.user_movement_hooks,src) + +/obj/item/clothing/shoes/wallwalkers/attackby(obj/item/I, mob/user, params) + . = ..() //yes this is shamelessly copied + if(istype(I, /obj/item/stack/ore/bluespace_crystal)) + var/obj/item/stack/ore/bluespace_crystal/B = I + wallcharges += 1 + to_chat(user, "You tap the [src] with the [I].") + if(B.amount > 1) + B.amount -= 1 + else + qdel(I) + +/obj/item/clothing/shoes/wallwalkers/examine(mob/user) + . = ..() + . += "It has [wallcharges] charges left. Recharge with bluespace crystals." + +/obj/item/clothing/shoes/wallwalkers/intercept_user_move(dir,mob/living/m,newloc,oldloc) + if (walkcool < world.time && m.m_intent == MOVE_INTENT_WALK && wallcharges > 0) + walkcool = world.time + m.movement_delay() + var/issolid = FALSE + var/turf/K = newloc + if (istype(K)) + if (K.density) + issolid = TRUE + if (!issolid) + for (var/atom/T in newloc) //stuff on the new turf + if (!T.CanPass(m,newloc) && T != m) + issolid = TRUE + break + if (!issolid) + for (var/atom/T in oldloc) //directional shit on the old turf + if (!T.CanPass(m,newloc) && T != m) + issolid = TRUE + break + m.forceMove(newloc) + if (issolid) + m.adjustOxyLoss(rand(5,15)) + if (prob(10)) + m.adjustBruteLoss(rand(3,5)) + to_chat(m,"You feel as if travelling through the solid object left something behind and it hurts!") + var/datum/effect_system/spark_spread/s = new /datum/effect_system/spark_spread + s.set_up(5, 1, oldloc) + s.start() + flash_lighting_fx(3, 3, LIGHT_COLOR_ORANGE) + wallcharges-- \ No newline at end of file diff --git a/icons/mob/feet.dmi b/icons/mob/feet.dmi index 1a4b8019cd35886754837c6f52696bd774504fa4..2774976b26c08696d3940895dd55d7d3247bf052 100644 GIT binary patch delta 2679 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 delta 2187 zcmbW1c{J1u8^?cxNK8x!Q`a)rk}V>X{mr^Y%C z(5?|}r1k_X9-FTzdh^@~8OU3!hE~>L_sahj0@^4U#iULBIY%%fM^b^#G!g60iSC`E zum^@~gi42Fx)#H6$?|D7DVeIg=h(m~(Z;)j`q;*etZKFBvF+l%DN-8Aps-f3uDj1a zV!TFS{c`NgPu2Njg#}3{d|BBR?cxGd&PySpT2J>*Cjb4r641K|N>>CerzOiz&?NU&zy>jY8kdfy-~%%S_ge_1 z@6DnmgD&p2982b_F8_NKdwlaVQWEmrxy;aD<`Z|Jt(_3!A!O)KG)=M_Ki>r7f}3!i z%xhA+vd#xauxLm)1#&R2X8kl-(?li6L&S9Ig#hn#BENVBavGXnI|A2zJD{MTFohDr z(BbM>WU1_c`k8h&XiT`L;f9wkS|6bQYA;c=p7_}TJ&Td@ z4h#$&iCNlRro@NZh$sLmZ3kTKSk%ZQm9s!g@}crA)W}LfD;jQvjD5(5>Xt{E-Pd9h z{{ZxQ_wS5G&vw85_UnZzcuM^3^QrOi5TLKG4+!ZvD>xA3Kkd)P-*A|$t#Wlur00N& zHU>RntKmj(-AJ3+T0!rVmP5>mx5BR{MMDVrKmi^i0cW zJYTb?{f%5JzwFh6u~d#q@XLO-9eU$H(100sLTaE@Cvk=#dwR&e$Ix zCY7JutikngqA#mP3P)Ww@K0CGM%SC?p)`Gz(-Q_L6;tnA&WWD2AJ7Qej{-&0%P+lHOaJI?0i1ciMsD!{}HU-^_Dmi^#mm5 z=du;hH+;s~K!t}Gz6WmN<;jajBQq~?D7=PWIFTF+vPOBW7l-ao{XqYaj59`at9{}v z;-~TWGsy=;yNJm9hS=pLh58T{`@npq4^20$PX(s#H` zkjNENe*lNW#o(X-43;g_2$4Y`KFjI=NF>te1#cV%xZ{$JGpgd!#Yl%}Kz zVD~Jy;98|l_i3irt{%h9T(4LMB2#Sb!Vb7rX_pCKm;)mb2;YJx~QdmRaur_bjf>1HHQ0szi*WCs`dg|7j`K$V$9!<1^|Pfl@IrS zwwW}6YXX0~&MfHn*mPGECJuIF`zdB7cev@xF_~gV#F8%*+1$3dej-i+^@*x8*uBwY zThC%{rZffU`aQ<7;Dx6X34=1c^i~~cS&+n$LId3_U#Zu@aTKiXN?S{t=|kjBoo!a3 zdeT6xx8L-esk$A22pR*WWHJN( zn1jdXL^v<}d)Hc9PO7}RCEONA;mykg6#Y~@#UHw}E_}fQ8Rj0{W)bswoX{YCS`^#Fm9ac(QvGAD%nCVeR0tU1hQHgc$jlfPb>~u z{-*gnPURF5Ip0#tYa&=}NT*M&?%{OT? zU?O;U2h6BE73ONLgMXA4%^uM{@|2}bCXqIr0!yR~^pZwz)@gsa^q`pR5i!`=*y{!X za!1W5m`I?1FdR0Khvujd6`CCdnrRHQ|5eq>^9C%pl!O ztKvs9n>{fY%mB$U|GZ~R%-M>H3gBJ4BE$R05DP&I@bvUF-CJKj_mV=XTzMqOEkDq( zX1cVKf#let`~#qKE^Yt- diff --git a/icons/mob/feet_digi.dmi b/icons/mob/feet_digi.dmi index ddc5ff0c5f9999c5c14bdca347015b739974dcf4..79b25af58f728ab601a56a60c87fb4d5405abb65 100644 GIT binary patch delta 8448 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 delta 7306 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

HyLiM#vLZ~{a30(FP; z)3pGSylXnrhb51kT(R@celHYD&LN5(#(S9m&JDsfmuhQX{f6g zYcyD=Kl{#w$uj|%WV}G0;uQ%=QE_p0TU&a5J}uxENb8}4cPcaA&I*IMwXw2p-@a)7 zqnD1dlAMXt?W-rS^o?>4%^w9Pp%qI$4b70q`3(`XE{MW)SLCA2@3&hcnAMB7~QMd*|q98KqII_<)6 z((%5d0b0tfuTN-l*ga5JS2r~?6N#ZFVAL#x9-9a5{gZwC>-+zZgZx);{C94asVK+X z{&{z?E6u{f(xYCo@oH(2+x_zG;Najqbci>0@RNv$pK)Y>;KbQ81O}dcOx?RQeQ%EC z`iB|s0gv~;%bt1?-jTk2$CI~-2;>!RUd9js$hW-b0R)1?!psM;u&$(g%}|V^0C(<5 z(936aQHPC36+zwlv&jPeA-cJ?IoKlvmVjVE&~@no`R#ZOKXq@G$0B)KNyJ){OI2wb4DMsNHD``HFSd^+)gI*htgp9hu zb;}b@7?7>c5i8B@+~pX^IG<=vzslm>?31|4tR3RQ{brFe%%M(LKrYiC}vr z1k$-k| z#Ne@X@aP4+s?nG{%))u1j#5ZSM=?f#k@4sGxjix_k+7RvQ*(rNML}z8+WozIOl+*c z(GU|lIy!Y%SLd?WZ7&9kN+O<+{fDj9wmG|Q(aL-aPF}C@KW9!Gluja_4PTN%>Tt%?UtY<=DUY(KU<7bzg;gE3()F8Y@~)OrmqWyBtN4-09@4prs8k4 zSb^NVCiK0N_$O~ihu~>}+0#qYLx!^pAde|2rJ0QU_O(!qd}wHBU}$JFt!C`ooZs@n zztS!;1K4|cUM|XO^vjyaJ?X%Pb)@< zh9)rQh_oQq(bZM>O`7>f1eBnnh07p{Zsx+sqPnE;JY2bK`O=yC_M zdSsG6!J5)JVh{fXVv!zV5gW?MgM{m6Z(oyyrw%$RFSlRbI20V57h``2Dp;1ULGJ3A z4}K}1$Ww*V`pcl{&{zNz9(Hh~6AJOkcQZT~cZ`fm?`ebMs5Sa+x^6F+r{^wa<(1x+ zX?BN)89jccl45ejJLJz@_FQOq zxFIC*)*4H=}qCa z*7|Th%)8@dWyO$D3s5EK7#L12%XY!Jtv6it>(l*P)az%(@~dQ0F=S@G4*IJb(1dr# zSBvisPKcHkr*ANH{9GO^{X9fHVMxx2BN=!PJBd03p-g)O4al~C`?dAi|3OLJZ0hH? zuddS~$DIEBdWk+?Sl}nGblzN--y(=qo|W)cCR`0Z19+|O6B|Tx{|A;hOwJ&`K+Vu(9s9+e@T)1kU+1A=R1KvOezwEw3oUPwLU4uW$oGhv z9pa85;--D&Z!*j_D3U{$rn~gKsfCY3$0asaV^7KBsZ{ zoxq>$FMJ6CU{&hll7Xo;9qXI$0Moha!>9g4=#%FOX;J>K_!NUO@D1qCSSC|%PY*5$ z8P@P zN@tAPDoSB{My$w@iiz~n?IxEMK3m_~EjE-$$Fn|ZFmJ((KtPn@P!>r}c2qC;*y?t{ zPT>$w&@w9#8RkSmYn63FI8hov4YRYaW&@N>=OuF92s{xC1mUy;dlkFkI`aoPC#x$WzoY+wpN%{mUeEDF z!4EkH2#q4U^ZN@*7(&KfHOx|`-DEiP}pAM}o zFSr~40a!A9e>pKRQ3`N#!;CHASJ1hC$h^PA9Y98Q&Q}?Dc!C5XD9Ew3v?@!5$xpk) zG+D7cs8E+0MMipOw=_i@fc|{Pjok&aBWrki*IM_tx2|~j_>wX*j_+`GTg!`z-kA>i zWCw%RD(FGFw>(OwmIB$3waaTIYHAwpJy6w`N4KNUr9Dh;`_oMi4iL>X~=!fgAv0)P1GD*B25n=K3HY;j{bxc5wfVDrAi4#5!jderY}Zc~(@x8*+W`VD@LY_r-QDeGdbExT-XRwKgdPWF zLfk_u8~5;8k&tq9SOx<{|iArFo!XL#Pe#_W4A-0Txy!4B^e?ia#1e0+!qbK;8yrY-1NrK=*pkAzCZ^3C6pd?B$VG@~H);wPSMvMbedT zzVA0cJq@Oj&K)WJpcoSi2EZ`Z(CefWv8T7c<}m%FiDa4@GZ)2{e>054&)xR|Q)pld z_DBVnuK z{<9#xz6NM(?G8r>`%f___N{+m|3=<9ul;*dsQsgbGzOEP7sY7v-y;A6`R_We(h}HW za(b8c57`zg+Tmv*Oc1PjEU7S|Wo5E6SjdRT z{(h&Ywq4!bz%>=0OLu`G<jgn@k52+?wV1SRhX_)F<|r1R;t^=$2~nIJYs z+cHull`;C%+b}V?jkk}H=el`a;*;s%Heaq>L`k2M@ol{Z<^c3oe&k8DxzvaJzOWml zx`+Zkb$S$M)o&&ub!h6o-j^i%%JJ!Z(u#yeo_0MJ{OQ3U+0puJEbYq!TPk=z+m4i{ zG7+ahQ`%|51N(l5N-o&TgJ=E1%stX(o-gAnS5bm&i)po}&j-4Ni6TIB_N>wdW?W=L z(Zsk?CB9?;#E6##c{6+2h~Y%Z9+Nj6_s4FZU%873f{w1%3f-qy5#C*W-zaZCT@h7e zmH}nyls-)Fzvt@xIT>piUs?RBnd$eRSa4he`Rj*lJ4=MgDaAX>HEkXRE3)~0-)1@K zA&p4pC;dCMhkdgm&sl|nzJ|FfK2AU9Y0`Pd2>u%xeFFpLSF#7tYl@xCEED*fev!zC z2)&ah|HCDS+T;)tcB$4|ugmmk3&s$mrB!5Q3NLrO(R8yL*A?LxW)be&-LSD3({Uab!;K!}6zisJ)n7p~)I~WWmizTs#qx5VrG<5uM4I ziJsI4+HD(BVO1xyxBX)Io4Mr7%O(o6V8AboPL~zGdyYxYj%2Y9;z#T5?v5k z#fl|5k&e^=Nl*adshRbQe%lc#A%*cF$QniiZ;!KJm}uN zm`-*x(?Za2TWuG_OvxLx4|eXBcl7k5KWV=q2idVi3ryB+r(o#c?eS4v&=&AeH_>TH zTS~6QTGf&uv^p*&nq&7!P+tHm12lA4U&J1$WVVQUWovgHKz_1R0=`ws1Ok2P`U;H# zT0KgJ)6k!5OGI3ZHEIriyy9#2X z&g9gX;h*`GnK)Xb8XA*E6)nA!y$MW9(*zCO8hBefJ{kPe2F=8n^P*!x4X3qc`JX=9 zu?IEmxu&_YcZw}H*Zen==yDWk*uo`}Eg5qfW6Q;TLO!3lm##UPDW9({eEnJDeZrAk zoFG6cxITZK2*>tr{&BoYKdgQ_X{94&|Hh>;9J)f&-qkyZ?{0~(f(`!p*qAYyYiYj7 z8{%^!piU=iU!tPnWLql#WPddVuIr%VeLCyY%8n#S3{xiAs=YJkN_o7-P7$L0+b_kZ z-&}Shl=3adYp|M>himt>IB(0P=Fql0Wz0jSn-Onb1rdpYg}Er~)~k`S$-@$#edemU zh1EX3)SCDhBolW>T%XFnTvtmmQ zc9h<5HiHyLUBNLxk=vJVjIu(82%}Td^2sfD-MYy**tY*WpOIE4ZgkP6n4K7b^wGLq z{$zy#HoWPhLw0#qGPd@Ndqxdt`(-3wPk2IS_%b9dno186^FSrhWv{#HJg1{681p@v z*$3wQZTFAVGb)UE2w8n(TK~bV;(miMJO{%lo805bJ^Tr=*UO z5+PdFkH=!~7~J98+}c`?cJkf=x{$k~A2B}&s!@7M{;3WUBH{9>Hk@D6I;L{j2u}2m zTi9CHwRCGquf?wImz_QP75p!*5eMn{zp0$~e?V3K=bvpAqZ1S7wotNO5D@$b&UEx= z26amQrL*GzR@%bzhqoGLjvnb94%MlI99r;kd>UG!N}@)tm=Zf_d`v{uW^vsIpV z9-xNN)?fWA9dm205*GxNaa(K7VVcy2w(XxlQWlyRcFh_$2kk(VZ^}#r`p;53Ii_5m zUdR|Sv)j30aI8*?bJ=KWIS0^^h}2PPNblyYkSRx9EH2?u_8RX6vg9x|>dtNC2W`q7 zSt7X&@w=+IJPz4yS)$RKmg1S4QK%FSNukB@X1#{7qv!uK0czbp&>Ouj>u&2tDWat_zbXK$^PEE;=Od&igbJ~WGiKn z@>amocKR@(t!(N?T-*zgy}kXw;Nbo@9CRj46u3K)?~HWW@am;@xQ+uzs@kQ1UVL3X zJi}H?h0x7-?tm@hQi}W9`G|0}Qi=_F8t;Q;16&;Z_Y8C}rreCZl3tK%>cJE_ula24{5m_Y2e? z@cq1)vMwt{WS=HeXcL{*5~oX`4@XabNv#@_u>|9>3Z_UEyFy_bf=ie(55sK+JEkenXIRr?BLIbbZ!GMd~HEo=0 zW?@{-zs)uuC8)(rc17}*v@f=y^d~>HqIJ)__KkTMdI{D6D*OJOkgxIIa zFA>M_0M1G(I=PAK}i$DJl9+e&k)R})gFn(e1wl@39XmM3J(o~?I0Jt zJLbY!0-(U85uJI0p`q!9zN9C)rNQBafkec*R|wmH?cLj!zxDO@KBsFN-H@(lHtl~A zQe(vhlwRj+*$-amb;5ceoC8KaZK2j!9o|7}mYh>S-)P%wunVCt@D&_=njUA971sh( zM+h(o!U7ibJ1wimmluQhR`jbB)~03b^*;*Ri3&VXg%N%(Lfc?uyUVGLy@TXxbAq{` z2PrMk>nzfV1d-aWjnyKkKKjDF~vBaO@57S~4 zjgRQqEfe6$_T^Qiscm)B(HJGU(!aA zzz4xk&>H`CRo(tgdb$?2yGa4DOY_IChPkwoxIvE;*kf~(j&?e z7CTw5#@o6nl`{1}zLno6FfxtT0C6tm2?((&gpb3D}tXq*LYqY zFJim^CazgIL#UFUIkcK?g_t4eHM-7IVL`JPND)mX#$l%8bRpfz0ooj z+Xm3#h>5mWSKz9^~OSlF$&ovqYok)uS%WdymZlw zRdNz7b7WkNk}kdoa8&-d5;w@ zBFjmi^y6d-9!^zi06M(!;f0nnmLebfH_4B&lKUiK*lgmlR)WGYlnn2Fj$Be#vntNF zoY@F)`o*66Q6h-E{bHXR6GIh$V6Uo5L;w}wj=7RH38u#+eP8h`Jpfyv;Kp`M9~`SPpd%`DyQfaZp4e1sThcH? zI?eqQG@z2g^Px#_dnMglwP0yo+LHwd_tJe*F^1bK>H%pxE|uHdm@3O@>tLIN``I!Jr5c2+|^;L`x7UdRplSHNd zW)GUcN&_=Uq@rL}*J9^L!_(vOv(pQ{AO1>cA^G}C9x#G6IUhSMDwy}ZkkOevLpPy@ zWm&6Nm`#O=kMhRc9Uv4+V}D!LM(1_1VJepLBK+2zsl)&2So^BUH_>zj12jFm8k+(6 z^4PaNBd}7CgvgDS%wiBUeA5O)4kJyTOk0gmL%o5U!OiMPs;5v7~?!yCynBWW2fkIgO^YaUcl^WRpp z?pu;iX#cPY=+*HfnKJrsJFK75wWcLyGyU=yfu)wvYeG(=)lcA=vQn#YBjFqOUCBEng@KZ9?$rL? z-d21zf zEPC~}90V9<6iBleNq~im1Ll*Gsm7u`z*1c&e5z6f3#HcxFIL9Kg_X4gP6!}`m1k-# z=RRO#R?XvQh2jbj@{uFk>o+&)cursz`ncGJ>ho>p!7XvT&&!A&f1&ljlx+Wjz%i zuXQlVF*lb8{oX$kzTVUi2FJHzf#;)vbVmoOSED98FBB*b2 zT@dml-p1}DO>O~gY|M0UakKm3)r3i(-Q7+Ze~mii749Ch?!|!+`B3^<$TEiM`yeD> z!ky!0$zxB$1KPajWZUy?GNs)vb(46&NsEv4XwoiC}%B}c|cmcdv%VN+sJ~{a@r;}GN z?*^`OnDzh+`21XVrMXEag&i%&F0hzh{B&fJg2>+Hy@dJ=GxLYoSJD``s)1>LSC+wO zX>v*2&T@3sp}=9Y*71OI zdF#cQR+VFws9$e2h3HNzv!^IaiQCn+T~+Up&X;#k)^hJcB_6(>K4Wv*AN=$Y&_dE{ zd$VL2s5YJ38UKC-yxB;^z>$)F}Ah=P|dn`1=K>3jIH?Nue)(R1jwEulsU}2glY(vm4BK#R| z2A0XCDMoTKC*r_Jt%7#B$yT2&txOb#%j}$JLgvdifCA_3`}g)Oqp{@*T3WJpc2#p$ z?yuSlO)(V=BlwW_bnhKgji<;Ol&^n1KQLVXb0j`Wdh9MKGhskg!cK;)S|y9@t&HZc z$yf4&Q3s1?0Pu33j>9GX*l0gW$kHLwbA7e{wR(jP$+l_bPM03FGLpav0=Mbojhln& zx7S$lAj{Z^s_=oKHTB0-8xl7WP_$50}mSdMkJF$ofjF)QpQ!3`_D33hNf51f+s*5$!xR#!?Mh^mD%+EH&zj z0l$IX@qH~xS%9G`rc9`I%8ax9%zDEkrM9byjXavX)reiU4NLWxrvM0NwC(FmL1ulr zOM6*xh@g$--(hT4ByoS?y(owHdXiLjB``KsHMxq!6#MW&gsh;EF@;kCTrS!FIaC`t%vEYV}*Jw#pW{VJc2SQYRfu#fPhNbHQNax{|ed)Zf23Rldc* zKiR#ffqc}o98rQo(Ap~?@4lxpGJy@Lh*%t%Vb}@hvnGRbyoY?M#YSA7dyvehll6oX z=hJno_GhKyQEtR>6}vM&kUszRbb}d*kF*L9?crPeIj`7Cy%RnBn`OpC??}(QWV?+G z%l(7RCU`)}ePG2`|56V!tk-i^X{nWWI<4uyrf zr>qgI==jE^C&rWOHV78rXXm) zj_fOtCw|;EF)~UR`71c|`0|c~(>44g7X0wIt|!U$F=HaeIq@9!T+}hr8vf-+<0+}y zl1kr6FgEW_bH?}8P<^B;+2`0?PxDYNE$y+2a*T%{N|(3dl{+nD(~fyHcaOVHqxZ{8 z-or+T^5{~Yy{OmZoGi<_3N{Z_b0>GQiE|e>gCGL962<-&locHJuq64yKIXuslyaQ7<{boH(UM(VCXvM*J&Qzcta7t#?mqnTj zgpJsM_UU?`DwO^qrAM#`+g(5N>n3_TE$nhjFpdxv2|R9q*m(0Kk=tj$Q7cC#=@2XO zNSgwvRhtHdq0`YoA2wED6lX<(O~RDic0eihxDEdN9fJWbZ+b?#awY9xV_wQ(x|VbiOa$-(ywWKB17t`;0d@bH0@nW0Qvd7%N;5>+^wNk{(M$ zz|>DT3#)BY5acIptB*T|^y2@WxpDNMTVH7yBNOuJ6kr5ulefR}K6vfvB_3gDyUI=7 zA0qfsx&oUc%EYJoy0}!Di^i~zFDa)@fFX-yONjc`#!;6;b-+OTcc zJHRZ|&(rX}j%kP-Mv*!#xE3ab^jEl)L@u0iqew}$9#?1}DoC?FUiyS{?S z>2@NZtp^fnkGoCP>We=TD>}<1HES;Di65}yeW?s99bgW&q7UA#blSwbPaL^w9?Q4{ zO~=S+a9Jsc!GOUZvty#FGl4XP_5`#DQR!I09$|MYju#&WEjjV=$$}S_B_&k&@bGw{ ztrfkNefssMPaY@84B&X`n_A0?XWgiA{~VZ^ArY%l3_Yu?7d2X_ODaA>56Exd1#0t- zd}z0T-?U*Tk+rde@0$P_0TG+`n|G3u;Y7SiA(hOWJ{N8N5T_~RNu}6M^H&Av$9Usf zXx3sXvsl28FAAuXRa8oZAf;2^Ib$EzRg^U7@y3^3F&z?<_x4oZQ00V%guHq4hV^aL z5f1}RbeKdMtx#5A?6nF60bY<#*DbjOI{s8WPo^($zIrWQp6^iXf&-|HT;PAyExshFsYM^e$# z__2zzb))1~wpVAAzG$MJJq5oztY9v5uQau=LD@FsBEn=G9x6$wJznbs3uh*ko8R|1 zrZkl2)#)_*V`qiQ=9-T>Xx}X44Ev5s^4qNPH!S^5<%+DM@cCra`$a5eI`$DJWnhqV zZy;}In0xO~T;&A)wz3$43i%O|Ma_mkc&`+b9GdO(^0{AJvZT2&Z5<+tVoY+;9jUKe z0o9u~G0a{_kN274Yq^GsFe6;z=VCH4A2v3g@BQp96;1w?TpEXTtwJ=t!zxNnkvvXp@$xuDNC=cOu_gXIIz9McTvA3!PLGza0*MyGiH zJOQLPyXw;q-s3H#@+@3teGlcu_T3?B74ok6vv2$Bs&3Z5p6)X-_fa$dJ5ENw?H5hh zUT$h=-QsD1f->?Z5-7$s#F8=7+8>#DsMz8KcAOXmeCG#Fw?GIaQ;>EANh}(|LrzQFwAb0?4N>vqNQ5~lesme=e!%}b06(xQBgTxU3cQJFA(9J z?+o)eG+Jzki8Zvm${J+W-Rud)&McHZi9pCI8k|@eOqcNGW1EJNCm7}vW(%EOr+7!c@ zH61gavrqG;CT`OggND}TzbFuX|couZWBS334^oRX$d<)@RB*urrhwTpMu5s z;S)e0?XjmKHoscu|D)3U=;Y*-<}|C8BxB!po0LQZNFNJJN|bgHQc_YLu$CD9n4b)* zPsF7{qdY@-$vk|ipZDCPTot-T~B7ASALMMJh8B57?X$e*LVXxobf~ zXJgkJ=NCrgOf8D=-yldLlDzFC76*N1$s1!$vuM_Y$#sLrrFpH}Hx!>v>RJ*zDkEdG zT&u-)R+bhYP&mfL$D5_x0uyYNCN|ExUEoM)F$hfQ0!Pey$ECtc@wtX^4uP*U^r+N8 zi%Ve(N#^q&hOom0%awrd;CwM8kvg=pk{Q@P25bwYlcD%iO;M(L)gU%`8g8hFuU}}v zSp_U{zz>OQ)r3w55J4CjO>TYHN4oqy-A)Ki(!jz_vRJ?nH-KXi;P4T4WdMveMf;gT zjOGDrwe$LmzGJuk66|v_U-U1LT3`z6>qehUOyQz2@0r?G7`k?p3E?hNqr?%GCIcGHfKyt&u;%Bi&!X%bX&*ONvb}aid^2gP7zEW2#{BWChu>gN3cGGVftqp64PP zO2?PN^K}-9^3C74>DmQG-Bo=Skh+4U9Lc7C$qU*AM%T(bt#%c+GsG|oxV$aPcdnaJ z!ShjQhme*>w`c@g{ESY)MSL{|{-9bZtcbVR6t6;y*y(PRr6V+hgs_u?kyA#;JWng< zHEWF_?>=_6021Z|uRpceWWsVMNlZDCZ-MAg^AhIW-cx~y$lmVl!#~b?=W<)vLRAHm zl|vVVpJjDdvqD_RcTZHTe@?l+%?;lbXydhUsiu67=+?0^zeXY0>OCcCqW^tdraG8eA-$=I<61o9ZYU68Y13o+Vjv`{8)4`CGCH{{S}>5La@<8H7?@l{iU7 zRvwU!`BH}FoUrugKb`QxgIF||m3@L^4E>=}vTsTvLfgC4rR4ZT_9Z%()?x-iYOZe^ z_zPDj(-iiJ!`T9p`3_{uRf9QVP(RXtc*N9tB{2H_rc@d|Zi{+G!@l~9F=4E&f0`_K z^!_~3uJ4DAN7h!jb)Xf6-`D$N z!*GRuy|J;2q{x3+Ct_MmnvO|jdWOK!@Qc)1Nd}$eIg`ES>UPH=>o)Fs_B@zBN?2qI zlRvgJmgJn|`i1;Q!yc-{xE^iOD_6Q$D+|ANk9!=a;=bP)I#>%OtTU;{56zCEO^NVq zk+#$(LvB;zzzbR_;8oLsghv#dH;~!oN^cN>m_*?0Udo-t)E;azGQAj zfknkP^!Udf9jZ?hD(f_KOEpW$XwXYE-`7yWLNN#$O9akjF#JLO_);gz1C2uNzL4S3 zqf`@j^XJAAWBo6pmp#FZcWLrh_qWfgMeLWaju#2A(fz}aF0_7e>y(`OgemY&Mpvo07#bHPZGc5KQ$)W8sT8OwawcqxD20u zF0aB3@w9CoO(9SH{^Q3sF*7&!q$z^Wde(vl()*1>#lNeoORvwc!pMII=8W7zz*VC$ z$krPXE9&QPcR4$|vK<)4Lgx9!kYu=T3X5r^pJsI$ek+BaPj*zSS6En}k;CVPCg_9$ zQ9A9^EP7Q{RZc_%&afGeSF5OBVOd#TW~P5l4e!S0<_tJe_C`w7*~>#QWAGiNy%%Cv5}GODOHJ?X>=!KJj+NU{=x{p2}L{gt01D<7*GC)J^N*M z$Ri)e_qs&yk;s{u8879G zjS29_5v(5LW$Bujn=2|*$;ry9>FFswAn#e&*)`!4hnK`;Wa|3*%6fXg@?g$RPSe-M z#>O@)ElEQh?Y~A+1QvT&TReHvAxNRk{^&VgWFHfEu2CRDRE)Gu6rC)0DEe_Hrsv&z z797P1-WDPl47Rnq8~6P?N(N)Ah(4>?@XzN-N{obrgwrNi7B)5?>uoP7c+B3lC3jqf za5F5zg(N+*x74sYvL0?`Y+Jjqn|S@O><8m_B5R>DD0L*l@N0#;{ty>EJ|!xmfziP*_-4>VeMZl&y)0iRrmH z_oBNlH-W*Dz3oUs4n%)j|HEQS*kt+COC-O2)-;t;hC15cDYx99yJ?KQ1}#2zOhP=? z!j0qQ@;^GVVPRv#t!QiP0H3k`HSRO2kdV-1Jc~NWdL!^|OY0}UEv2WYr=SXnsOctA zlG@InGiL@^C(v5Y-Ty&(&Bb_eN={DBz3{H<;hPIWSh*?%b)dDaB=G!VZO(Fb^$?eF zyp+Yy_RL)l>kqmU{H@wocPz8;f8U>-pNEB>-h*u7+C_vrF7~GehlXD8@=otw*A1>x zQ*UhSxOA3A$55pTNkVL0Skhi!7Uvo4b@j1ZOuKfu-n_oKE>LVUlUB`0k%XEIF` zqL3?}g*9}gp1hNZ%MUT>HQ_GomX}-FkK*O?gn&v*OSiVS8*QBPMJ6XFH(U`}!a`yC z>niSB1M=nF@ORI=Z};{r^7%levLIO^zjNkUpd-)hI%{KO$7V4oprhN3Kr<8afQ*k9 zeENo-p8kl`xVGUj&zHUkJ99M?lN>9Msi|qQ{v$zk*nu<9KC@azTX(rme@JHj?^=2r zj8i$4oSe+e%G#Y;HiJ!vkB>>`0L+F6dsmZ!FGeY;F?F0_(x?z)`!O$vkWf-p6?bf0 z9QfNZ5zE6Nck}o6?d_tO&bgjv$$%#kU$=X%IV7X)(4MfVprw>iKlv$ZwL-=K;c0#r zWYt`%iJUWyW$L5Dkz6B<8|=|C1aDW3q@ILwgjayJx3_uu`3Wf~3dNhI^u@0De?K%S zc@=I-3|o=+?CBSii&3t8h;6S!(~JzpX#NFpoUyPgI9^K?$Nbx{Df7zxXaS>HmcvN@ z<8yc9Wqm9w5q`KI>YJyXm2)SLwZy>gzWr{x|2WFfasj5v1l8^{0^Hy zQw!Q)L8lRaGcpzVc9pc=j1=38j)tNG_?3d<&Kt#$7HTUN?M680nFywqO697A8{PD? zKxJLK_^*$!5xo)*H>#HVletZv=R5M{ZMQ`p>7IUC0vO75OWzxJemd(ONgg_D9qXLR z=Q)4caRzCj#k^UpOW3rYu%#7qt94}3J4-qI4a+H53NO-(K4<)c&;-#>kQvN}3Cq2b|QPS-jQ+T@~XWDX4~ zPY3rW*Tm1pRm~lj7WjFTk7Eck&86G%U01;*r5{DTYjc7g5sM3niHnB5+Kh)(IBv>< zPFmpxgcACAuQeh^XK^%3br{&RD>`=PRVD6gQr9UWWof_{9{_(}VKPYA{!?W=ZfbLt zg=%y(m8oGTxzgu)U8VLo*}Bi`zKLd)_+t_#bGLUzIx6!E(BcYYiga}r#mUL(Wvhyu zwmOmJ%?-{w($>UO`uxk; zw#r=^;ubAHs$^Y(O4x@6V{2>cop5T@?5yVR-@lnzSd52%a=Ey;2p)T%uDy|xDv{S# zSKmDUr?bbCZ<^5+rNlEU>H=YCSq=GC0aIFD z!9C=^l=I@q+bGw7_{r8-1jeVOg;p^JWJ%oaWhYbk`)=0;uhJ^m8~*Z%8690sAqbdr zMfn}2JqLO=A$+4%Zcu6mx#}UhxP!?dX=p~{R}p=M((u6=Ud?2sr4w68GMKHR|L)EX z_jb2L1(!?K5aD`wA9#3lk~H{YCT}a?3xdqh=X+O|l$Dhg;G~n)5v=7cu>k?7x0i>z ziPw#djd~gl0lhcf`e_gAGHCPGHs+EwDFPv6unFZLd~L$ZN1ej+t|h&rCLNd9#s|}d zh|QK)pIGJv4%H;l0=A@K>aE2F7ONnG9gBUlv=!Bh?4Z3WGMF~+s)9jt-h zzds}Ml-XAiAhun-Ui_($XF`8YsvosnOe)5HiCuM_(_ivA9~pLVMsD^+W&^p**_l(i za>wz_m^%b1VItnWrV3s60EYnG{q~WyyAvA(U#Kt=(dMyQT7@`2z~#*HbiD=wSF1Rr zpqIQo7Q96aV?Wm0Vy~l`yq+Zx_>nSJxa_N0!Zv#C#vssHXoFF#-g66?Kc_{eg(24) zW@6=ekZ{K^1m)c;oun`GD6d^9vUQ>3S!e?Dc9}i&0@hOWAl)-m8u5#>cKZ(c;l^{mG1~i$OnXgY_f_i<9*{Vt07)jzdOI3KWiHSho6Fdha5fy^?WowB(={WcF{Q5PdV!Yb} z2s4jTBp_{rKW?^AU)0~Hp-f=DN*Qh;^JVyoh99u4Dh8j&%qIw_7sNXUz6J*d9CQhl z*Ne;B=wG}D1oAx=0fD*fKp+w+&3}DFq*OQfbaa>2%@!w`8tS)T3=;hy8Uff*ylXEa z*~^GuUlaVXJ=3Ny2T>RWh`*5{%#sh+@t2}|u6J|#i)FC~5?0MM3qm6?$Ra_2h_F8TYhj1%oR^Kq zEi3wGfvyt0=sx;r_~?wRnk9QRTN>})g)UmY1G3^}Ug_|l0rkPjT*cfsftapMs>a5d zLt9v5qwTutAosa*k>*hesI14W2Kj#1OZ0#;?G}&9#jk9yUr*aE)C}SvQ-XiladUI; zP31qWt*wp!@nd3gQc7Q+nt_4A?ap-+U{C*i(;!5nwQwCg$C+mlf_}=mWz5ddjS-ioH4CJ*1?h zw6L&{jD4B#`cu~7fmIOsKM>?!pZ`Z7@?Qv{|3Dn2=rWwGZ$VGU6xP?*rL~LJ`S}E# zH+mjzY;07_{NRrplvYuRGOPb8z6`@aW!rbftgtc=Z>Ka{Mjqgsi2c}8gM9Ai#UmsB z^#O(g021L=^ES3L&0GR>QW^?BiGw)ru7(4puyC8NR)Pj-3_?Hf&D){n!JXXv6&W4y zNo_F(@dj1oz`(nggN=hJlOOfD#LCB6V%T3#Znx3urxo1XefC^;$-jQ{y{ua_wgCJl zCOTgv9rAPZ^2YG$`_(R_9c%ZYo_(}^5p%8lb}Ov{8T90jEsML$au!t3zy97d z0I}dz)#!05Zwv0fxO9U-?IU&yWvx>rfNj!Y!=F7jq$mgg99~}Dn1qBp(o*yrxADK= ziTCQFMQSicRC@(Gc2#$$NyoxciZ)&9-2t}i>TDKRueDJMh{*|LDv4Q`R5smTiuk4` z&6uv;gXGm zE_izN#n(epaK9@A%Qd`=yJS+1^pj*gBe2ESSV24I{w;}a_542pZq951adJQ!QN zqwk~SjNjhrx!gL8Y#s(kT7`%!23Wj4GFrQ49)>G{=w{7UiyEn7cwgaIQLReiQ`b0K zjuR?~JQfnL5~WqCka)K;=(0;<5k0}iPp~p8aNQ=%Ao}x zv{{G?F7LZuD5!n&dUr*JR}l-vmOM#UE=UR~Lcrvuh7EKdp!JXv6t@G%W5v-6><*-}6S6 zKQ@+(y~Lt}K2erRPq_Z`=Z~6>4keRu8-t`Vz zqjYWa7M2Gi0t*I;#^KDOW zuMjSj+I8^?coY9%zR**lwr14$lM8dAXes)wZ86n%@3616lc%PxtD}Dhah<1)z2JJ; zGj~eUuj+Bd{0P`4Rq8%Sx%5)hE)Q`ipOlo8_Po4LB4&mL_-vxsXb!c$vUw|dC{eM{ z(y~W)WxDUc>NDFIwX5Gi0drf~FHA$-I8Nx3hE0K1p0+^~wK?@ytgOd0%lp5xrPS5q z+&jOATQ#vtdcJz>{OuYU4XxsxFDy}A+3y6Wu-sdbKP!*%o+5K!mi+P-ZHUpP^}naH{tHpWOW#(~e{FF4 z$&tbribGuwMDLtylyC<)x_lBv&wWILu;ccr1gSu7<(s9alHLcsX+j<3TsOPzlsxl{AJ@}1&>#zZBzQ4 z!FAwfxekxGzqHpsaA))U)=e32ac=HYj$;Jyd83yT-CcUK`Tr1l&ShObySIDa3Cg-( z;*Gb7`(!vTyUrCt9_AADw{wIJ4(H0}wjd5o`JhBSgkoW4*|*@PSD>uVgo5AO!#6fD z<_|zDfqkbNQ*iF>WD%dJ!?9}`s*Z0YtU3Er`HPl+xh=-H!9pWrJ3IDb&C*yPu5=*) z5a;i-t(EG7R!%!>hUQx@Mc9A3 zJfE|>j#yB$Mj0QoYndn;p%tyzew}6&v26gxjW%%YVn==v8LPKGWMAg?`}ONttvFa) zn>X#iVy4tNnBU&OT?t)%-V7RDQIk=KnppBpUT@ejf3*R;WLNM0c4u0E( zttx3pU_z<*ZHyLbEG_(tZ}+s6bvidB8rTWI*ZC+%V&kKJ$c5<;_uj9Hav#(V5YZ0P zA-Vadr-4u3=_GehyDzPOu-~x_<6L|W{`irYi;JtLr$_Kdh_g*`aq+qCS^5b}2Ry|I zMDDi2Yef}ZJXYU&PdrgM;U+98Z6RR*-r!&Gi8^Y(PNnpV^)WI;8`nQ$1<1h2mKM=x z`H#~!%EWIGHz%794yP2D@b-{R25Mg}|C}E56)+@4y{dWYzH_ZJ5MX8B0I}S*P)XF| z)TkB}ph~F$OMWUbo-}OY4eAp8OFqLUe4qhqV!UkF)$VSJ)BBG&DQBsOvbbP}fSKf|Xuv^qmaq{_%{ru%ibbChu7XiS&NtO=UL=LTo ztKD>nc(07i()~OnG&)iPp2X`&4|sfJT6JVE-zCDS%O1tTie>kveQ9qByJHn5!UtkI zh^w#hc<7f{zWhV&dAcs=`dip#7pdS*%K@YhENVm;NYkERhT60e^D z2y|Ch*P7bF2RlP$qx;)S;r<_B-Dkzp&A0m7_RxJ)BlqCj{Lhb1`?rU3r~k6<8z4?i zEh1~rlL9npS((a>ROlxhE5ciDR6!D0FP49k|K?+ff%Ch!7`bI`T9F-f%T#C;%D$!^ z!-N0#kOfa_!jT0 zJ}FS}1}{u*^47*zA91i++E}dh=0kh`dvs!gwx?Bd%R19T$ZWxVUYBqQz=nF1X32dR zlb*1GvJJxx5S0118_TC>XVr9d6%`eqjEsyF+3`|xQAVO;U=R=!ODigd-)7GpekfbG z(2TfbbCbXdk7Re1v9{!CM(B5xji|@J6ak!<=hUcMu>e2sxJBdRNt1I(G8bID{7d?` z>y0?S)PFV#kGT?hMpo4~B+D5?0xVlRqoA;KU_=cb(Y<;+wrn_-Z2mBry&29T$;ABjA&H0a?Bs57 zS`Nc>(G9nQA4c+4kVyOqogfbZ=J=zs9pnl?fsU*HtAf+&o%@as|N86yH!Ky=FMuI7 zb&&l8y)}$!$9L-REyp94hf$J*}V*9#mp&QOs5g;P_(;%PGMOY(B8ZB zlcBSN;SyW%K1_0=InMdk)DK~ewDO7YAt_of9FX&nB&e-yMM1$sB(STzVo^e>-KZMxvTJhCQtV){S*-v``zr+iIR~$c3;G^ziGZNjKYt zMPe~lC7~A;eBNO2p1!sR$A8Yhd(j5MJ6T}AJbp2kEAq*@mCe=a!IzhpUuYlHEoXjp zOQ5}a|5X01Zyc_q;-x?ljTfDqLW9H4a}FPP%+^yP(7SIjP+|R@toaX4CAEZ_pOoiv z{{Tj9^lhT+i~8G2I(4oBr!(M?Rm1m5(lU$`>LF zx!!gC$-Q$qLIMI6^*DL((q*>ZGnZ*03O6rlX+bPJ>h-m<<5*2b2aip{{cdP-!%i2r z8%@E7%S!Y9je^ySyE#OxU#273q7B%r-qsoqnUz)ekq^ZXHULt4f%U%aQjFXGeyV(z z41DMCOlbf2dCBcl8M$|lpJZlzYHspTK-Aae#7LqJYC$W*A7m zUOAe^8VRkwwI^YXjg#B=RdiYBa5r}^$muu;S-XzLNj@Igi2Z6ypyPsztk7$}are#l z%k*?&(yqvn6N3@wziqGs&inPGgJje+SK( zvp8tGX~%f=@de=Lj}~geR+XDIXCTbNUCo$bVQJ|5oiMc2oXl+3X!c((mchF|x9L9~ zcUTu2=1olhhMidvi{;t>N=538QjT~TGYo3kmTVP@Y*<=bo_w5(T@!ByZ5jLOmQK## z)J}O*=~Ma@-)UW$3jwMctmyWh}MBym(A4QU`U+y}1)C zYesrC6G&<`CCrarLK_*Y6!o9P5Bb#QzO^ij%Wuo%VoBJ|{Yd@pgKOwZmh2DJ^Bl`p zLA)>S)m(KcRv`MVKNL3@|CHXc9xLd&?@fbF;x1k$2@5tFQwLS<9}SSt7M3{}9cg1u zPY;PXgut`gr>GxXCgiiCo#tJmv-yps@^<_OB@6OjHK1BIcC6uMHF6x|4+8Vxd zqOTVoIn-xp?_zL_YqCYvS3yxhHY9b;ySz%)4fBGEQRXW-7AEStRFtbCoo>d&FFW!@ zkcE93S*kx{!epp+EAE8Jl8=#Y$pVaj?NYlM5pbMj=4hr7KCMnh)OoF5zjX6$j6@4E z#o1$u9`+U1ld{$g$$x(AahRl=+o<(0X=hwsnw#WaN3yAs?&Vme%0+T}0(mDqK9{?!5y1&jxwARMYlyRaO5 zpsGb~Svg;6m2BBvD`uG>RD#I+dcB~`DYU&o81<*bB+EIX(SgGk{&Le|A*dFDX-j@}knP=fwVqX#YstiHo72K1@W>g`tyl z;aO5?9XpTuSs%HLmv6rG*muc^rf==<`%~-gL{2sfA2G`tSjMlut989}YhuN`2+wZ0 z^>Bad@~!wKRH%?kN_pi@b-7TkqkgX}1>zn1pORO_j zQ(|&?&ApP14h~W{i>ARX_WO5j&PlerOTSq=F^Oe6V$^t!eV)$??-BIcD^YML8PCm#nH#L>- zLKl`(LP2l+c75#uK>V=q@E7dtWs3UaLak2d4u?lnO=37c$C2*5P!v=lq;36xj1(qA zFX+AYx?bp%#v<#(Y@T?=gataCgaoZ0ki@IFLL3;C--`146{_biq$2tvsa#X{b)12o za=x~4{T#V^2$WTSGV$G5<+iliKBh(~Kr-rKph`w;M%9XUJraS zujw)TP6I4bzsxN+`5Rq@>C>lAYBO01OyD)^KtVU_%*SAE83v^ZTXz5A{h*vUy&8n^+ncu#H_iRzce&D8jB8?mWYT5 zcGvdPF4t3N2#Pj5!?c;F6>D<_Ko>{)``-vWh_XfW=2lcRL!2)u05nJnF~3rAGlL%0 zov@Z8yd%qs+VoHUu!;EqmIjfy;wXIUti)Zr3m9dcx=_d(4GE@|_jvyOA@L`6_^f*w z+(?uk6xiuEXwqfG>7oc{@=C?4-a6tqx!_?#?svEmzxNm}V1yXUq^d8%F=nh%>boBR z#?JC&sc~|t(K#33eSHxyxnNu>S%8-8?d|2|<3l;!jFwm!x!c^>2n`KAy>!ucI?u$~ zHmR>T=^VXGi|Dro;o{=@)nXcYcnAWBxb#GIWnzDV%4Llc>YAT!36pCV$80qSX-sM2 z5UsNL-gFI!nQQ}CU1oP!06uLJgG?{Oj`ayxMn-1-pzhzw3~%b{=9j!J87h2cVmN5a zdyjl22v<)n&@)~i1%-qZJA>l}zit9p0S@PtTr;HkRQImwI6)|OvO8L+K3%v4>+T1# zM812P#V;1|n*>F*QrS0qV&3#0U4{Dl_iGx%CucjHo@o!J8?V}iRn>NHPcG7w>SaMu zk8HS;fOni(TdT2*Ic=*;G#;>MpIX}Y6c;bEtuhH%XVU`0#KAT;jJ)$Y+@H$l{@8|J zr@??#Hu=-}jw{&LPqbug*(;Q5-_h;dr=Ne@%CGzdDCl(Bxr9na=3pxC)EDn=aB+Vi z5v?{E^{=|dt940BR#ujfrM0h8(Vf!)&Kp{DBJkcTGPFm!h}d|-i{5~G@4`zgj2*Yb zEvP*^I}j+L@&RZ;(pFtba-wznO4nQwoc&^tGleUKL3r2<_&%UYam-B_F)KPe2n!Fp zVzJBUhnW1KXL&9>V95Yc@_M#P_Hl@DEvvMsjXH|rSQfPM6Ie4FKy_*(TkOY0y?m8n zw32h-qS_?3Rw*%5w+I635X(a6-2J^pcDa5tsa8|?DqOfu%FV5g z_}qs;z!1YeZ=m}oMRD%@CWcpU-+punOY%>z?mMIzcQp+=!^m#-DTjU;$~^lC1r8?P zAQdI$^bbgfoe9Wd^6pNm;(4f*BAYkCsz|(vyU$U{h$Agq9whJ9AlLmkc-KejrRns&0N9S?CC+#yPL?m9j%gPw{Xv)W$kO{P%VC&xWLPzN>aohC= zRnI^??9b3NGj4l7K;JqnLUSW$NWHSHxoxeKpAJ?IQ;TvVnW zeCJjgr3!$q?~&G|@_}k&8*3A4!-T^P$DYdxuI`F?33!uOX)^0DBBj*306F%5$jJ-T zEBm`<7fmNZl0F?5VQMh__MhfL8Dxw3CsSN=1}0cH(^GHWV^Tntcj16%16Dd9BYSJr zF1T?gn~@#J80RV`8B52-A3MFJJ*l=KRB;Ji=Jz-7e2ec-7sD)QpwJ0Zb6qszG^+E# zl&kXDKhh5Sp56N+BW^r%_sFiTPWvAzAQ#5}gCH}6lS)0N~6 z-TyKf!mz&#}N27362D*c@(lJ|a zAFBIa<=SV6{fGDw)*762`?{;MI(7T-p87B}A|f5y!q#(QLnc8TPLY!611=A&NsMZ*JVHS0e|_%r1mIAHO$5ciio)jP?{TD=b>QEY`WbYK)cB zLb~%C%Nv4(D0?7w?sEOh&Tb#8%%teiT)m>?&Dh5~vCMcN6%+LavBNdzRDVv@j+cv> zRFMTD;r?A9FN*&p&Do}Lh>VP^sj0yyBkN!5oQ>KA*s$Rg0oDJg2I3?<>A?JCP@6Za zq)wERvq!<-r4z;sF=Wjp(Nbh-OX^@W;+Hf{t;OPN-ItAMF0a@N+YfTArvKAzKTn7o!VoDJ(K&BrHIpy}!9YthGlc~qA-bhX{F zZ0Ya+mx^9Ra4~0!yw7U=hmPTr!#P>GuVXaeG||WJ36X2xr51#Rr$6{*QCV9t7Z>d; zFTs8I#fRP_%R6j>2eUyl*xv-+$~}qDIna5kIJp(Ob}$&1j&ah)CHRw%h;ZiX>coml zq`??%K!Dysw9nP2#NAbESrAbykDPmJ;&4>eadSeVb0o9qM%J$>-xw98MFY`iJEh4AMe4G0A4 zwNAf7Lnh8%??nY{Q);GE;)PNdLL+ov)V0n0n5D^oLt_8Lp?!_9gW z?57Z2N|9M5mzpH;gfVksvO^Z;2BouEbOWz_hC!}DXwxCPUE7TrAd6j(M}Yn<#?i?( z?Nor?x6gCkq$K0T{lG}!A2I(O&%(=Bs_EK`o#uIpg}EBn0qeWR;mlDpwgdST$DG@p zc-s%B@OYP2r3wiLp!NTP4?UxPW2(>He6Bd*L3vtu+&65PdwPPhn`(x9)ypyEccWWp zqc7%J)s)IDgi-Ru*Ujrpb1V-dVSupkvqZ(PZ_7Q(Bqdet;qt$5>m;xb_4yP;}0%#5weV$E5j~= zOulTxXzrDKFHU4sr;CH`sl4_R&n>%|sv*Cc?3e&^js9kt$tzfNLri(MZ`_t> z9zb)KSPK3obQlewYmV_-8~iW*$@0pzl#*6ONgJQVbn7v>EMxT=s+%Y$TT1Z%EG#G( z7^DsHyEjRBdJ5g#+@zjNEnjUsITXl~}h-6IJ1BSouVe2AJj?PYJ6K9kc#&K|7#B*q>&Wtq?Oo^&BUc&0vTj=x6{ zhxdSpW7(otMOm3VoT{R(+`{Vk55*aY$RoYnPNsR>N|I7VE)g4KZKY@)-M00^-`9qV zU;_4|Hv4tf+rshbCrVnEfpU*gv@aI%G*ly4wufkSEDrZPHUa0syB`F^R(dgqA?=Pc zE~B805s)b71Gh%H=PdimeH~@MT}vf+Ih{AG-RsQcZ-7O)`O@)NWMO-BCswAi2zlJ& z%WE(GCPD?igkaNMibD13!S29poJ*^C!sy2r&em`^er9_WS!F?FLpw9~K^Dv4gV}jY z(*nq);O+f_PC9tX-FGWse z8ou6hIg9?IU$LU6U#2gC|Lc|BI$a4A7*3WPK7e=maB8%*+5G-)HpylR%)U z1*ZX6SVUy(O^f?^0Z%0^=$?vSR7@d-I7IU;!EXMNYZAa2i9W`u*(HIwhJrD?G8c(y zb6_;SS-R?eJ=fZ0Z7S?i>)Pr16Xs*BK|$dsn27i3`T$S}vZIi6Kd5ep-L|u^31zNl zK0-%@Y);7em$$KpN6(6AWq)u<;V)I-7UHs761*(#+uokFDy*wLwQ=?94tW~R5+=D8 zz>X`)Hh3}hz=dcr6rM3xjfmE`EYvc5YvMvn4+OZiQ=|dcNXi9w_G7bkT$UHeKMX`g)smPO?b_V(yRU&ls8@#`$=#>9+&ngx$gQ~wkhE`dPx z+Zp^~w@&J8`5@%}|6J6j*`Witu_fhhh3aqS>UMv@69%h{ND)lBp4Se3N+Dg**>Ppx zRzKCgR2Q`MRj}e`Us6CZx{F4D?!=F}%(o#{zV11IR`#+#j-Snfe^9`ek57Oe<+7G( z-vUba`gK4|3}-;#+edhKFhv{P(Qnb~vFql80tJrqGzoL8Yg0Hn3*%L~|FAuB{ZhUKiyk#0ll(?L>-Z3gC_vFaOk@Hy* zXUj&?zkVH&lk+k*HWqjgzrgRXCOHz)na_iwDiF(1Nf>)Ov9cmtU6@4omh-~|I5Z;S zxu|ID_&9but(=YzuS}m;@MW}CJqqx-`#$W$%)N}W;u9lfw?$ikO0ibT(8XL6O#G{~ z7`i8Yt=-WVEnd?~$=REq?fll(w)FOkA|MyNbPKk;5k@jyNI4 z@d}T)%;}YLF6b$+BcnK++0t@>d;lt?+7`^R*?dt|r9UO@GZwW_o{^z-wuv`akz14$ ze#l4BnK5_Ysx~*Rr-tN@=HfZr2QKs>00D&ST${j$$CUKOp_qZD7pq?63(Hkq&h)RBMD^Bbcx0bwSeGsC?&JM=%7$X;>9fPa6A#D9$VfO{t{eAoy%uzI_xJVy zk*I6@nyPFLV?}#|g38sTl`A?v0ig+>|D;uWFElY;+EXSd`N%jklefNRJ`&^=_{hVF z;=MkOUab|$ix43)gO4sL#VEPl<;^MgL-rvJBjk!s6b(#`1 zVLxQ!Y_38SBADMs(SH$RDzYkl0g}LziGSYyB^I8yh4r)zC+8*X>#9=y9iF6*&FfA~ zG{cjn(u3c;blPpM4XRUqgK=_z<_Ee=|{$|6=4^NomGL|KOsL1`;RyNH4z;W~wp&SVu zBO{5KhQ8KGPO-Ep$ZsnnRabwp6NOi6@U{I$xLsS>t^ZiP64PO8fFMHl#cl*SN=MuM zoe;3p%XQIC_W~uq6RfMI3Oa7AM6Zr%kli}1>SfQGk9n>OX*JFL%jn%SZ+6Bw`5EBs z&Yxy?j;N+V6M8nbNI;pWO!Tk-XB0M#UK?n7F8yOV+RtRlncdiz#+>BXc(}Q>wHSdb8T(xGRaa2OTw@l;m(n5X z8ulCSE%_30B*Kflh#pO>`=lBk&21UhSbWcU3HFr1xVwVx0$ZH9ydc9+jS#ql@(n(v zq4ZNrzb~Tr1m9^neFl0$wyb=TVhw7rk|iy3F?{s&DfCMG`Sa%h4{q@p^`E6HW>`ga zR*zt2`k9S43gp#MgZAOsX`wc#WI!Q>Ryj)2Y~--~BJ^E)7`@X4Gm{ty49HLDXSF0EdB>0Hv!wQ0wuL)6eNIy?L@R&4Zt2iX7l;OKuU dkqkdz<(@U_GI~}l1E-xq@-iyYWl}}~{|)+Susi?& From 366075b38e0d58179f471c44405fe2ac16032287 Mon Sep 17 00:00:00 2001 From: Seris02 Date: Sun, 9 Feb 2020 13:10:28 +0800 Subject: [PATCH 002/113] yeet forgot this --- code/modules/uplink/uplink_items/uplink_clothing.dm | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/code/modules/uplink/uplink_items/uplink_clothing.dm b/code/modules/uplink/uplink_items/uplink_clothing.dm index fcbe0fb9a6..b38e6cffe4 100644 --- a/code/modules/uplink/uplink_items/uplink_clothing.dm +++ b/code/modules/uplink/uplink_items/uplink_clothing.dm @@ -83,4 +83,10 @@ name = "Thieving Gloves" desc = "A pair of gloves that are insulated and frictionless, allowing you to steal easily from anyone you see." item = /obj/item/clothing/gloves/thief - cost = 4 \ No newline at end of file + cost = 4 + +/datum/uplink_item/suits/wallwalkers + name = "Wall Walking Boots" + desc = "Through bluespace magic stolen from an organisation that hoards technology, these boots simply allow you to slip through the atoms that make up anything, but only while walking, for safety reasons. As well as this, they unfortunately cause minor breath loss as the majority of atoms in your lungs are sucked out into any solid object you walk through." + item = /obj/item/clothing/shoes/wallwalkers + cost = 6 \ No newline at end of file From 577cfdc582ef39bc4e32752c78b6f0596a1c7a12 Mon Sep 17 00:00:00 2001 From: Seris02 Date: Sun, 9 Feb 2020 17:04:17 +0800 Subject: [PATCH 003/113] yay much better --- code/modules/clothing/shoes/miscellaneous.dm | 60 +++++++++++++++---- icons/obj/module.dmi | Bin 20524 -> 20750 bytes 2 files changed, 47 insertions(+), 13 deletions(-) diff --git a/code/modules/clothing/shoes/miscellaneous.dm b/code/modules/clothing/shoes/miscellaneous.dm index 764197155e..35082be03e 100644 --- a/code/modules/clothing/shoes/miscellaneous.dm +++ b/code/modules/clothing/shoes/miscellaneous.dm @@ -372,6 +372,7 @@ icon_state = "walkboots" var/walkcool = 0 var/wallcharges = 4 + var/newlocobject = null //sparks, maybe oxydamage instead /obj/item/clothing/shoes/wallwalkers/equipped(mob/user,slot) @@ -385,20 +386,22 @@ ..() LAZYREMOVE(user.user_movement_hooks,src) -/obj/item/clothing/shoes/wallwalkers/attackby(obj/item/I, mob/user, params) - . = ..() //yes this is shamelessly copied - if(istype(I, /obj/item/stack/ore/bluespace_crystal)) - var/obj/item/stack/ore/bluespace_crystal/B = I - wallcharges += 1 - to_chat(user, "You tap the [src] with the [I].") - if(B.amount > 1) - B.amount -= 1 +/obj/item/clothing/shoes/wallwalkers/attackby(obj/item/W, mob/user, params) + if(istype(W, /obj/item/bluespacerecharge)) + var/obj/item/bluespacerecharge/ER = W + if(ER.uses) + wallcharges += ER.uses + to_chat(user, "You charged the bluespace crystal in the [src]. It now has [wallcharges] charges left.") + ER.uses = 0 + ER.icon_state = "[initial(ER.icon_state)]0" else - qdel(I) + to_chat(user, "[ER] has no crystal on it.") + return + . = ..() /obj/item/clothing/shoes/wallwalkers/examine(mob/user) . = ..() - . += "It has [wallcharges] charges left. Recharge with bluespace crystals." + . += "It has [wallcharges] charges left." /obj/item/clothing/shoes/wallwalkers/intercept_user_move(dir,mob/living/m,newloc,oldloc) if (walkcool < world.time && m.m_intent == MOVE_INTENT_WALK && wallcharges > 0) @@ -412,15 +415,17 @@ for (var/atom/T in newloc) //stuff on the new turf if (!T.CanPass(m,newloc) && T != m) issolid = TRUE + newlocobject = T break if (!issolid) for (var/atom/T in oldloc) //directional shit on the old turf - if (!T.CanPass(m,newloc) && T != m) + if (!T.CanPass(m,newloc) && T != m && T != newlocobject) issolid = TRUE break + newlocobject = null //stopping structures from using two charges because of how shitty the canpass code is m.forceMove(newloc) if (issolid) - m.adjustOxyLoss(rand(5,15)) + m.adjustOxyLoss(rand(5,13)) if (prob(10)) m.adjustBruteLoss(rand(3,5)) to_chat(m,"You feel as if travelling through the solid object left something behind and it hurts!") @@ -428,4 +433,33 @@ s.set_up(5, 1, oldloc) s.start() flash_lighting_fx(3, 3, LIGHT_COLOR_ORANGE) - wallcharges-- \ No newline at end of file + wallcharges-- + +/obj/item/bluespacerecharge + name = "bluespace crystal recharging device" + desc = "A small cell with two prongs lazily jabbed into it. It looks like it's made for replacing the crystals in bluespace devices." + icon = 'icons/obj/module.dmi' + icon_state = "bluespace_charge" + item_flags = NOBLUDGEON + var/uses = 6 + +/obj/item/bluespacerecharge/examine(mob/user) + . = ..() + if(uses) + . += "It can add up to [uses] charges to compatible devices." + else + . += "The crystal is gone." + +/obj/item/bluespacerecharge/attackby(obj/item/I, mob/user, params) + ..() + if(istype(I, /obj/item/stack/ore/bluespace_crystal) && !uses) + var/obj/item/stack/ore/bluespace_crystal/B = I + if (B.amount < 10) + return + uses += 3 + to_chat(user, "You insert [I] into [src].") + if(B.amount > 10) + B.amount -= 10 + else + qdel(I) + icon_state = initial(icon_state) \ No newline at end of file diff --git a/icons/obj/module.dmi b/icons/obj/module.dmi index ace24db5ff709c2284095cda6c1e73daf5cc8a09..a647bebd57fbc6db02209dcdeef76ca03767bd40 100644 GIT binary patch literal 20750 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%0D9v?u$ZHwYs&cq-mB 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 B!rlM? literal 20524 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 vLF#8z4*mU@WB1&Y^a Date: Sun, 9 Feb 2020 17:07:39 +0800 Subject: [PATCH 004/113] forgot that shit again --- code/modules/uplink/uplink_items/uplink_devices.dm | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/code/modules/uplink/uplink_items/uplink_devices.dm b/code/modules/uplink/uplink_items/uplink_devices.dm index 05731722f7..a9b554566a 100644 --- a/code/modules/uplink/uplink_items/uplink_devices.dm +++ b/code/modules/uplink/uplink_items/uplink_devices.dm @@ -20,6 +20,12 @@ item = /obj/item/emagrecharge cost = 2 +/datum/uplink_item/device_tools/bluespacerecharge + name = "Bluespace Crystal Recharging Device" + desc = "A small device intended for recharging Wall Walking boots. Using it will add six charges to them. Use ten bluespace crystals on this recharger to add three more charges to it. " + item = /obj/item/bluespacerecharge + cost = 2 + /datum/uplink_item/device_tools/phantomthief name = "Syndicate Mask" desc = "A cheap plastic mask fitted with an adrenaline autoinjector, which can be used by simply tensing your muscles" From 59acbe01250775601c4ead43d9f156043cee8e59 Mon Sep 17 00:00:00 2001 From: Seris02 Date: Sat, 22 Feb 2020 20:45:16 +0800 Subject: [PATCH 005/113] yee --- code/modules/clothing/shoes/miscellaneous.dm | 94 ++++++++++---------- 1 file changed, 47 insertions(+), 47 deletions(-) diff --git a/code/modules/clothing/shoes/miscellaneous.dm b/code/modules/clothing/shoes/miscellaneous.dm index 35082be03e..45c7ad4102 100644 --- a/code/modules/clothing/shoes/miscellaneous.dm +++ b/code/modules/clothing/shoes/miscellaneous.dm @@ -387,53 +387,55 @@ LAZYREMOVE(user.user_movement_hooks,src) /obj/item/clothing/shoes/wallwalkers/attackby(obj/item/W, mob/user, params) - if(istype(W, /obj/item/bluespacerecharge)) - var/obj/item/bluespacerecharge/ER = W - if(ER.uses) - wallcharges += ER.uses - to_chat(user, "You charged the bluespace crystal in the [src]. It now has [wallcharges] charges left.") - ER.uses = 0 - ER.icon_state = "[initial(ER.icon_state)]0" - else - to_chat(user, "[ER] has no crystal on it.") - return . = ..() + if(!istype(W, /obj/item/bluespacerecharge)) + return + var/obj/item/bluespacerecharge/ER = W + if(ER.uses) + wallcharges += ER.uses + to_chat(user, "You charged the bluespace crystal in the [src]. It now has [wallcharges] charges left.") + ER.uses = 0 + ER.icon_state = "[initial(ER.icon_state)]0" + else + to_chat(user, "[ER] has no crystal on it.") /obj/item/clothing/shoes/wallwalkers/examine(mob/user) . = ..() . += "It has [wallcharges] charges left." /obj/item/clothing/shoes/wallwalkers/intercept_user_move(dir,mob/living/m,newloc,oldloc) - if (walkcool < world.time && m.m_intent == MOVE_INTENT_WALK && wallcharges > 0) - walkcool = world.time + m.movement_delay() - var/issolid = FALSE - var/turf/K = newloc - if (istype(K)) - if (K.density) + if (walkcool >= world.time || m.m_intent != MOVE_INTENT_WALK || wallcharges <= 0) + return + walkcool = world.time + m.movement_delay() + var/issolid = FALSE + var/turf/K = newloc + if (istype(K)) + if (K.density) + issolid = TRUE + if (!issolid) + for (var/atom/T in newloc) //stuff on the new turf + if (!T.CanPass(m,newloc) && T != m) issolid = TRUE + newlocobject = T + break if (!issolid) - for (var/atom/T in newloc) //stuff on the new turf - if (!T.CanPass(m,newloc) && T != m) + for (var/atom/T in oldloc) //directional shit on the old turf + if (!T.CanPass(m,newloc) && T != m && T != newlocobject) issolid = TRUE - newlocobject = T break - if (!issolid) - for (var/atom/T in oldloc) //directional shit on the old turf - if (!T.CanPass(m,newloc) && T != m && T != newlocobject) - issolid = TRUE - break - newlocobject = null //stopping structures from using two charges because of how shitty the canpass code is - m.forceMove(newloc) - if (issolid) - m.adjustOxyLoss(rand(5,13)) - if (prob(10)) - m.adjustBruteLoss(rand(3,5)) - to_chat(m,"You feel as if travelling through the solid object left something behind and it hurts!") - var/datum/effect_system/spark_spread/s = new /datum/effect_system/spark_spread - s.set_up(5, 1, oldloc) - s.start() - flash_lighting_fx(3, 3, LIGHT_COLOR_ORANGE) - wallcharges-- + newlocobject = null //stopping structures from using two charges because of how shitty the canpass code is + m.forceMove(newloc) + if (!issolid) + return + m.adjustOxyLoss(rand(5,13)) + if (prob(10)) + m.adjustBruteLoss(rand(3,5)) + to_chat(m,"You feel as if travelling through the solid object left something behind and it hurts!") + var/datum/effect_system/spark_spread/s = new /datum/effect_system/spark_spread + s.set_up(5, 1, oldloc) + s.start() + flash_lighting_fx(3, 3, LIGHT_COLOR_ORANGE) + wallcharges-- /obj/item/bluespacerecharge name = "bluespace crystal recharging device" @@ -452,14 +454,12 @@ /obj/item/bluespacerecharge/attackby(obj/item/I, mob/user, params) ..() - if(istype(I, /obj/item/stack/ore/bluespace_crystal) && !uses) - var/obj/item/stack/ore/bluespace_crystal/B = I - if (B.amount < 10) - return - uses += 3 - to_chat(user, "You insert [I] into [src].") - if(B.amount > 10) - B.amount -= 10 - else - qdel(I) - icon_state = initial(icon_state) \ No newline at end of file + if(!istype(I, /obj/item/stack/ore/bluespace_crystal) || uses) + return + var/obj/item/stack/ore/bluespace_crystal/B = I + if (B.amount < 10) + return + uses += 3 + to_chat(user, "You insert [I] into [src].") + B.use(10) + icon_state = initial(icon_state) \ No newline at end of file From 74d6473c3be5ee1f9f3153a4d246145afb18c112 Mon Sep 17 00:00:00 2001 From: Artur Date: Tue, 25 Feb 2020 17:07:40 +0200 Subject: [PATCH 006/113] Initial Commit Changes isvamp() to isbloodsucker(), adds a isvampire() check for the race itself, reworks regen cores codewise, adds a defib check for bloodsuckers --- code/__DEFINES/is_helpers.dm | 3 +- .../game/gamemodes/bloodsucker/bloodsucker.dm | 99 +++++-------------- code/game/machinery/cloning.dm | 2 +- .../bloodsucker/objects/bloodsucker_crypt.dm | 14 +-- .../mining/equipment/regenerative_core.dm | 27 +++-- .../living/carbon/alien/special/facehugger.dm | 2 +- code/modules/mob/living/carbon/carbon.dm | 2 +- 7 files changed, 48 insertions(+), 101 deletions(-) diff --git a/code/__DEFINES/is_helpers.dm b/code/__DEFINES/is_helpers.dm index 55bfcaff79..e69f5df05e 100644 --- a/code/__DEFINES/is_helpers.dm +++ b/code/__DEFINES/is_helpers.dm @@ -67,6 +67,7 @@ GLOBAL_LIST_INIT(turfs_without_ground, typecacheof(list( #define iscatperson(A) (ishumanbasic(A) && istype(A.dna.species, /datum/species/human/felinid) ) #define isdwarf(A) (is_species(A, /datum/species/dwarf)) #define isdullahan(A) (is_species(A, /datum/species/dullahan)) +#define isbloodsuckerire(A) (is_species(A,/datum/species/vampire)) // Citadel specific species #define isipcperson(A) (is_species(A, /datum/species/ipc)) @@ -263,4 +264,4 @@ GLOBAL_LIST_INIT(glass_sheet_types, typecacheof(list( #define isblobmonster(O) (istype(O, /mob/living/simple_animal/hostile/blob)) -#define isshuttleturf(T) (length(T.baseturfs) && (/turf/baseturf_skipover/shuttle in T.baseturfs)) \ No newline at end of file +#define isshuttleturf(T) (length(T.baseturfs) && (/turf/baseturf_skipover/shuttle in T.baseturfs)) diff --git a/code/game/gamemodes/bloodsucker/bloodsucker.dm b/code/game/gamemodes/bloodsucker/bloodsucker.dm index a45e989318..3737d0a5b1 100644 --- a/code/game/gamemodes/bloodsucker/bloodsucker.dm +++ b/code/game/gamemodes/bloodsucker/bloodsucker.dm @@ -9,7 +9,7 @@ var/list/vassal_allowed_antags = list(/datum/antagonist/brother, /datum/antagonist/traitor, /datum/antagonist/traitor/internal_affairs, /datum/antagonist/survivalist, \ /datum/antagonist/rev, /datum/antagonist/nukeop, /datum/antagonist/pirate, /datum/antagonist/cult, /datum/antagonist/abductee, /datum/antagonist/valentine, /datum/antagonist/heartbreaker,) // The antags you're allowed to be if turning Vassal. -/proc/isvamp(mob/living/M) +/proc/isbloodsucker(mob/living/M) return istype(M) && M.mind && M.mind.has_antag_datum(/datum/antagonist/bloodsucker) /datum/game_mode/bloodsucker @@ -70,49 +70,28 @@ // Gamemode is all done being set up. We have all our Vamps. We now pick objectives and let them know what's happening. /datum/game_mode/bloodsucker/post_setup() - // Sunlight (Creating Bloodsuckers manually will check to create this, too) check_start_sunlight() - // Vamps for(var/datum/mind/bloodsucker in bloodsuckers) - // spawn() --> Run block of code but game continues on past it. - // sleep() --> Run block of code and freeze code there (including whoever called us) until it's resolved. - - //Clean Bloodsucker Species (racist?) - //clean_invalid_species(bloodsucker) - // TO-DO !!! - - // Add Bloodsucker Antag Datum (or remove from list on Fail) - if (!make_bloodsucker(bloodsucker)) + if(!make_bloodsucker(bloodsucker)) bloodsuckers -= bloodsucker - - // NOTE: Hunters are done in ..() parent proc - return ..() -// Checking for ACTUALLY Dead Vamps -/datum/game_mode/bloodsucker/are_special_antags_dead() - // Bloodsucker not Final Dead - for(var/datum/mind/bloodsucker in bloodsuckers) - if(!bloodsucker.AmFinalDeath()) - return FALSE - return TRUE - // Init Sunlight (called from datum_bloodsucker.on_gain(), in case game mode isn't even Bloodsucker /datum/game_mode/proc/check_start_sunlight() // Already Sunlight (and not about to cancel) - if (istype(bloodsucker_sunlight) && !bloodsucker_sunlight.cancel_me) + if(istype(bloodsucker_sunlight) && !bloodsucker_sunlight.cancel_me) return bloodsucker_sunlight = new () // End Sun (last bloodsucker removed) /datum/game_mode/proc/check_cancel_sunlight() // No Sunlight - if (!istype(bloodsucker_sunlight)) + if(!istype(bloodsucker_sunlight)) return - if (bloodsuckers.len <= 0) + if(bloodsuckers.len <= 0) bloodsucker_sunlight.cancel_me = TRUE qdel(bloodsucker_sunlight) bloodsucker_sunlight = null @@ -158,64 +137,36 @@ /datum/game_mode/proc/make_bloodsucker(datum/mind/bloodsucker, datum/mind/creator = null) // NOTE: This is a game_mode/proc, NOT a game_mode/bloodsucker/proc! We need to access this function despite the game mode. - if (!can_make_bloodsucker(bloodsucker)) + if(!can_make_bloodsucker(bloodsucker)) return FALSE - // Create Datum: Fledgling var/datum/antagonist/bloodsucker/A - - // [FLEDGLING] - if (creator) + // [FLEDGLING] AKA a young vampire. + if(creator) A = new (bloodsucker) A.creator = creator bloodsucker.add_antag_datum(A) // Log message_admins("[bloodsucker] has become a Bloodsucker, and was created by [creator].") log_admin("[bloodsucker] has become a Bloodsucker, and was created by [creator].") - // [MASTER] else A = bloodsucker.add_antag_datum(ANTAG_DATUM_BLOODSUCKER) - - return TRUE - /datum/game_mode/proc/remove_bloodsucker(datum/mind/bloodsucker) bloodsucker.remove_antag_datum(ANTAG_DATUM_BLOODSUCKER) - /datum/game_mode/proc/clean_invalid_species(datum/mind/bloodsucker) // Only checking for Humans here - if (!ishuman(bloodsucker.current) || !bloodsucker.current.client) - return - var/am_valid = TRUE - var/mob/living/carbon/human/H = bloodsucker.current - - // Check if PLASMAMAN? - if(NOBLOOD in H.dna.species.species_traits) - am_valid = FALSE - - // PROBLEM: - // - // Setting species leaves clothes on. If you were a plasmaman, we need to reassign your entire outfit. Otherwise - // everyone will wonder why you're a human with Plasma clothes (jk they'll know you're antag) - - // Convert to HUMAN (along with ID and PDA) - if (!am_valid) - H.set_species(/datum/species/human) - H.real_name = H.client.prefs.custom_names["human"] - var/obj/item/card/id/ID = H.wear_id?.GetID() - if(ID) - ID.registered_name = H.real_name - ID.update_label() - + if(ishuman(bloodsucker.current) || bloodsucker.current.client && NOBLOOD in H.dna.species.species_traits) + var/mob/living/carbon/human/H = bloodsucker.current + //Give them blood if they dont have any. + H.dna.species.species_traits =- NOBLOOD /datum/game_mode/proc/can_make_vassal(mob/living/target, datum/mind/creator, display_warning=TRUE)//, check_antag_or_loyal=FALSE) // Not Correct Type: Abort - if (!iscarbon(target) || !creator) - return FALSE - if (target.stat > UNCONSCIOUS) + if(!iscarbon(target) || !creator || target.stat > UNCONSCIOUS) return FALSE // Check Overdose: Am I even addicted to blood? Do I even have any in me? //if (!target.reagents.addiction_list || !target.reagents.reagent_list) @@ -233,23 +184,23 @@ //message_admins("DEBUG4: can_make_vassal() Abort: No Blood") // return 0 // No Mind! - if (!target.mind || !target.mind.key) - if (display_warning) + if(!target.mind || !target.mind.key) + if(display_warning) to_chat(creator, "[target] isn't self-aware enough to be made into a Vassal.") return FALSE // Already MY Vassal var/datum/antagonist/vassal/V = target.mind.has_antag_datum(ANTAG_DATUM_VASSAL) - if (istype(V) && V.master) - if (V.master.owner == creator) - if (display_warning) + if(istype(V) && V.master) + if(V.master.owner == creator) + if(display_warning) to_chat(creator, "[target] is already your loyal Vassal!") else - if (display_warning) + if(display_warning) to_chat(creator, "[target] is the loyal Vassal of another Bloodsucker!") return FALSE // Already Antag or Loyal (Vamp Hunters count as antags) - if (target.mind.enslaved_to || AmInvalidAntag(target.mind)) //!VassalCheckAntagValid(target.mind, check_antag_or_loyal)) // HAS_TRAIT(target, TRAIT_MINDSHIELD, "implant") || - if (display_warning) + if(target.mind.enslaved_to || AmInvalidAntag(target.mind)) //!VassalCheckAntagValid(target.mind, check_antag_or_loyal)) // HAS_TRAIT(target, TRAIT_MINDSHIELD, "implant") || + if(display_warning) to_chat(creator, "[target] resists the power of your blood to dominate their mind!") return FALSE return TRUE @@ -268,15 +219,15 @@ return FALSE // Does even ONE antag appear in this mind that isn't in the list? Then FAIL! for(var/datum/antagonist/antag_datum in M.antag_datums) - if (!(antag_datum.type in vassal_allowed_antags)) // vassal_allowed_antags is a list stored in the game mode, above. - //message_admins("DEBUG VASSAL: Found Invalid: [antag_datum] // [antag_datum.type]") + // vassal_allowed_antags is a list stored in the game mode, above. + if(!(antag_datum.type in vassal_allowed_antags)) return TRUE //message_admins("DEBUG VASSAL: Valid Antags! (total of [M.antag_datums.len])") // WHEN YOU DELETE THE ABOVE: Remove the 3 second timer on converting the vassal too. return FALSE /datum/game_mode/proc/make_vassal(mob/living/target, datum/mind/creator) - if (!can_make_vassal(target,creator)) + if(!can_make_vassal(target,creator)) return FALSE // Make Vassal var/datum/antagonist/vassal/V = new (target.mind) @@ -285,7 +236,7 @@ target.mind.add_antag_datum(V, V.master.get_team()) // Update Bloodsucker Title (we're a daddy now) B.SelectTitle(am_fledgling = FALSE) // Only works if you have no title yet. - // Log + // lOg it message_admins("[target] has become a Vassal, and is enslaved to [creator].") log_admin("[target] has become a Vassal, and is enslaved to [creator].") return TRUE diff --git a/code/game/machinery/cloning.dm b/code/game/machinery/cloning.dm index 62304112b2..266fcd0e40 100644 --- a/code/game/machinery/cloning.dm +++ b/code/game/machinery/cloning.dm @@ -157,7 +157,7 @@ mess = TRUE update_icon() return FALSE - if(isvamp(clonemind)) //If the mind is a bloodsucker + if(isbloodsucker(clonemind)) //If the mind is a bloodsucker return FALSE attempting = TRUE //One at a time!! diff --git a/code/modules/antagonists/bloodsucker/objects/bloodsucker_crypt.dm b/code/modules/antagonists/bloodsucker/objects/bloodsucker_crypt.dm index 9e46203483..2eace3a94d 100644 --- a/code/modules/antagonists/bloodsucker/objects/bloodsucker_crypt.dm +++ b/code/modules/antagonists/bloodsucker/objects/bloodsucker_crypt.dm @@ -116,7 +116,7 @@ /obj/structure/bloodsucker/vassalrack/examine(mob/user) . = ..() - if(isvamp(user) || isobserver(user)) + if(isbloodsucker(user) || isobserver(user)) . += {"This is the vassal rack, which allows you to thrall crewmembers into loyal minions in your service."} . += {"You need to first secure the vassal rack by clicking on it while it is in your lair."} . += {"Simply click and hold on a victim, and then drag their sprite on the vassal rack. Alt click on the vassal rack to unbuckle them."} @@ -130,7 +130,7 @@ /obj/structure/bloodsucker/vassalrack/MouseDrop_T(atom/movable/O, mob/user) if(!O.Adjacent(src) || O == user || !isliving(O) || !isliving(user) || useLock || has_buckled_mobs() || user.incapacitated()) return - if(!anchored && isvamp(user)) + if(!anchored && isbloodsucker(user)) to_chat(user, "Until this rack is secured in place, it cannot serve its purpose.") return // PULL TARGET: Remember if I was pullin this guy, so we can restore this @@ -183,7 +183,7 @@ /obj/structure/bloodsucker/vassalrack/user_unbuckle_mob(mob/living/M, mob/user) // Attempt Unbuckle - if(!isvamp(user)) + if(!isbloodsucker(user)) if(M == user) M.visible_message("[user] tries to release themself from the rack!",\ "You attempt to release yourself from the rack!") // For sound if not seen --> "You hear a squishy wet noise.") @@ -454,7 +454,7 @@ /obj/structure/bloodsucker/candelabrum/examine(mob/user) . = ..() - if((isvamp()) || isobserver(user)) + if((isbloodsucker()) || isobserver(user)) . += {"This is a magical candle which drains at the sanity of mortals who are not under your command while it is active."} . += {"You can alt click on it from any range to turn it on remotely, or simply be next to it and click on it to turn it on and off normally."} /* if(user.mind.has_antag_datum(ANTAG_DATUM_VASSAL) @@ -463,12 +463,12 @@ /obj/structure/bloodsucker/candelabrum/attack_hand(mob/user) var/datum/antagonist/vassal/T = user.mind.has_antag_datum(ANTAG_DATUM_VASSAL) - if(isvamp(user) || istype(T)) + if(isbloodsucker(user) || istype(T)) toggle() /obj/structure/bloodsucker/candelabrum/AltClick(mob/user) // Bloodsuckers can turn their candles on from a distance. SPOOOOKY. - if(isvamp(user)) + if(isbloodsucker(user)) toggle() /obj/structure/bloodsucker/candelabrum/proc/toggle(mob/user) @@ -485,7 +485,7 @@ if(lit) for(var/mob/living/carbon/human/H in viewers(7, src)) var/datum/antagonist/vassal/T = H.mind.has_antag_datum(ANTAG_DATUM_VASSAL) - if(isvamp(H) || T) //We dont want vassals or vampires affected by this + if(isbloodsucker(H) || T) //We dont want vassals or vampires affected by this return H.hallucination = 20 SEND_SIGNAL(H, COMSIG_ADD_MOOD_EVENT, "vampcandle", /datum/mood_event/vampcandle) diff --git a/code/modules/mining/equipment/regenerative_core.dm b/code/modules/mining/equipment/regenerative_core.dm index e8ba72e62f..65304c5460 100644 --- a/code/modules/mining/equipment/regenerative_core.dm +++ b/code/modules/mining/equipment/regenerative_core.dm @@ -69,14 +69,15 @@ /obj/item/organ/regenerative_core/afterattack(atom/target, mob/user, proximity_flag) . = ..() - if(proximity_flag && ishuman(target)) + if(proximity_flag) + apply_healing_core(target, user) + +/obj/item/organ/regenerative_core/apply_healing_core(atom/target, mob/user) + if(ishuman(target)) var/mob/living/carbon/human/H = target if(inert) to_chat(user, "[src] has decayed and can no longer be used to heal.") return - if(isvamp(user)) - to_chat(user, "[src] breaks down as it fails to heal your unholy self") - return else if(H.stat == DEAD) to_chat(user, "[src] are useless on the dead.") @@ -87,22 +88,16 @@ else to_chat(user, "You start to smear [src] on yourself. It feels and smells disgusting, but you feel amazingly refreshed in mere moments.") SSblackbox.record_feedback("nested tally", "hivelord_core", 1, list("[type]", "used", "self")) - H.revive(full_heal = 1) + if(!isbloodsucker(H)) + H.revive(full_heal = TRUE) + else + H.revive(full_heal = FALSE) qdel(src) user.log_message("[user] used [src] to heal [H]! Wake the fuck up, Samurai!", LOG_ATTACK, color="green") //Logging for 'old' style legion core use, when clicking on a sprite of yourself or another. /obj/item/organ/regenerative_core/attack_self(mob/user) //Knouli's first hack! Allows for the use of the core in hand rather than needing to click on the target, yourself, to selfheal. Its a rip of the proc just above - but skips on distance check and only uses 'user' rather than 'target' - if(ishuman(user)) //Check if user is human, no need for distance check as it's self heal - var/mob/living/carbon/human/H = user //Set H to user rather than target - if(inert) //Inert cores are useless - to_chat(user, "[src] has decayed and can no longer be used to heal.") - return - else //Skip on check if the target to be healed is dead as, if you are dead, you're not going to be able to use it on yourself! - to_chat(user, "You start to smear [src] on yourself. It feels and smells disgusting, but you feel amazingly refreshed in mere moments.") - SSblackbox.record_feedback("nested tally", "hivelord_core", 1, list("[type]", "used", "self")) - H.revive(full_heal = 1) - qdel(src) - H.log_message("[H] used [src] to heal themselves! Making use of Knouli's sexy and intelligent use-in-hand proc!", LOG_ATTACK, color="green") //Logging for 'new' style legion core use, when using the core in-hand. + . = ..() + apply_healing_core(user) /obj/item/organ/regenerative_core/Insert(mob/living/carbon/M, special = 0, drop_if_replaced = TRUE) diff --git a/code/modules/mob/living/carbon/alien/special/facehugger.dm b/code/modules/mob/living/carbon/alien/special/facehugger.dm index 6947ab28f8..de65b775b4 100644 --- a/code/modules/mob/living/carbon/alien/special/facehugger.dm +++ b/code/modules/mob/living/carbon/alien/special/facehugger.dm @@ -252,7 +252,7 @@ return 0 if(M.getorgan(/obj/item/organ/alien/hivenode)) return 0 - if(isvamp(M)) + if(isbloodsucker(M)) return 0 if(ismonkey(M)) diff --git a/code/modules/mob/living/carbon/carbon.dm b/code/modules/mob/living/carbon/carbon.dm index 574a5aedd2..d07785873a 100644 --- a/code/modules/mob/living/carbon/carbon.dm +++ b/code/modules/mob/living/carbon/carbon.dm @@ -837,7 +837,7 @@ /mob/living/carbon/proc/can_defib() var/tlimit = DEFIB_TIME_LIMIT * 10 var/obj/item/organ/heart = getorgan(/obj/item/organ/heart) - if(suiciding || hellbound || HAS_TRAIT(src, TRAIT_HUSK)) + if(suiciding || hellbound || HAS_TRAIT(src, TRAIT_HUSK) || isbloodsucker()) return if((world.time - timeofdeath) > tlimit) return From fc64c0a0084668834ca3caff4ec19f265b4f13b7 Mon Sep 17 00:00:00 2001 From: Seris02 <49109742+Seris02@users.noreply.github.com> Date: Wed, 26 Feb 2020 18:02:07 +0800 Subject: [PATCH 007/113] yeah woops forgot that --- code/modules/clothing/shoes/miscellaneous.dm | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/code/modules/clothing/shoes/miscellaneous.dm b/code/modules/clothing/shoes/miscellaneous.dm index 45c7ad4102..4d4589bb6d 100644 --- a/code/modules/clothing/shoes/miscellaneous.dm +++ b/code/modules/clothing/shoes/miscellaneous.dm @@ -443,6 +443,7 @@ icon = 'icons/obj/module.dmi' icon_state = "bluespace_charge" item_flags = NOBLUDGEON + w_class = WEIGHT_CLASS_TINY var/uses = 6 /obj/item/bluespacerecharge/examine(mob/user) @@ -462,4 +463,4 @@ uses += 3 to_chat(user, "You insert [I] into [src].") B.use(10) - icon_state = initial(icon_state) \ No newline at end of file + icon_state = initial(icon_state) From 5d3f3fc06aca9da08a723127a2736e72ad18db59 Mon Sep 17 00:00:00 2001 From: Artur Date: Fri, 28 Feb 2020 14:11:38 +0200 Subject: [PATCH 008/113] WIP --- code/__DEFINES/is_helpers.dm | 1 + code/__HELPERS/unsorted.dm | 18 +++++- .../game/gamemodes/bloodsucker/bloodsucker.dm | 61 +++++++++--------- .../bloodsucker/bloodsucker_life.dm | 16 ++--- .../bloodsucker/datum_bloodsucker.dm | 24 +++---- .../bloodsucker/objects/bloodsucker_crypt.dm | 10 +-- .../antagonists/bloodsucker/powers/feed.dm | 12 +++- .../food_and_drinks/food/snacks_bread.dm | 12 ++++ .../food_and_drinks/food/snacks_meat.dm | 4 +- .../recipes/tablecraft/recipes_bread.dm | 10 +++ .../recipes/tablecraft/recipes_misc.dm | 3 +- code/modules/hydroponics/grown/garlic.dm | 28 ++++++++ .../carbon/human/species_types/vampire.dm | 6 ++ .../mob/living/simple_animal/hostile/mimic.dm | 1 + code/modules/projectiles/projectile/magic.dm | 2 +- .../chemistry/reagents/food_reagents.dm | 52 +++++++++++++++ icons/obj/hydroponics/growing.dmi | Bin 74172 -> 75144 bytes icons/obj/hydroponics/harvest.dmi | Bin 87028 -> 87285 bytes icons/obj/hydroponics/seeds.dmi | Bin 25641 -> 25871 bytes .../code/modules/reagents/objects/clothes.dm | 4 +- tgstation.dme | 1 + 21 files changed, 200 insertions(+), 65 deletions(-) create mode 100644 code/modules/hydroponics/grown/garlic.dm diff --git a/code/__DEFINES/is_helpers.dm b/code/__DEFINES/is_helpers.dm index 55bfcaff79..22abe1e4c8 100644 --- a/code/__DEFINES/is_helpers.dm +++ b/code/__DEFINES/is_helpers.dm @@ -67,6 +67,7 @@ GLOBAL_LIST_INIT(turfs_without_ground, typecacheof(list( #define iscatperson(A) (ishumanbasic(A) && istype(A.dna.species, /datum/species/human/felinid) ) #define isdwarf(A) (is_species(A, /datum/species/dwarf)) #define isdullahan(A) (is_species(A, /datum/species/dullahan)) +#define isvampire(A) (is_species(A,/datum/species/vampire)) // Citadel specific species #define isipcperson(A) (is_species(A, /datum/species/ipc)) diff --git a/code/__HELPERS/unsorted.dm b/code/__HELPERS/unsorted.dm index af2fb281e6..4193e813fa 100644 --- a/code/__HELPERS/unsorted.dm +++ b/code/__HELPERS/unsorted.dm @@ -1562,4 +1562,20 @@ GLOBAL_DATUM_INIT(dview_mob, /mob/dview, new) channels_to_use += channel if(channels_to_use.len) - world.TgsChatBroadcast() \ No newline at end of file + world.TgsChatBroadcast() + +//Checks to see if either the victim has a garlic necklace or garlic in their blood +/proc/sucking_checks(var/mob/living/carbon/target, check_neck, check_blood) + //Byppass this if the target isnt carbon. + if(!iscarbon) + return TRUE + if(check_neck) + if(istype(target.get_item_by_slot(SLOT_NECK), /obj/item/clothing/neck/garlic_necklace)) + to_chat(owner, "[victim] is wearing a garlic clove around their neck! You cant drink from them while it is on them!") + return FALSE + if(check_blood) + if(target.reagents.has_reagent(/datum/reagent/consumable/garlic)) + to_chat(target, "[H] tries to bite you, but recoils in disgust!") + to_chat(owner, "[victim] reeks of garlic! you can't bring yourself to drain such tainted blood.") + return FALSE + return TRUE diff --git a/code/game/gamemodes/bloodsucker/bloodsucker.dm b/code/game/gamemodes/bloodsucker/bloodsucker.dm index a45e989318..3cd68e3758 100644 --- a/code/game/gamemodes/bloodsucker/bloodsucker.dm +++ b/code/game/gamemodes/bloodsucker/bloodsucker.dm @@ -91,28 +91,19 @@ return ..() -// Checking for ACTUALLY Dead Vamps -/datum/game_mode/bloodsucker/are_special_antags_dead() - // Bloodsucker not Final Dead - for(var/datum/mind/bloodsucker in bloodsuckers) - if(!bloodsucker.AmFinalDeath()) - return FALSE - return TRUE - - // Init Sunlight (called from datum_bloodsucker.on_gain(), in case game mode isn't even Bloodsucker /datum/game_mode/proc/check_start_sunlight() // Already Sunlight (and not about to cancel) - if (istype(bloodsucker_sunlight) && !bloodsucker_sunlight.cancel_me) + if(istype(bloodsucker_sunlight) && !bloodsucker_sunlight.cancel_me) return bloodsucker_sunlight = new () // End Sun (last bloodsucker removed) /datum/game_mode/proc/check_cancel_sunlight() // No Sunlight - if (!istype(bloodsucker_sunlight)) + if(!istype(bloodsucker_sunlight)) return - if (bloodsuckers.len <= 0) + if(bloodsuckers.len <= 0) bloodsucker_sunlight.cancel_me = TRUE qdel(bloodsucker_sunlight) bloodsucker_sunlight = null @@ -158,14 +149,14 @@ /datum/game_mode/proc/make_bloodsucker(datum/mind/bloodsucker, datum/mind/creator = null) // NOTE: This is a game_mode/proc, NOT a game_mode/bloodsucker/proc! We need to access this function despite the game mode. - if (!can_make_bloodsucker(bloodsucker)) + if(!can_make_bloodsucker(bloodsucker)) return FALSE // Create Datum: Fledgling var/datum/antagonist/bloodsucker/A // [FLEDGLING] - if (creator) + if(creator) A = new (bloodsucker) A.creator = creator bloodsucker.add_antag_datum(A) @@ -187,7 +178,7 @@ /datum/game_mode/proc/clean_invalid_species(datum/mind/bloodsucker) // Only checking for Humans here - if (!ishuman(bloodsucker.current) || !bloodsucker.current.client) + if(!ishuman(bloodsucker.current) || !bloodsucker.current.client) return var/am_valid = TRUE var/mob/living/carbon/human/H = bloodsucker.current @@ -202,7 +193,7 @@ // everyone will wonder why you're a human with Plasma clothes (jk they'll know you're antag) // Convert to HUMAN (along with ID and PDA) - if (!am_valid) + if(!am_valid) H.set_species(/datum/species/human) H.real_name = H.client.prefs.custom_names["human"] var/obj/item/card/id/ID = H.wear_id?.GetID() @@ -211,12 +202,13 @@ ID.update_label() -/datum/game_mode/proc/can_make_vassal(mob/living/target, datum/mind/creator, display_warning=TRUE)//, check_antag_or_loyal=FALSE) +/datum/game_mode/proc/can_make_vassal(mob/living/target, datum/mind/creator, display_warning = TRUE)//, check_antag_or_loyal=FALSE) // Not Correct Type: Abort - if (!iscarbon(target) || !creator) + if(!iscarbon(target) || !creator) return FALSE - if (target.stat > UNCONSCIOUS) + if(target.stat > UNCONSCIOUS) return FALSE + // Check Overdose: Am I even addicted to blood? Do I even have any in me? //if (!target.reagents.addiction_list || !target.reagents.reagent_list) //message_admins("DEBUG2: can_make_vassal() Abort: No reagents") @@ -233,23 +225,23 @@ //message_admins("DEBUG4: can_make_vassal() Abort: No Blood") // return 0 // No Mind! - if (!target.mind || !target.mind.key) - if (display_warning) + if(!target.mind || !target.mind.key) + if(display_warning) to_chat(creator, "[target] isn't self-aware enough to be made into a Vassal.") return FALSE // Already MY Vassal var/datum/antagonist/vassal/V = target.mind.has_antag_datum(ANTAG_DATUM_VASSAL) - if (istype(V) && V.master) - if (V.master.owner == creator) - if (display_warning) + if(istype(V) && V.master) + if(V.master.owner == creator) + if(display_warning) to_chat(creator, "[target] is already your loyal Vassal!") else - if (display_warning) + if(display_warning) to_chat(creator, "[target] is the loyal Vassal of another Bloodsucker!") return FALSE // Already Antag or Loyal (Vamp Hunters count as antags) - if (target.mind.enslaved_to || AmInvalidAntag(target.mind)) //!VassalCheckAntagValid(target.mind, check_antag_or_loyal)) // HAS_TRAIT(target, TRAIT_MINDSHIELD, "implant") || - if (display_warning) + if(target.mind.enslaved_to || AmInvalidAntag(target.mind)) //!VassalCheckAntagValid(target.mind, check_antag_or_loyal)) // HAS_TRAIT(target, TRAIT_MINDSHIELD, "implant") || + if(display_warning) to_chat(creator, "[target] resists the power of your blood to dominate their mind!") return FALSE return TRUE @@ -268,15 +260,15 @@ return FALSE // Does even ONE antag appear in this mind that isn't in the list? Then FAIL! for(var/datum/antagonist/antag_datum in M.antag_datums) - if (!(antag_datum.type in vassal_allowed_antags)) // vassal_allowed_antags is a list stored in the game mode, above. + if(!(antag_datum.type in vassal_allowed_antags)) // vassal_allowed_antags is a list stored in the game mode, above. //message_admins("DEBUG VASSAL: Found Invalid: [antag_datum] // [antag_datum.type]") return TRUE //message_admins("DEBUG VASSAL: Valid Antags! (total of [M.antag_datums.len])") // WHEN YOU DELETE THE ABOVE: Remove the 3 second timer on converting the vassal too. return FALSE -/datum/game_mode/proc/make_vassal(mob/living/target, datum/mind/creator) - if (!can_make_vassal(target,creator)) +/datum/game_mode/proc/make_vassal(/mob/living/target, /datum/mind/creator) + if(!can_make_vassal(target, creator)) return FALSE // Make Vassal var/datum/antagonist/vassal/V = new (target.mind) @@ -292,3 +284,12 @@ /datum/game_mode/proc/remove_vassal(datum/mind/vassal) vassal.remove_antag_datum(ANTAG_DATUM_VASSAL) + +/datum/game_mode/proc/count_vassals(datum/mind/master) + var/datum/antagonist/bloodsucker/B = master.has_antag_datum(ANTAG_DATUM_BLOODSUCKER) + var/vassal_amount + len(B.vassals) + return vassal_amount + + + \ No newline at end of file diff --git a/code/modules/antagonists/bloodsucker/bloodsucker_life.dm b/code/modules/antagonists/bloodsucker/bloodsucker_life.dm index 0179c60ef1..4101d55df1 100644 --- a/code/modules/antagonists/bloodsucker/bloodsucker_life.dm +++ b/code/modules/antagonists/bloodsucker/bloodsucker_life.dm @@ -25,7 +25,7 @@ HandleStarving() // Death HandleDeath() // Standard Update update_hud()// Daytime Sleep in Coffin - if (SSticker.mode.is_daylight() && !HAS_TRAIT_FROM(owner.current, TRAIT_DEATHCOMA, "bloodsucker")) + if(SSticker.mode.is_daylight() && !HAS_TRAIT_FROM(owner.current, TRAIT_DEATHCOMA, "bloodsucker")) if(istype(owner.current.loc, /obj/structure/closet/crate/coffin)) Torpor_Begin() // Wait before next pass @@ -82,15 +82,15 @@ /datum/antagonist/bloodsucker/proc/HandleHealing(mult = 1) // NOTE: Mult of 0 is just a TEST to see if we are injured and need to go into Torpor! //It is called from your coffin on close (by you only) - if(poweron_masquerade == TRUE || owner.current.AmStaked()) + if(poweron_masquerade == TRUE || owner.current.AmStaked() || owner?.reagents?.has_reagent(/datum/reagent/consumable/garlic) return FALSE owner.current.adjustStaminaLoss(-1.5 + (regenRate * -7) * mult, 0) // Humans lose stamina damage really quickly. Vamps should heal more. owner.current.adjustCloneLoss(-0.1 * (regenRate * 2) * mult, 0) owner.current.adjustOrganLoss(ORGAN_SLOT_BRAIN, -1 * (regenRate * 4) * mult) //adjustBrainLoss(-1 * (regenRate * 4) * mult, 0) // No Bleeding - if(ishuman(owner.current)) //NOTE Current bleeding is horrible, not to count the amount of blood ballistics delete. + if(ishuman(owner.current) && bleed_rate => 0) //NOTE Current bleeding is horrible, not to count the amount of blood ballistics delete. var/mob/living/carbon/human/H = owner.current - H.bleed_rate = 0 + H.bleed_rate =- 1 if(iscarbon(owner.current)) // Damage Heal: Do I have damage to ANY bodypart? var/mob/living/carbon/C = owner.current var/costMult = 1 // Coffin makes it cheaper @@ -305,17 +305,17 @@ ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////// /mob/proc/CheckBloodsuckerEatFood(var/food_nutrition) - if (!isliving(src)) + if(!isliving(src)) return var/mob/living/L = src if(!L.AmBloodsucker()) return - // We're a vamp? Try to eat food... + // We're a bloodsucker? Try to eat food... var/datum/antagonist/bloodsucker/bloodsuckerdatum = mind.has_antag_datum(ANTAG_DATUM_BLOODSUCKER) - bloodsuckerdatum.handle_eat_human_food(food_nutrition) + bloodsuckerdatum.bloodsucker_disgust(food_nutrition) -/datum/antagonist/bloodsucker/proc/handle_eat_human_food(var/food_nutrition) // Called from snacks.dm and drinks.dm +/datum/antagonist/bloodsucker/proc/bloodsucker_disgust(var/food_nutrition) // Called from snacks.dm and drinks.dm set waitfor = FALSE if(!owner.current || !iscarbon(owner.current)) return diff --git a/code/modules/antagonists/bloodsucker/datum_bloodsucker.dm b/code/modules/antagonists/bloodsucker/datum_bloodsucker.dm index 5207f7a66d..19a7a2889e 100644 --- a/code/modules/antagonists/bloodsucker/datum_bloodsucker.dm +++ b/code/modules/antagonists/bloodsucker/datum_bloodsucker.dm @@ -655,13 +655,13 @@ var/datum/antagonist/vassal/mob_V = M.mind.has_antag_datum(ANTAG_DATUM_VASSAL) // Check 2) If they are a BLOODSUCKER, then are they my Master? if (mob_V && atom_B == mob_V.master) - return TRUE // SUCCESS! + return TRUE // Check 3) If I am a BLOODSUCKER, then are they my Vassal? if (mob_B && atom_V && (atom_V in mob_B.vassals)) - return TRUE // SUCCESS! + return TRUE // Check 4) If we are both VASSAL, then do we have the same master? if (atom_V && mob_V && atom_V.master == mob_V.master) - return TRUE // SUCCESS! + return TRUE return FALSE @@ -719,12 +719,12 @@ invisibility = INVISIBILITY_ABSTRACT /obj/screen/bloodsucker/proc/update_counter(value, valuecolor) - invisibility = 0 // Make Visible + invisibility = 0 -/obj/screen/bloodsucker/blood_counter // NOTE: Look up /obj/screen/devil/soul_counter in _onclick / hud / human.dm - icon = 'icons/mob/actions/bloodsucker.dmi'//'icons/mob/screen_gen.dmi' +/obj/screen/bloodsucker/blood_counter + icon = 'icons/mob/actions/bloodsucker.dmi' name = "Blood Consumed" - icon_state = "blood_display"//"power_display" + icon_state = "blood_display" screen_loc = ui_blood_display /obj/screen/bloodsucker/blood_counter/update_counter(value, valuecolor) @@ -749,22 +749,22 @@ /datum/antagonist/bloodsucker/proc/update_sunlight(value, amDay = FALSE) // No Hud? Get out. - if (!owner.current.hud_used) + if(!owner.current.hud_used) return // Update Sun Time - if (owner.current.hud_used.sunlight_display) + if(owner.current.hud_used.sunlight_display) var/valuecolor = "#BBBBFF" - if (amDay) + if(amDay) valuecolor = "#FF5555" else if(value <= 25) valuecolor = "#FFCCCC" else if(value < 10) valuecolor = "#FF5555" - var/value_string = (value >= 60) ? "[round(value / 60, 1)] m" : "[round(value,1)] s" + var/value_string = (value >= 60) ? "[round(value / 60, 1)] m" : "[round(value, 1)] s" owner.current.hud_used.sunlight_display.update_counter( value_string, valuecolor ) owner.current.hud_used.sunlight_display.icon_state = "sunlight_" + (amDay ? "day":"night") /obj/screen/bloodsucker/sunlight_counter/update_counter(value, valuecolor) ..() - maptext = "

[value]
" + maptext = "
[value]
" diff --git a/code/modules/antagonists/bloodsucker/objects/bloodsucker_crypt.dm b/code/modules/antagonists/bloodsucker/objects/bloodsucker_crypt.dm index 9e46203483..f9ba36e2c2 100644 --- a/code/modules/antagonists/bloodsucker/objects/bloodsucker_crypt.dm +++ b/code/modules/antagonists/bloodsucker/objects/bloodsucker_crypt.dm @@ -258,7 +258,7 @@ /obj/structure/bloodsucker/vassalrack/proc/torture_victim(mob/living/user, mob/living/target) var/datum/antagonist/bloodsucker/bloodsuckerdatum = user.mind.has_antag_datum(ANTAG_DATUM_BLOODSUCKER) // Check Bloodmob/living/M, force = FALSE, check_loc = TRUE - var/convert_cost = 200 + 200 * bloodsuckerdatum.vassals + var/convert_cost = 200 if(user.blood_volume < convert_cost + 5) to_chat(user, "You don't have enough blood to initiate the Dark Communion with [target].") return @@ -321,15 +321,15 @@ // to_chat(user, "The ritual has been interrupted!") // useLock = FALSE // return - user.playsound_local(null, 'sound/effects/explosion_distant.ogg', 40, 1) // Play THIS sound for user only. The "null" is where turf would go if a location was needed. Null puts it right in their head. - target.playsound_local(null, 'sound/effects/explosion_distant.ogg', 40, 1) // Play THIS sound for user only. The "null" is where turf would go if a location was needed. Null puts it right in their head. - target.playsound_local(null, 'sound/effects/singlebeat.ogg', 40, 1) // Play THIS sound for user only. The "null" is where turf would go if a location was needed. Null puts it right in their head. + user.playsound_local(null, 'sound/effects/explosion_distant.ogg', 40, TRUE) + target.playsound_local(null, 'sound/effects/explosion_distant.ogg', 40, TRUE) + target.playsound_local(null, 'sound/effects/singlebeat.ogg', 40, TRUE) target.Jitter(25) target.emote("laugh") //remove_victim(target) // Remove on CLICK ONLY! useLock = FALSE -/obj/structure/bloodsucker/vassalrack/proc/do_torture(mob/living/user, mob/living/target, mult=1) +/obj/structure/bloodsucker/vassalrack/proc/do_torture(mob/living/user, mob/living/target, mult = 1) var/torture_time = 15 // Fifteen seconds if you aren't using anything. Shorter with weapons and such. var/torture_dmg_brute = 2 var/torture_dmg_burn = 0 diff --git a/code/modules/antagonists/bloodsucker/powers/feed.dm b/code/modules/antagonists/bloodsucker/powers/feed.dm index f9ff31d94a..2ae41e7c02 100644 --- a/code/modules/antagonists/bloodsucker/powers/feed.dm +++ b/code/modules/antagonists/bloodsucker/powers/feed.dm @@ -67,6 +67,12 @@ if(display_error) to_chat(owner, "Your victim's blood is not suitable for you to take.") return FALSE + if(iscarbon(owner)) + //We want to check if the target is wearing a garlic necklance. + if(istype(owner.get_item_by_slot(SLOT_NECK), /obj/item/clothing/neck/garlic_necklace)) + if(display_error) + to_chat(owner, "Your victim is wearing a garlic clove on their neck! Disgusting!") + return FALSE return TRUE // If I'm not grabbing someone, find me someone nearby. @@ -140,7 +146,7 @@ to_chat(user, "You lean quietly toward [target] and secretly draw out your fangs...") else to_chat(user, "You pull [target] close to you and draw out your fangs...") - if(!do_mob(user, target, feed_time,0,1,extra_checks=CALLBACK(src, .proc/ContinueActive, user, target)))//sleep(10) + if(!do_mob(user, target, feed_time, 0, 1, extra_checks = CALLBACK(src, .proc/ContinueActive, user, target)))//sleep(10) to_chat(user, "Your feeding was interrupted.") //DeactivatePower(user,target) return @@ -166,7 +172,7 @@ var/deadmessage = target.stat == DEAD ? "" : " [target.p_they(TRUE)] looks dazed, and will not remember this." user.visible_message("[user] puts [target]'s wrist up to [user.p_their()] mouth.", \ "You secretly slip your fangs into [target]'s wrist.[deadmessage]", \ - vision_distance = notice_range, ignored_mobs=target) // Only people who AREN'T the target will notice this action. + vision_distance = notice_range, ignored_mobs = target) // Only people who AREN'T the target will notice this action. // Warn Feeder about Witnesses... var/was_unnoticed = TRUE for(var/mob/living/M in viewers(notice_range, owner)) @@ -299,7 +305,7 @@ SEND_SIGNAL(user, COMSIG_ADD_MOOD_EVENT, "drankkilled", /datum/mood_event/drankkilled) // BAD // in bloodsucker_life.dm /datum/action/bloodsucker/feed/ContinueActive(mob/living/user, mob/living/target) - return ..() && target && (!target_grappled || user.pulling == target)// Active, and still Antag, + return ..() && target && (!target_grappled || user.pulling == target) && sucking_checks(target, TRUE, TRUE) // Active, and still Antag, // NOTE: We only care about pulling if target started off that way. Mostly only important for Aggressive feed. /datum/action/bloodsucker/feed/proc/ApplyVictimEffects(mob/living/target) diff --git a/code/modules/food_and_drinks/food/snacks_bread.dm b/code/modules/food_and_drinks/food/snacks_bread.dm index b18dfc7968..9866e306c6 100644 --- a/code/modules/food_and_drinks/food/snacks_bread.dm +++ b/code/modules/food_and_drinks/food/snacks_bread.dm @@ -179,6 +179,18 @@ tastes = list("bread" = 1) foodtype = GRAIN +/obj/item/reagent_containers/food/snacks/garlicbread + name = "garlic bread" + desc = "Alas, it is limited." + icon = 'icons/obj/food/burgerbread.dmi' + icon_state = "garlicbread" + item_state = "garlicbread" + bonus_reagents = list(/datum/reagent/consumable/nutriment = 5, /datum/reagent/consumable/vitamin = 2) + list_reagents = list(/datum/reagent/consumable/nutriment = 5, /datum/reagent/consumable/vitamin = 4, /datum/reagent/consumable/garlic = 2) + bitesize = 3 + tastes = list("bread" = 1, "garlic" = 1, "butter" = 1) + foodtype = GRAIN + /obj/item/reagent_containers/food/snacks/deepfryholder name = "Deep Fried Foods Holder Obj" desc = "If you can see this description the code for the deep fryer fucked up." diff --git a/code/modules/food_and_drinks/food/snacks_meat.dm b/code/modules/food_and_drinks/food/snacks_meat.dm index 9bf95f65db..53299b9c5b 100644 --- a/code/modules/food_and_drinks/food/snacks_meat.dm +++ b/code/modules/food_and_drinks/food/snacks_meat.dm @@ -196,7 +196,7 @@ name = "raw khinkali" desc = "One hundred khinkalis? Do I look like a pig?" icon_state = "khinkali" - list_reagents = list(/datum/reagent/consumable/nutriment = 1, /datum/reagent/consumable/nutriment/vitamin = 1) + list_reagents = list(/datum/reagent/consumable/nutriment = 1, /datum/reagent/consumable/nutriment/vitamin = 1, /datum/reagent/consumable/garlic = 1) cooked_type = /obj/item/reagent_containers/food/snacks/khinkali tastes = list("meat" = 1, "onions" = 1, "garlic" = 1) foodtype = MEAT @@ -205,7 +205,7 @@ name = "khinkali" desc = "One hundred khinkalis? Do I look like a pig?" icon_state = "khinkali" - list_reagents = list(/datum/reagent/consumable/nutriment = 4, /datum/reagent/consumable/nutriment/vitamin = 2) + list_reagents = list(/datum/reagent/consumable/nutriment = 5, /datum/reagent/consumable/nutriment/vitamin = 2, /datum/reagent/consumable/garlic = 1) bitesize = 3 filling_color = "#F0F0F0" tastes = list("meat" = 1, "onions" = 1, "garlic" = 1) diff --git a/code/modules/food_and_drinks/recipes/tablecraft/recipes_bread.dm b/code/modules/food_and_drinks/recipes/tablecraft/recipes_bread.dm index c3890b28eb..335078eb4c 100644 --- a/code/modules/food_and_drinks/recipes/tablecraft/recipes_bread.dm +++ b/code/modules/food_and_drinks/recipes/tablecraft/recipes_bread.dm @@ -125,6 +125,16 @@ result = /obj/item/reagent_containers/food/snacks/baguette subcategory = CAT_BREAD +/datum/crafting_recipe/food/garlicbread + name = "Garlic Bread" + time = 40 + reqs = list(/obj/item/reagent_containers/food/snacks/grown/garlic = 1, + /obj/item/reagent_containers/food/snacks/breadslice/plain = 1, + /obj/item/reagent_containers/food/snacks/butter = 1 + ) + result = /obj/item/reagent_containers/food/snacks/garlicbread + subcategory = CAT_BREAD + /datum/crafting_recipe/food/butterbiscuit name = "Butter Biscuit" reqs = list( diff --git a/code/modules/food_and_drinks/recipes/tablecraft/recipes_misc.dm b/code/modules/food_and_drinks/recipes/tablecraft/recipes_misc.dm index 6a622d6719..8f9e7ff0b7 100644 --- a/code/modules/food_and_drinks/recipes/tablecraft/recipes_misc.dm +++ b/code/modules/food_and_drinks/recipes/tablecraft/recipes_misc.dm @@ -28,7 +28,8 @@ name = "Raw Khinkali" reqs = list( /obj/item/reagent_containers/food/snacks/doughslice = 1, - /obj/item/reagent_containers/food/snacks/faggot = 1 + /obj/item/reagent_containers/food/snacks/faggot = 1, + /obj/item/reagent_containers/food/snacks/grown/garlic = 1 ) result = /obj/item/reagent_containers/food/snacks/rawkhinkali subcategory = CAT_MISCFOOD diff --git a/code/modules/hydroponics/grown/garlic.dm b/code/modules/hydroponics/grown/garlic.dm new file mode 100644 index 0000000000..7ee8aab9a8 --- /dev/null +++ b/code/modules/hydroponics/grown/garlic.dm @@ -0,0 +1,28 @@ +/obj/item/seeds/garlic + name = "pack of garlic seeds" + desc = "A packet of extremely pungent seeds." + icon_state = "seed-garlic" + species = "garlic" + plantname = "Garlic Sprouts" + product = /obj/item/reagent_containers/food/snacks/grown/garlic + yield = 6 + potency = 25 + growthstages = 3 + growing_icon = 'icons/obj/hydroponics/growing_vegetables.dmi' + reagents_add = list(/datum/reagent/consumable/garlic = 0.15, /datum/reagent/consumable/nutriment = 0.1) + +/obj/item/reagent_containers/food/snacks/grown/garlic + seed = /obj/item/seeds/garlic + name = "garlic" + desc = "Delicious, but with a potentially overwhelming odor." + icon_state = "garlic" + filling_color = "#C0C9A0" + bitesize_mod = 2 + tastes = list("garlic" = 1) + wine_power = 10 + +/obj/item/clothing/neck/garlic_necklace + name = "garlic necklace" + desc = "A clove of garlic on a string, tied to itself in a circle, just might fit around your neck. For paranoid people who fear getting their blood sucked." + icon_state = "garlic_necklace" + \ No newline at end of file diff --git a/code/modules/mob/living/carbon/human/species_types/vampire.dm b/code/modules/mob/living/carbon/human/species_types/vampire.dm index 8bbd870149..b62b8304da 100644 --- a/code/modules/mob/living/carbon/human/species_types/vampire.dm +++ b/code/modules/mob/living/carbon/human/species_types/vampire.dm @@ -81,6 +81,9 @@ if(H.blood_volume >= BLOOD_VOLUME_MAXIMUM) to_chat(H, "You're already full!") return + //This checks whether or not they are wearing a garlic clove on their neck + if(sucking_checks(victim, TRUE, FALSE)) + return if(victim.stat == DEAD) to_chat(H, "You need a living victim!") return @@ -92,6 +95,9 @@ to_chat(victim, "[H] tries to bite you, but stops before touching you!") to_chat(H, "[victim] is blessed! You stop just in time to avoid catching fire.") return + //Here we check now for both the garlic cloves on the neck and for blood in the victims bloodstream. + if(sucking_checks(victim, TRUE, TRUE)) + return if(!do_after(H, 30, target = victim)) return var/blood_volume_difference = BLOOD_VOLUME_MAXIMUM - H.blood_volume //How much capacity we have left to absorb blood diff --git a/code/modules/mob/living/simple_animal/hostile/mimic.dm b/code/modules/mob/living/simple_animal/hostile/mimic.dm index 16a55421b8..83af522962 100644 --- a/code/modules/mob/living/simple_animal/hostile/mimic.dm +++ b/code/modules/mob/living/simple_animal/hostile/mimic.dm @@ -11,6 +11,7 @@ speed = 0 maxHealth = 250 health = 250 + blood_volume = 0 gender = NEUTER mob_biotypes = NONE diff --git a/code/modules/projectiles/projectile/magic.dm b/code/modules/projectiles/projectile/magic.dm index 7608e5f4a8..11523d3afa 100644 --- a/code/modules/projectiles/projectile/magic.dm +++ b/code/modules/projectiles/projectile/magic.dm @@ -284,7 +284,7 @@ if(L.mind) L.mind.transfer_to(S) if(owner) - to_chat(S, "You are an animate statue. You cannot move when monitored, but are nearly invincible and deadly when unobserved! Do not harm [owner], your creator.") + to_chat(S, "You are an animated statue. You cannot move when monitored, but are nearly invincible and deadly when unobserved! Do not harm [owner], your creator.") P.forceMove(S) return else diff --git a/code/modules/reagents/chemistry/reagents/food_reagents.dm b/code/modules/reagents/chemistry/reagents/food_reagents.dm index 52eee9f8ea..9218df1ad1 100644 --- a/code/modules/reagents/chemistry/reagents/food_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/food_reagents.dm @@ -423,6 +423,58 @@ M.emote(pick("twitch","giggle")) ..() +/datum/reagent/consumable/garlic //NOTE: having garlic in your blood stops vampires from biting you. + name = "Garlic Juice" + id = "garlic" + description = "Crushed garlic. Chefs love it, but it can make you smell bad." + color = "#FEFEFE" + taste_description = "garlic" + metabolization_rate = 0.15 * REAGENTS_METABOLISM + +/datum/reagent/consumable/garlic/on_mob_life(mob/living/carbon/M) + if(isvampire(M)) //incapacitating but not lethal. Unfortunately, vampires cannot vomit. + if(prob(min(25, current_cycle))) + to_chat(M, "You can't get the scent of garlic out of your nose! You can barely think...") + M.Paralyze(10) + M.Jitter(10) + return + else if(isbloodsucker(M)) + var/datum/antagonist/bloodsucker/bloodsuckerdatum = M.mind.has_antag_datum(ANTAG_DATUM_BLOODSUCKER) + switch(method) + if(INGEST) + if(prob(min(30, current_cycle))) + to_chat(M, "You cant get the smell of garlic out of your nose! You cant think straight because of it!") + M.Jitter(15) + return + if(prob(min(15, current_cycle))) + M.visible_message("Something you ate is burning your stomach!", / + "[M] clutches their stomach and falls to the ground!" + ) + M.Knockdown(20) + M.emote("scream") + return + if(prob(min(5, current_cycle))) + M.vomit() + return + if(INJECT) + if(prob(min(20, current_cycle))) + to_chat(M, "You feel like your veins are boiling!") + M.emote("scream") + M.adjustFireLoss(5) + return + if(prob(min(5, current_cycle))) + to_chat(M, "You are trying to purge the contaminants from your blood!") + M.vomit() + return + + else if(ishuman(M)) + var/mob/living/carbon/human/H = M + if(H.job == "Cook") + if(prob(20)) //stays in the system much longer than sprinkles/banana juice, so heals slower to partially compensate + H.heal_bodypart_damage(1, 1, 0) + . = 1 + ..() + /datum/reagent/consumable/sprinkles name = "Sprinkles" value = 3 diff --git a/icons/obj/hydroponics/growing.dmi b/icons/obj/hydroponics/growing.dmi index 712ea11a3b7a0e1a6c1f595882d26ca9f4136fe2..c93865ca77bae041846d0069c1ae0c5dece1e9a1 100644 GIT binary patch delta 19548 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

8&ogCVpgZVyQwxxvgAJjpH0A);f0~9xx>R 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 WEBG994ch|%G~7>mJJ%j3(*6O8_^8tW diff --git a/icons/obj/hydroponics/harvest.dmi b/icons/obj/hydroponics/harvest.dmi index e746d8f43d7b16c2207e5f00623f75c7e9c80688..c7c31581f3eb486c34e22574f4a3cedcd88ff062 100644 GIT binary patch delta 20535 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 diff --git a/icons/obj/hydroponics/seeds.dmi b/icons/obj/hydroponics/seeds.dmi index 43e231cbab93cca9acc55113aa042b547f75eb07..62843e3f54f903007e1dd9bfd61e3e883ddbf5a6 100644 GIT binary patch delta 6140 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 PB7b_?##-f?juHO@f?zAP delta 5908 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 diff --git a/modular_citadel/code/modules/reagents/objects/clothes.dm b/modular_citadel/code/modules/reagents/objects/clothes.dm index 4707d5b460..457f1dfb39 100644 --- a/modular_citadel/code/modules/reagents/objects/clothes.dm +++ b/modular_citadel/code/modules/reagents/objects/clothes.dm @@ -5,7 +5,7 @@ name = "Synthetic hat" icon = 'icons/obj/clothing/hats.dmi' icon_state = "cowboy" - desc = "A sythesized hat, you can't seem to take it off. And tips their hat." + desc = "A synthesized hat, you can't seem to take it off. And tips their hat." armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 0, "acid" = 0) //item_flags = NODROP //Tips their hat! @@ -25,7 +25,7 @@ /obj/item/clothing/head/hattip/MouseDrop(atom/over_object) //You sure do love tipping your hat. - if(usr) + if(user) var/mob/living/carbon/C = usr if(is_ninja(C)) to_chat(C, "Using your superior ninja reflexes, you take the hat off before tipping.") diff --git a/tgstation.dme b/tgstation.dme index ee098a0ec7..f9a4b3fe7b 100644 --- a/tgstation.dme +++ b/tgstation.dme @@ -1902,6 +1902,7 @@ #include "code\modules\hydroponics\grown\cotton.dm" #include "code\modules\hydroponics\grown\eggplant.dm" #include "code\modules\hydroponics\grown\flowers.dm" +#include "code\modules\hydroponics\grown\garlic.dm" #include "code\modules\hydroponics\grown\grass_carpet.dm" #include "code\modules\hydroponics\grown\kudzu.dm" #include "code\modules\hydroponics\grown\melon.dm" From 97315940fe84c70069854f7c7129f944dbf28d6e Mon Sep 17 00:00:00 2001 From: Ghommie <42542238+Ghommie@users.noreply.github.com> Date: Sun, 8 Mar 2020 01:01:21 +0100 Subject: [PATCH 009/113] Polychromic element. --- code/__DEFINES/components.dm | 1 + code/__HELPERS/_lists.dm | 21 +++ code/controllers/subsystem/dcs.dm | 5 +- code/datums/action.dm | 49 ++++--- code/datums/components/storage/storage.dm | 2 +- code/datums/components/virtual_reality.dm | 2 +- code/datums/elements/polychromic.dm | 127 ++++++++++++++++++ .../elements/update_icon_updates_onmob.dm | 2 +- code/game/objects/items.dm | 7 + .../modules/mob/living/carbon/update_icons.dm | 9 -- icons/mob/actions/backgrounds.dmi | Bin 6061 -> 18620 bytes tgstation.dme | 1 + 12 files changed, 188 insertions(+), 38 deletions(-) create mode 100644 code/datums/elements/polychromic.dm diff --git a/code/__DEFINES/components.dm b/code/__DEFINES/components.dm index 56cf681a27..ff0750a28c 100644 --- a/code/__DEFINES/components.dm +++ b/code/__DEFINES/components.dm @@ -255,6 +255,7 @@ #define COMSIG_ITEM_IMBUE_SOUL "item_imbue_soul" //return a truthy value to prevent ensouling, checked in /obj/effect/proc_holder/spell/targeted/lichdom/cast(): (mob/user) #define COMSIG_ITEM_HIT_REACT "item_hit_react" //from base of obj/item/hit_reaction(): (list/args) #define COMSIG_ITEM_WEARERCROSSED "wearer_crossed" //called on item when crossed by something (): (/atom/movable) +#define COMSIG_ITEM_WORN_OVERLAYS "item_worn_overlays" //from base of obj/item/worn_overlays(): (isinhands, icon_file, style_flags, list/overlays) // /obj/item/clothing signals #define COMSIG_SHOES_STEP_ACTION "shoes_step_action" //from base of obj/item/clothing/shoes/proc/step_action(): () diff --git a/code/__HELPERS/_lists.dm b/code/__HELPERS/_lists.dm index f16b566b00..8887a2aa1d 100644 --- a/code/__HELPERS/_lists.dm +++ b/code/__HELPERS/_lists.dm @@ -550,6 +550,27 @@ for(var/thing in flat_list) .[thing] = TRUE +/proc/deep_list2params(list/deep_list) + var/list/L = list() + for(var/i in deep_list) + var/key = i + if(isnum(key)) + key = "[key]" + continue + if(islist(key)) + key = deep_list2params(key) + else if(!istext(key)) + key = "[REF(key)]" + L += "[key]" + var/value = deep_list[key] + if(!isnull(value)) + if(islist(value)) + value = deep_list2params(value) + else if(!(istext(key) || isnum(key))) + value = "[REF(value)]" + L["[key]"] = "[value]" + return list2params(L) + //Picks from the list, with some safeties, and returns the "default" arg if it fails #define DEFAULTPICK(L, default) ((islist(L) && length(L)) ? pick(L) : default) diff --git a/code/controllers/subsystem/dcs.dm b/code/controllers/subsystem/dcs.dm index faf95fd319..19a1ac26b5 100644 --- a/code/controllers/subsystem/dcs.dm +++ b/code/controllers/subsystem/dcs.dm @@ -16,7 +16,10 @@ PROCESSING_SUBSYSTEM_DEF(dcs) if(istext(argument) || isnum(argument)) fullid += "[argument]" else - fullid += "[REF(argument)]" + if(islist(argument)) + fullid += deep_list2params(argument) + else + fullid += "[REF(argument)]" element_id = fullid.Join("&") . = elements_by_type[element_id] diff --git a/code/datums/action.dm b/code/datums/action.dm index f1df2a80d8..65db324b2b 100644 --- a/code/datums/action.dm +++ b/code/datums/action.dm @@ -6,13 +6,15 @@ /datum/action var/name = "Generic Action" var/desc = null - var/obj/target = null + var/atom/target = null var/check_flags = 0 var/required_mobility_flags = MOBILITY_USE var/processing = FALSE var/obj/screen/movable/action_button/button = null var/buttontooltipstyle = "" var/transparent_when_unavailable = TRUE + var/use_target_appearance = FALSE + var/list/target_appearance_matrix //if set, will be used to transform the target button appearance as an arglist. var/button_icon = 'icons/mob/actions/backgrounds.dmi' //This is the file for the BACKGROUND icon var/background_icon_state = ACTION_BUTTON_DEFAULT_BACKGROUND //And this is the state for the background icon @@ -88,7 +90,7 @@ /datum/action/proc/Trigger() if(!IsAvailable()) return FALSE - if(SEND_SIGNAL(src, COMSIG_ACTION_TRIGGER, src) & COMPONENT_ACTION_BLOCK_TRIGGER) + if(SEND_SIGNAL(src, COMSIG_ACTION_TRIGGER, target) & COMPONENT_ACTION_BLOCK_TRIGGER) return FALSE return TRUE @@ -116,7 +118,9 @@ return TRUE /datum/action/proc/UpdateButtonIcon(status_only = FALSE, force = FALSE) - if(button) + if(!button) + return + if(button_icon && button_icon_state) if(!status_only) button.name = name button.desc = desc @@ -134,11 +138,22 @@ ApplyIcon(button, force) - if(!IsAvailable()) - button.color = transparent_when_unavailable ? rgb(128,0,0,128) : rgb(128,0,0) - else - button.color = rgb(255,255,255,255) - return 1 + else if(use_target_appearance && target && button.appearance_cache != target.appearance) //replace with /ref comparison if this is not valid. + var/mutable_appearance/M = new(target) + M.layer = FLOAT_LAYER + M.plane = FLOAT_PLANE + if(target_appearance_matrix) + var/list/L = target_appearance_matrix + M.transform = matrix(L[1], L[2], L[3], L[4], L[5], L[6]) + button.cut_overlays() + button.add_overlay(M) + button.appearance_cache = target.appearance + + if(!IsAvailable()) + button.color = transparent_when_unavailable ? rgb(128,0,0,128) : rgb(128,0,0) + else + button.color = rgb(255,255,255,255) + return 1 /datum/action/proc/ApplyIcon(obj/screen/movable/action_button/current_button, force = FALSE) if(icon_icon && button_icon_state && ((current_button.button_icon_state != button_icon_state) || force)) @@ -165,6 +180,7 @@ /datum/action/item_action check_flags = AB_CHECK_RESTRAINED|AB_CHECK_STUN|AB_CHECK_LYING|AB_CHECK_CONSCIOUS button_icon_state = null + use_target_appearance = TRUE // If you want to override the normal icon being the item // then change this to an icon state @@ -188,23 +204,6 @@ I.ui_action_click(owner, src) return 1 -/datum/action/item_action/ApplyIcon(obj/screen/movable/action_button/current_button, force) - if(button_icon && button_icon_state) - // If set, use the custom icon that we set instead - // of the item appearence - ..() - else if(target && current_button.appearance_cache != target.appearance) //replace with /ref comparison if this is not valid. - var/obj/item/I = target - var/old_layer = I.layer - var/old_plane = I.plane - I.layer = FLOAT_LAYER //AAAH - I.plane = FLOAT_PLANE //^ what that guy said - current_button.cut_overlays() - current_button.add_overlay(I) - I.layer = old_layer - I.plane = old_plane - current_button.appearance_cache = I.appearance - /datum/action/item_action/toggle_light name = "Toggle Light" diff --git a/code/datums/components/storage/storage.dm b/code/datums/components/storage/storage.dm index ea72a8a6dd..3ed66dcf92 100644 --- a/code/datums/components/storage/storage.dm +++ b/code/datums/components/storage/storage.dm @@ -790,7 +790,7 @@ user.visible_message("[user] draws [I] from [parent]!", "You draw [I] from [parent].") return TRUE -/datum/component/storage/proc/action_trigger(datum/signal_source, datum/action/source) +/datum/component/storage/proc/action_trigger(datum/action/source, obj/target) gather_mode_switch(source.owner) return COMPONENT_ACTION_BLOCK_TRIGGER diff --git a/code/datums/components/virtual_reality.dm b/code/datums/components/virtual_reality.dm index 63e4f4f092..cd5820d21f 100644 --- a/code/datums/components/virtual_reality.dm +++ b/code/datums/components/virtual_reality.dm @@ -174,7 +174,7 @@ /** *The following procs simply acts as hooks for quit(), since components do not use callbacks anymore */ -/datum/component/virtual_reality/proc/action_trigger(datum/signal_source, datum/action/source) +/datum/component/virtual_reality/proc/action_trigger(datum/action/source, obj/target) quit() return COMPONENT_ACTION_BLOCK_TRIGGER diff --git a/code/datums/elements/polychromic.dm b/code/datums/elements/polychromic.dm new file mode 100644 index 0000000000..4301a280f3 --- /dev/null +++ b/code/datums/elements/polychromic.dm @@ -0,0 +1,127 @@ +#define POLYCHROMIC_ALTCLICK (1<<0) +#define POLYCHROMIC_ACTION (1<<1) +#define POLYCHROMIC_NO_HELD (1<<2) +#define POLYCHROMIC_NO_WORN (1<<3) + +/datum/element/polychromic + element_flags = ELEMENT_BESPOKE|ELEMENT_DETACH + id_arg_index = 3 + var/list/overlays_by_atom = list() + var/list/overlays_states //also used for worn/held overlsays + var/icon_file + var/list/overlays_names //wrap numbers into text strings please. + var/list/actions_by_atom = list() + var/poly_flags + //item variables + var/worn_file //used for boths held and worn overlays if present. + +/datum/element/polychromic/Attach(datum/target, list/colors, list/states, _icon, _flags = POLYCHROMIC_ALTCLICK|POLYCHROMIC_NO_HELD, _worn, list/names = list("Primary", "Secondary", "Tertiary", "Quaternary", "Quinary", "Senary")) + . = ..() + var/states_len = length(overlays_states) + var/names_len = length(names) + if(!states_len || names_len || !isatom(target)) + return ELEMENT_INCOMPATIBLE + var/atom/A = target + + overlays_states = states + icon_file = _icon + worn_file = _worn + poly_flags = _flags + + var/mut_icon = icon_file || A.icon + var/list/L = list() + for(var/I in overlays_states) + var/col = popleft(colors) || "#FFFFFF" + L += mutable_appearance(mut_icon, I, color = col) + A.add_overlay(L) + overlays_by_atom[A] = L + + if(_flags & POLYCHROMIC_ALTCLICK) + RegisterSignal(A, COMSIG_PARENT_EXAMINE, .proc/on_examine) + RegisterSignal(A, COMSIG_CLICK_ALT, .proc/set_color) + + if(!overlays_names && names) + overlays_names = names + var/diff = states_len - names_len + if(diff > 0) //It will be ugly, but still functional. + for(var/i in 1 to diff) + overlays_names += "[names_len + i]" + else if(diff < 0) + overlays_names.len += diff + + if(isitem(A)) + if(_flags & POLYCHROMIC_ACTION) + RegisterSignal(src, COMSIG_ITEM_EQUIPPED, .proc/grant_user_action) + RegisterSignal(src, COMSIG_ITEM_DROPPED, .proc/remove_user_action) + AddElement(A, /datum/element/update_icon_updates_onmob) //Since we can change the overall aspect of the item. + RegisterSignal(A, COMSIG_ITEM_WORN_OVERLAYS, .proc/apply_worn_overlays) + else if(_flags & POLYCHROMIC_ACTION && ismob(A)) //Not safe until mob icon updating procs are standarized and stop using cut_overlays() + var/datum/action/polychromic/P = new(A) + RegisterSignal(P, COMSIG_ACTION_TRIGGER, .proc/activate_action) + actions_by_atom[A] = P + P.Grant(A) + +/datum/element/polychromic/Detach(atom/A) + . = ..() + A.cut_overlay(overlays_by_atom[A]) + overlays_by_atom -= A + var/datum/action/polychromic/P = actions_by_atom[A] + if(P) + qdel(P) + actions_by_atom -= A + if(poly_flags & POLYCHROMIC_ALTCLICK) + UnregisterSignal(A, list(COMSIG_PARENT_EXAMINE, COMSIG_CLICK_ALT)) + +/datum/element/polychromic/proc/apply_worn_overlays(obj/item/source, isinhands, icon_file, style_flags, list/overlays) + if(poly_flags & (isinhands ? POLYCHROMIC_NO_HELD : POLYCHROMIC_NO_WORN)) + return + var/f_icon = worn_file || icon_file + var/list/L = overlays_by_atom[source] + + for(var/I in 1 to length(overlays_states)) + var/mutable_appearance/M = L[I] + overlays += mutable_appearance(f_icon, overlays_states[I], color = M.color) + +/datum/element/polychromic/proc/set_color(atom/source, mob/user) + var/choice = input(user,"Polychromic options", "Recolor [source]") as null|anything in overlays_names + if(!choice || QDELETED(source) || !user.canUseTopic(src, BE_CLOSE, NO_DEXTERY)) + return + choice = overlays_names.Find(choice) + var/ncolor = input(user, "Polychromic options", "Choose [choice] Color") as color|null + if(!ncolor || QDELETED(source) || !user.canUseTopic(src, BE_CLOSE, NO_DEXTERY)) + return + var/list/L = overlays_by_atom[source] + if(!L) // Ummmmmh. + return + var/mutable_appearance/M = L[choice] + M.color = sanitize_hexcolor(ncolor, 6, TRUE, M.color) + source.update_icon() + return TRUE + +/datum/element/polychromic/proc/grant_user_action(atom/source, mob/user, slot) + if(slot == SLOT_IN_BACKPACK || slot == SLOT_LEGCUFFED || slot == SLOT_HANDCUFFED || slot == SLOT_GENERC_DEXTROUS_STORAGE) + return + var/datum/action/polychromic/P = actions_by_atom[source] + if(!P) + P = new (source) + actions_by_atom[source] = P + P.check_flags = AB_CHECK_RESTRAINED|AB_CHECK_STUN|AB_CHECK_LYING|AB_CHECK_CONSCIOUS + RegisterSignal(P, COMSIG_ACTION_TRIGGER, .proc/activate_action) + P.Grant(user) + +/datum/element/polychromic/proc/remove_user_action(atom/source, mob/user) + var/datum/action/polychromic/P = actions_by_atom[source] + P?.Remove(user) + +/datum/element/polychromic/proc/activate_action(datum/action/source, atom/target) + set_color(target, source.owner) + +/datum/element/polychromic/proc/on_examine(atom/source, mob/user, list/examine_list) + examine_list += "Alt-click to recolor it." + +/datum/action/polychromic + name = "Modify Polychromic Colors" + background_icon_state = "bg_polychromic" + use_target_appearance = TRUE + button_icon_state = null + target_appearance_matrix = list(0.7,0,0,0,0.7,0) diff --git a/code/datums/elements/update_icon_updates_onmob.dm b/code/datums/elements/update_icon_updates_onmob.dm index ca0e8b1641..5c71547f62 100644 --- a/code/datums/elements/update_icon_updates_onmob.dm +++ b/code/datums/elements/update_icon_updates_onmob.dm @@ -5,7 +5,7 @@ . = ..() if(!istype(target, /obj/item)) return ELEMENT_INCOMPATIBLE - RegisterSignal(target, COMSIG_ATOM_UPDATED_ICON, .proc/update_onmob) + RegisterSignal(target, COMSIG_ATOM_UPDATED_ICON, .proc/update_onmob, override = TRUE) /datum/element/update_icon_updates_onmob/proc/update_onmob(obj/item/target) if(ismob(target.loc)) diff --git a/code/game/objects/items.dm b/code/game/objects/items.dm index fd6ae1bb43..7a155ca932 100644 --- a/code/game/objects/items.dm +++ b/code/game/objects/items.dm @@ -425,6 +425,13 @@ GLOBAL_VAR_INIT(rpg_loot_items, FALSE) item_flags |= IN_INVENTORY user.update_equipment_speed_mods() +//Overlays for the worn overlay so you can overlay while you overlay +//eg: ammo counters, primed grenade flashing, etc. +//"icon_file" is used automatically for inhands etc. to make sure it gets the right inhand file +/obj/item/proc/worn_overlays(isinhands = FALSE, icon_file, style_flags = NONE) + . = list() + SEND_SIGNAL(src, COMSIG_ITEM_WORN_OVERLAYS, isinhands, icon_file, style_flags, .) + //sometimes we only want to grant the item's action if it's equipped in a specific slot. /obj/item/proc/item_action_slot_check(slot, mob/user, datum/action/A) if(slot == SLOT_IN_BACKPACK || slot == SLOT_LEGCUFFED) //these aren't true slots, so avoid granting actions there diff --git a/code/modules/mob/living/carbon/update_icons.dm b/code/modules/mob/living/carbon/update_icons.dm index e5483e8d73..0d6195e4dd 100644 --- a/code/modules/mob/living/carbon/update_icons.dm +++ b/code/modules/mob/living/carbon/update_icons.dm @@ -195,15 +195,6 @@ /mob/living/carbon/proc/update_hud_back(obj/item/I) return - - -//Overlays for the worn overlay so you can overlay while you overlay -//eg: ammo counters, primed grenade flashing, etc. -//"icon_file" is used automatically for inhands etc. to make sure it gets the right inhand file -/obj/item/proc/worn_overlays(isinhands = FALSE, icon_file, style_flags = NONE) - . = list() - - /mob/living/carbon/update_body() update_body_parts() diff --git a/icons/mob/actions/backgrounds.dmi b/icons/mob/actions/backgrounds.dmi index 3697fe4ff5b3cc76b1c4abd6ec5f7fdd4f1d5a35..07839588ce366d2783e503982b7817658fb5def0 100644 GIT binary patch literal 18620 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 LSLNdatI+=k=$XBH diff --git a/tgstation.dme b/tgstation.dme index 7ce9569f9a..b12baa9c47 100755 --- a/tgstation.dme +++ b/tgstation.dme @@ -501,6 +501,7 @@ #include "code\datums\elements\firestacker.dm" #include "code\datums\elements\ghost_role_eligibility.dm" #include "code\datums\elements\mob_holder.dm" +#include "code\datums\elements\polychromic.dm" #include "code\datums\elements\swimming.dm" #include "code\datums\elements\sword_point.dm" #include "code\datums\elements\update_icon_blocker.dm" From 2b4b626facaefedebbbcea6f15080b08ecf6c194 Mon Sep 17 00:00:00 2001 From: Ghommie <42542238+Ghommie@users.noreply.github.com> Date: Tue, 10 Mar 2020 16:55:30 +0100 Subject: [PATCH 010/113] support for items that switch states through update_icon. --- code/__DEFINES/components.dm | 2 +- code/datums/elements/polychromic.dm | 65 +++++++++++++------ code/game/objects/items.dm | 4 +- code/game/objects/items/RCL.dm | 2 +- code/game/objects/items/holy_weapons.dm | 2 +- code/game/objects/items/melee/energy.dm | 2 +- code/game/objects/items/storage/belt.dm | 2 +- code/game/objects/items/tanks/watertank.dm | 2 +- code/game/objects/items/tools/screwdriver.dm | 2 +- code/game/objects/items/toys.dm | 2 +- code/game/objects/items/twohanded.dm | 2 +- code/game/objects/structures/bedsheet_bin.dm | 2 +- .../clockcult/clock_items/clockwork_slab.dm | 2 +- code/modules/antagonists/cult/cult_items.dm | 2 +- code/modules/clothing/glasses/_glasses.dm | 2 +- code/modules/clothing/gloves/_gloves.dm | 2 +- code/modules/clothing/head/_head.dm | 2 +- code/modules/clothing/head/hardhat.dm | 2 +- code/modules/clothing/head/misc_special.dm | 2 +- code/modules/clothing/masks/_masks.dm | 2 +- code/modules/clothing/neck/_neck.dm | 4 +- code/modules/clothing/shoes/_shoes.dm | 2 +- code/modules/clothing/spacesuits/hardsuit.dm | 6 +- code/modules/clothing/spacesuits/plasmamen.dm | 2 +- code/modules/clothing/suits/_suits.dm | 2 +- code/modules/clothing/suits/miscellaneous.dm | 4 +- code/modules/clothing/under/_under.dm | 2 +- .../clothing/under/polychromic_clothes.dm | 2 +- code/modules/food_and_drinks/pizzabox.dm | 2 +- .../modules/mining/equipment/explorer_gear.dm | 2 +- .../mob/living/carbon/human/update_icons.dm | 2 +- .../clothing/suits/polychromic_cloaks.dm | 2 +- .../projectiles/guns/energy/energy_gun.dm | 2 +- .../modules/projectiles/guns/pumpenergy.dm | 2 +- 34 files changed, 82 insertions(+), 59 deletions(-) diff --git a/code/__DEFINES/components.dm b/code/__DEFINES/components.dm index ff0750a28c..85a8d7a37d 100644 --- a/code/__DEFINES/components.dm +++ b/code/__DEFINES/components.dm @@ -255,7 +255,7 @@ #define COMSIG_ITEM_IMBUE_SOUL "item_imbue_soul" //return a truthy value to prevent ensouling, checked in /obj/effect/proc_holder/spell/targeted/lichdom/cast(): (mob/user) #define COMSIG_ITEM_HIT_REACT "item_hit_react" //from base of obj/item/hit_reaction(): (list/args) #define COMSIG_ITEM_WEARERCROSSED "wearer_crossed" //called on item when crossed by something (): (/atom/movable) -#define COMSIG_ITEM_WORN_OVERLAYS "item_worn_overlays" //from base of obj/item/worn_overlays(): (isinhands, icon_file, style_flags, list/overlays) +#define COMSIG_ITEM_WORN_OVERLAYS "item_worn_overlays" //from base of obj/item/worn_overlays(): (isinhands, icon_file, used_state, style_flags, list/overlays) // /obj/item/clothing signals #define COMSIG_SHOES_STEP_ACTION "shoes_step_action" //from base of obj/item/clothing/shoes/proc/step_action(): () diff --git a/code/datums/elements/polychromic.dm b/code/datums/elements/polychromic.dm index 4301a280f3..d7057cfdf7 100644 --- a/code/datums/elements/polychromic.dm +++ b/code/datums/elements/polychromic.dm @@ -6,8 +6,8 @@ /datum/element/polychromic element_flags = ELEMENT_BESPOKE|ELEMENT_DETACH id_arg_index = 3 - var/list/overlays_by_atom = list() - var/list/overlays_states //also used for worn/held overlsays + var/overlays_states //A list or a number of states. In the latter case, the atom icon_state/item_state will be used followed by a number for the overlays. + var/list/colors_by_atom = list() //list of color strings or mutable appearance depending on the above variable. var/icon_file var/list/overlays_names //wrap numbers into text strings please. var/list/actions_by_atom = list() @@ -15,7 +15,7 @@ //item variables var/worn_file //used for boths held and worn overlays if present. -/datum/element/polychromic/Attach(datum/target, list/colors, list/states, _icon, _flags = POLYCHROMIC_ALTCLICK|POLYCHROMIC_NO_HELD, _worn, list/names = list("Primary", "Secondary", "Tertiary", "Quaternary", "Quinary", "Senary")) +/datum/element/polychromic/Attach(datum/target, list/colors, states, _icon, _flags = POLYCHROMIC_ALTCLICK|POLYCHROMIC_NO_HELD, _worn, list/names = list("Primary", "Secondary", "Tertiary", "Quaternary", "Quinary", "Senary")) . = ..() var/states_len = length(overlays_states) var/names_len = length(names) @@ -30,11 +30,17 @@ var/mut_icon = icon_file || A.icon var/list/L = list() - for(var/I in overlays_states) - var/col = popleft(colors) || "#FFFFFF" - L += mutable_appearance(mut_icon, I, color = col) - A.add_overlay(L) - overlays_by_atom[A] = L + if(islist(overlays_states)) + for(var/I in overlays_states) + var/col = popleft(colors) || "#FFFFFF" + L += mutable_appearance(mut_icon, I, color = col) + else + for(var/I in 1 to overlays_states) + var/col = LAZYACCESS(colors, I) || "#FFFFFF" + L += col + colors_by_atom[A] = L + + RegisterSignal(A, COMSIG_ATOM_UPDATE_OVERLAYS, .proc/apply_overlays) if(_flags & POLYCHROMIC_ALTCLICK) RegisterSignal(A, COMSIG_PARENT_EXAMINE, .proc/on_examine) @@ -61,40 +67,57 @@ actions_by_atom[A] = P P.Grant(A) + A.update_icon() + /datum/element/polychromic/Detach(atom/A) . = ..() - A.cut_overlay(overlays_by_atom[A]) - overlays_by_atom -= A + A.cut_overlay(colors_by_atom[A]) + colors_by_atom -= A var/datum/action/polychromic/P = actions_by_atom[A] if(P) qdel(P) actions_by_atom -= A if(poly_flags & POLYCHROMIC_ALTCLICK) - UnregisterSignal(A, list(COMSIG_PARENT_EXAMINE, COMSIG_CLICK_ALT)) + UnregisterSignal(A, list(COMSIG_PARENT_EXAMINE, COMSIG_CLICK_ALT, COMSIG_ATOM_UPDATE_OVERLAYS, COMSIG_ITEM_EQUIPPED, COMSIG_ITEM_DROPPED)) -/datum/element/polychromic/proc/apply_worn_overlays(obj/item/source, isinhands, icon_file, style_flags, list/overlays) +/datum/element/polychromic/proc/apply_overlays(atom/source, list/overlays) + var/list/L = colors_by_atom[source] + if(isnum(overlays_states)) + for(var/i in 1 to overlays_states) + overlays += mutable_appearance(source.icon, "[source.icon_state]-[i]", color = L[i]) + else + overlays += colors_by_atom[source] + +/datum/element/polychromic/proc/apply_worn_overlays(obj/item/source, isinhands, icon_file, used_state, style_flags, list/overlays) if(poly_flags & (isinhands ? POLYCHROMIC_NO_HELD : POLYCHROMIC_NO_WORN)) return var/f_icon = worn_file || icon_file - var/list/L = overlays_by_atom[source] + var/list/L = colors_by_atom[source] - for(var/I in 1 to length(overlays_states)) - var/mutable_appearance/M = L[I] - overlays += mutable_appearance(f_icon, overlays_states[I], color = M.color) + if(isnum(overlays_states)) + for(var/i in 1 to overlays_states) + overlays += mutable_appearance(f_icon, "[used_state]-[i]", color = L[i]) + else + for(var/I in 1 to length(overlays_states)) + var/mutable_appearance/M = L[I] + overlays += mutable_appearance(f_icon, overlays_states[I], color = M.color) /datum/element/polychromic/proc/set_color(atom/source, mob/user) var/choice = input(user,"Polychromic options", "Recolor [source]") as null|anything in overlays_names if(!choice || QDELETED(source) || !user.canUseTopic(src, BE_CLOSE, NO_DEXTERY)) return - choice = overlays_names.Find(choice) var/ncolor = input(user, "Polychromic options", "Choose [choice] Color") as color|null if(!ncolor || QDELETED(source) || !user.canUseTopic(src, BE_CLOSE, NO_DEXTERY)) return - var/list/L = overlays_by_atom[source] + var/list/L = colors_by_atom[source] if(!L) // Ummmmmh. return - var/mutable_appearance/M = L[choice] - M.color = sanitize_hexcolor(ncolor, 6, TRUE, M.color) + var/K = L[overlays_names.Find(choice)] + if(istext(K)) + K = sanitize_hexcolor(ncolor, 6, TRUE, K) + else + var/mutable_appearance/M = K + M.color = sanitize_hexcolor(ncolor, 6, TRUE, M.color) source.update_icon() return TRUE @@ -105,7 +128,7 @@ if(!P) P = new (source) actions_by_atom[source] = P - P.check_flags = AB_CHECK_RESTRAINED|AB_CHECK_STUN|AB_CHECK_LYING|AB_CHECK_CONSCIOUS + P.check_flags = AB_CHECK_RESTRAINED|AB_CHECK_STUN|AB_CHECK_CONSCIOUS RegisterSignal(P, COMSIG_ACTION_TRIGGER, .proc/activate_action) P.Grant(user) diff --git a/code/game/objects/items.dm b/code/game/objects/items.dm index 7a155ca932..5d3725200c 100644 --- a/code/game/objects/items.dm +++ b/code/game/objects/items.dm @@ -428,9 +428,9 @@ GLOBAL_VAR_INIT(rpg_loot_items, FALSE) //Overlays for the worn overlay so you can overlay while you overlay //eg: ammo counters, primed grenade flashing, etc. //"icon_file" is used automatically for inhands etc. to make sure it gets the right inhand file -/obj/item/proc/worn_overlays(isinhands = FALSE, icon_file, style_flags = NONE) +/obj/item/proc/worn_overlays(isinhands = FALSE, icon_file, used_state, style_flags = NONE) . = list() - SEND_SIGNAL(src, COMSIG_ITEM_WORN_OVERLAYS, isinhands, icon_file, style_flags, .) + SEND_SIGNAL(src, COMSIG_ITEM_WORN_OVERLAYS, isinhands, icon_file, used_state, style_flags, .) //sometimes we only want to grant the item's action if it's equipped in a specific slot. /obj/item/proc/item_action_slot_check(slot, mob/user, datum/action/A) diff --git a/code/game/objects/items/RCL.dm b/code/game/objects/items/RCL.dm index 9513519fa9..5444b0c557 100644 --- a/code/game/objects/items/RCL.dm +++ b/code/game/objects/items/RCL.dm @@ -113,7 +113,7 @@ cable_overlay.color = GLOB.cable_colors[colors[current_color_index]] . += cable_overlay -/obj/item/twohanded/rcl/worn_overlays(isinhands, icon_file, style_flags = NONE) +/obj/item/twohanded/rcl/worn_overlays(isinhands, icon_file, used_state, style_flags = NONE) . = ..() if(!isinhands || !(loaded?.amount)) return diff --git a/code/game/objects/items/holy_weapons.dm b/code/game/objects/items/holy_weapons.dm index 4d275e2034..65c188918f 100644 --- a/code/game/objects/items/holy_weapons.dm +++ b/code/game/objects/items/holy_weapons.dm @@ -309,7 +309,7 @@ block_chance = 50 var/shield_icon = "shield-red" -/obj/item/nullrod/staff/worn_overlays(isinhands, icon_file, style_flags = NONE) +/obj/item/nullrod/staff/worn_overlays(isinhands, icon_file, used_state, style_flags = NONE) . = list() if(isinhands) . += mutable_appearance('icons/effects/effects.dmi', shield_icon, MOB_LAYER + 0.01) diff --git a/code/game/objects/items/melee/energy.dm b/code/game/objects/items/melee/energy.dm index aba07c9120..83d7ec1b6d 100644 --- a/code/game/objects/items/melee/energy.dm +++ b/code/game/objects/items/melee/energy.dm @@ -337,7 +337,7 @@ . = ..() . += "Alt-click to recolor it." -/obj/item/melee/transforming/energy/sword/cx/worn_overlays(isinhands, icon_file, style_flags = NONE) +/obj/item/melee/transforming/energy/sword/cx/worn_overlays(isinhands, icon_file, used_state, style_flags = NONE) . = ..() if(active) if(isinhands) diff --git a/code/game/objects/items/storage/belt.dm b/code/game/objects/items/storage/belt.dm index 4e03d029a8..3ee4fbead8 100755 --- a/code/game/objects/items/storage/belt.dm +++ b/code/game/objects/items/storage/belt.dm @@ -22,7 +22,7 @@ for(var/obj/item/I in contents) . += I.get_belt_overlay() -/obj/item/storage/belt/worn_overlays(isinhands, icon_file, style_flags = NONE) +/obj/item/storage/belt/worn_overlays(isinhands, icon_file, used_state, style_flags = NONE) . = ..() if(!isinhands && onmob_overlays) for(var/obj/item/I in contents) diff --git a/code/game/objects/items/tanks/watertank.dm b/code/game/objects/items/tanks/watertank.dm index c1cbf534ca..5210f00e99 100644 --- a/code/game/objects/items/tanks/watertank.dm +++ b/code/game/objects/items/tanks/watertank.dm @@ -376,7 +376,7 @@ filling.color = mix_color_from_reagents(reagents.reagent_list) add_overlay(filling) -/obj/item/reagent_containers/chemtank/worn_overlays(isinhands = FALSE, icon_file, style_flags = NONE) //apply chemcolor and level +/obj/item/reagent_containers/chemtank/worn_overlays(isinhands = FALSE, icon_file, used_state, style_flags = NONE) //apply chemcolor and level . = list() //inhands + reagent_filling if(!isinhands && reagents.total_volume) diff --git a/code/game/objects/items/tools/screwdriver.dm b/code/game/objects/items/tools/screwdriver.dm index 0d2892cb4a..24fe73ba12 100644 --- a/code/game/objects/items/tools/screwdriver.dm +++ b/code/game/objects/items/tools/screwdriver.dm @@ -53,7 +53,7 @@ base_overlay.appearance_flags = RESET_COLOR . += base_overlay -/obj/item/screwdriver/worn_overlays(isinhands = FALSE, icon_file, style_flags = NONE) +/obj/item/screwdriver/worn_overlays(isinhands = FALSE, icon_file, used_state, style_flags = NONE) . = list() if(isinhands && random_color) var/mutable_appearance/M = mutable_appearance(icon_file, "screwdriver_head") diff --git a/code/game/objects/items/toys.dm b/code/game/objects/items/toys.dm index ba51fa3d65..08b87fe1d6 100644 --- a/code/game/objects/items/toys.dm +++ b/code/game/objects/items/toys.dm @@ -352,7 +352,7 @@ update_light() return TRUE -/obj/item/toy/sword/cx/worn_overlays(isinhands, icon_file, style_flags = NONE) +/obj/item/toy/sword/cx/worn_overlays(isinhands, icon_file, used_state, style_flags = NONE) . = ..() if(active) if(isinhands) diff --git a/code/game/objects/items/twohanded.dm b/code/game/objects/items/twohanded.dm index 11a06e149d..7f2e322c69 100644 --- a/code/game/objects/items/twohanded.dm +++ b/code/game/objects/items/twohanded.dm @@ -530,7 +530,7 @@ update_light() return TRUE -/obj/item/twohanded/dualsaber/hypereutactic/worn_overlays(isinhands, icon_file, style_flags = NONE) +/obj/item/twohanded/dualsaber/hypereutactic/worn_overlays(isinhands, icon_file, used_state, style_flags = NONE) . = ..() if(isinhands) var/mutable_appearance/gem_inhand = mutable_appearance(icon_file, "hypereutactic_gem") diff --git a/code/game/objects/structures/bedsheet_bin.dm b/code/game/objects/structures/bedsheet_bin.dm index 8dc7caa5ad..7859b888f2 100644 --- a/code/game/objects/structures/bedsheet_bin.dm +++ b/code/game/objects/structures/bedsheet_bin.dm @@ -252,7 +252,7 @@ LINEN BINS add_overlay(g_mouth) add_overlay(g_eyes) -/obj/item/bedsheet/gondola/worn_overlays(isinhands = FALSE, icon_file, style_flags = NONE) +/obj/item/bedsheet/gondola/worn_overlays(isinhands = FALSE, icon_file, used_state, style_flags = NONE) . = ..() if(!isinhands) . += mutable_appearance(icon_file, g_mouth) diff --git a/code/modules/antagonists/clockcult/clock_items/clockwork_slab.dm b/code/modules/antagonists/clockcult/clock_items/clockwork_slab.dm index b12c72b4af..b0ba3ccaaa 100644 --- a/code/modules/antagonists/clockcult/clock_items/clockwork_slab.dm +++ b/code/modules/antagonists/clockcult/clock_items/clockwork_slab.dm @@ -103,7 +103,7 @@ . = ..() addtimer(CALLBACK(src, .proc/check_on_mob, user), 1) //dropped is called before the item is out of the slot, so we need to check slightly later -/obj/item/clockwork/slab/worn_overlays(isinhands = FALSE, icon_file, style_flags = NONE) +/obj/item/clockwork/slab/worn_overlays(isinhands = FALSE, icon_file, used_state, style_flags = NONE) . = list() if(isinhands && item_state && inhand_overlay) var/mutable_appearance/M = mutable_appearance(icon_file, "slab_[inhand_overlay]") diff --git a/code/modules/antagonists/cult/cult_items.dm b/code/modules/antagonists/cult/cult_items.dm index 3dc199b56d..888e99f1ad 100644 --- a/code/modules/antagonists/cult/cult_items.dm +++ b/code/modules/antagonists/cult/cult_items.dm @@ -425,7 +425,7 @@ return 1 return 0 -/obj/item/clothing/suit/hooded/cultrobes/cult_shield/worn_overlays(isinhands, icon_file, style_flags = NONE) +/obj/item/clothing/suit/hooded/cultrobes/cult_shield/worn_overlays(isinhands, icon_file, used_state, style_flags = NONE) . = list() if(!isinhands && current_charges) . += mutable_appearance('icons/effects/cult_effects.dmi', "shield-cult", MOB_LAYER + 0.01) diff --git a/code/modules/clothing/glasses/_glasses.dm b/code/modules/clothing/glasses/_glasses.dm index 5ae86636d6..2b6036498e 100644 --- a/code/modules/clothing/glasses/_glasses.dm +++ b/code/modules/clothing/glasses/_glasses.dm @@ -333,7 +333,7 @@ add_atom_colour("#[user.eye_color]", FIXED_COLOUR_PRIORITY) colored_before = TRUE -/obj/item/clothing/glasses/sunglasses/blindfold/white/worn_overlays(isinhands = FALSE, icon_file, style_flags = NONE) +/obj/item/clothing/glasses/sunglasses/blindfold/white/worn_overlays(isinhands = FALSE, icon_file, used_state, style_flags = NONE) . = list() if(!isinhands && ishuman(loc) && !colored_before) var/mob/living/carbon/human/H = loc diff --git a/code/modules/clothing/gloves/_gloves.dm b/code/modules/clothing/gloves/_gloves.dm index 0729317eac..21ebeaa2bb 100644 --- a/code/modules/clothing/gloves/_gloves.dm +++ b/code/modules/clothing/gloves/_gloves.dm @@ -26,7 +26,7 @@ user.visible_message("\the [src] are forcing [user]'s hands around [user.p_their()] neck! It looks like the gloves are possessed!") return OXYLOSS -/obj/item/clothing/gloves/worn_overlays(isinhands = FALSE, icon_file, style_flags = NONE) +/obj/item/clothing/gloves/worn_overlays(isinhands = FALSE, icon_file, used_state, style_flags = NONE) . = list() if(!isinhands) if(damaged_clothes) diff --git a/code/modules/clothing/head/_head.dm b/code/modules/clothing/head/_head.dm index d599fbf6f7..121217c128 100644 --- a/code/modules/clothing/head/_head.dm +++ b/code/modules/clothing/head/_head.dm @@ -48,7 +48,7 @@ -/obj/item/clothing/head/worn_overlays(isinhands = FALSE, icon_file, style_flags = NONE) +/obj/item/clothing/head/worn_overlays(isinhands = FALSE, icon_file, used_state, style_flags = NONE) . = list() if(!isinhands) if(damaged_clothes) diff --git a/code/modules/clothing/head/hardhat.dm b/code/modules/clothing/head/hardhat.dm index e7a8243889..9715709e00 100644 --- a/code/modules/clothing/head/hardhat.dm +++ b/code/modules/clothing/head/hardhat.dm @@ -125,7 +125,7 @@ playsound(src, 'sound/mecha/mechmove03.ogg', 50, TRUE) //Visors don't just come from nothing update_icon() -/obj/item/clothing/head/hardhat/weldhat/worn_overlays(isinhands, icon_file, style_flags = NONE) +/obj/item/clothing/head/hardhat/weldhat/worn_overlays(isinhands, icon_file, used_state, style_flags = NONE) . = ..() if(!isinhands) . += mutable_appearance('icons/mob/head.dmi', "weldhelmet") diff --git a/code/modules/clothing/head/misc_special.dm b/code/modules/clothing/head/misc_special.dm index 4be949a65e..ec5573e4d7 100644 --- a/code/modules/clothing/head/misc_special.dm +++ b/code/modules/clothing/head/misc_special.dm @@ -208,7 +208,7 @@ M.color = hair_color add_overlay(M) -/obj/item/clothing/head/wig/worn_overlays(isinhands = FALSE, icon_file, style_flags = NONE) +/obj/item/clothing/head/wig/worn_overlays(isinhands = FALSE, icon_file, used_state, style_flags = NONE) . = list() if(!isinhands) var/datum/sprite_accessory/S = GLOB.hair_styles_list[hair_style] diff --git a/code/modules/clothing/masks/_masks.dm b/code/modules/clothing/masks/_masks.dm index 5019633cf0..ac087fd9e2 100644 --- a/code/modules/clothing/masks/_masks.dm +++ b/code/modules/clothing/masks/_masks.dm @@ -28,7 +28,7 @@ /obj/item/clothing/mask/proc/handle_speech() -/obj/item/clothing/mask/worn_overlays(isinhands = FALSE, icon_file, style_flags = NONE) +/obj/item/clothing/mask/worn_overlays(isinhands = FALSE, icon_file, used_state, style_flags = NONE) . = list() if(!isinhands) if(body_parts_covered & HEAD) diff --git a/code/modules/clothing/neck/_neck.dm b/code/modules/clothing/neck/_neck.dm index 2b43460257..cfc806b4db 100644 --- a/code/modules/clothing/neck/_neck.dm +++ b/code/modules/clothing/neck/_neck.dm @@ -6,7 +6,7 @@ strip_delay = 40 equip_delay_other = 40 -/obj/item/clothing/neck/worn_overlays(isinhands = FALSE, icon_flag, style_flags = NONE) +/obj/item/clothing/neck/worn_overlays(isinhands = FALSE, icon_file, used_state, style_flags = NONE) . = list() if(!isinhands) if(body_parts_covered & HEAD) @@ -192,7 +192,7 @@ tagname = stripped_input(user, "Would you like to change the name on the tag?", "Name your new pet", "Spot", MAX_NAME_LEN) name = "[initial(name)] - [tagname]" -/obj/item/clothing/neck/petcollar/worn_overlays(isinhands, icon_file, style_flags = NONE) +/obj/item/clothing/neck/petcollar/worn_overlays(isinhands, icon_file, used_state, style_flags = NONE) . = ..() if(hasprimary | hassecondary | hastertiary) if(!isinhands) //prevents the worn sprites from showing up if you're just holding them diff --git a/code/modules/clothing/shoes/_shoes.dm b/code/modules/clothing/shoes/_shoes.dm index 4c6d3a8f88..7ac4f062f3 100644 --- a/code/modules/clothing/shoes/_shoes.dm +++ b/code/modules/clothing/shoes/_shoes.dm @@ -49,7 +49,7 @@ last_bloodtype = blood_dna[blood_dna[blood_dna.len]]//trust me this works last_blood_DNA = blood_dna[blood_dna.len] -/obj/item/clothing/shoes/worn_overlays(isinhands = FALSE, icon_file, style_flags = NONE) +/obj/item/clothing/shoes/worn_overlays(isinhands = FALSE, icon_file, used_state, style_flags = NONE) . = list() if(!isinhands) var/bloody = FALSE diff --git a/code/modules/clothing/spacesuits/hardsuit.dm b/code/modules/clothing/spacesuits/hardsuit.dm index d9e4f17649..a391a3807f 100644 --- a/code/modules/clothing/spacesuits/hardsuit.dm +++ b/code/modules/clothing/spacesuits/hardsuit.dm @@ -793,7 +793,7 @@ var/mob/living/carbon/human/C = loc C.update_inv_wear_suit() -/obj/item/clothing/suit/space/hardsuit/shielded/worn_overlays(isinhands, icon_file, style_flags = NONE) +/obj/item/clothing/suit/space/hardsuit/shielded/worn_overlays(isinhands, icon_file, used_state, style_flags = NONE) . = ..() if(!isinhands) var/file2use = style_flags & STYLE_ALL_TAURIC ? 'modular_citadel/icons/mob/64x32_effects.dmi' : 'icons/effects/effects.dmi' @@ -956,7 +956,7 @@ add_overlay(helm_overlay) -/obj/item/clothing/head/helmet/space/hardsuit/lavaknight/worn_overlays(isinhands = FALSE, icon_file, style_flags = NONE) +/obj/item/clothing/head/helmet/space/hardsuit/lavaknight/worn_overlays(isinhands = FALSE, icon_file, used_state, style_flags = NONE) . = ..() if(!isinhands) var/mutable_appearance/energy_overlay = mutable_appearance(icon_file, "knight_cydonia_overlay", ABOVE_LIGHTING_LAYER) @@ -993,7 +993,7 @@ add_overlay(suit_overlay) -/obj/item/clothing/suit/space/hardsuit/lavaknight/worn_overlays(isinhands = FALSE, icon_file, style_flags = NONE) +/obj/item/clothing/suit/space/hardsuit/lavaknight/worn_overlays(isinhands = FALSE, icon_file, used_state, style_flags = NONE) . = ..() if(!isinhands) var/mutable_appearance/energy_overlay = mutable_appearance(icon_file, "knight_cydonia_overlay", ABOVE_LIGHTING_LAYER) diff --git a/code/modules/clothing/spacesuits/plasmamen.dm b/code/modules/clothing/spacesuits/plasmamen.dm index fee8dbce33..f17eb91b74 100644 --- a/code/modules/clothing/spacesuits/plasmamen.dm +++ b/code/modules/clothing/spacesuits/plasmamen.dm @@ -67,7 +67,7 @@ var/datum/action/A=X A.UpdateButtonIcon() -/obj/item/clothing/head/helmet/space/plasmaman/worn_overlays(isinhands, icon_file, style_flags = NONE) +/obj/item/clothing/head/helmet/space/plasmaman/worn_overlays(isinhands, icon_file, used_state, style_flags = NONE) . = ..() if(!isinhands && on) . += mutable_appearance(icon_file, light_overlay) diff --git a/code/modules/clothing/suits/_suits.dm b/code/modules/clothing/suits/_suits.dm index 1b2080feb1..3d312e260a 100644 --- a/code/modules/clothing/suits/_suits.dm +++ b/code/modules/clothing/suits/_suits.dm @@ -11,7 +11,7 @@ var/suittoggled = FALSE mutantrace_variation = STYLE_DIGITIGRADE -/obj/item/clothing/suit/worn_overlays(isinhands = FALSE, icon_file, style_flags = NONE) +/obj/item/clothing/suit/worn_overlays(isinhands = FALSE, icon_file, used_state, style_flags = NONE) . = ..() if(!isinhands) if(damaged_clothes) diff --git a/code/modules/clothing/suits/miscellaneous.dm b/code/modules/clothing/suits/miscellaneous.dm index 6f61bf56cb..febecd9f71 100644 --- a/code/modules/clothing/suits/miscellaneous.dm +++ b/code/modules/clothing/suits/miscellaneous.dm @@ -987,7 +987,7 @@ item_color = "winterhood_poly" item_state = "winterhood_poly" -/obj/item/clothing/head/hooded/winterhood/polychromic/worn_overlays(isinhands, icon_file, style_flags = NONE) //this is where the main magic happens. +/obj/item/clothing/head/hooded/winterhood/polychromic/worn_overlays(isinhands, icon_file, used_state, style_flags = NONE) //this is where the main magic happens. . = ..() if(suit.hasprimary | suit.hassecondary) if(!isinhands) //prevents the worn sprites from showing up if you're just holding them @@ -1000,7 +1000,7 @@ secondary_worn.color = suit.secondary_color . += secondary_worn -/obj/item/clothing/suit/hooded/wintercoat/polychromic/worn_overlays(isinhands, icon_file, style_flags = NONE) //this is where the main magic happens. +/obj/item/clothing/suit/hooded/wintercoat/polychromic/worn_overlays(isinhands, icon_file, used_state, style_flags = NONE) //this is where the main magic happens. . = ..() if(hasprimary | hassecondary | hastertiary) if(!isinhands) //prevents the worn sprites from showing up if you're just holding them diff --git a/code/modules/clothing/under/_under.dm b/code/modules/clothing/under/_under.dm index 63e3a63968..d0cfef4f71 100644 --- a/code/modules/clothing/under/_under.dm +++ b/code/modules/clothing/under/_under.dm @@ -16,7 +16,7 @@ var/mutable_appearance/accessory_overlay mutantrace_variation = STYLE_DIGITIGRADE -/obj/item/clothing/under/worn_overlays(isinhands = FALSE, icon_file, style_flags = NONE) +/obj/item/clothing/under/worn_overlays(isinhands = FALSE, icon_file, used_state, style_flags = NONE) . = list() if(!isinhands) if(damaged_clothes) diff --git a/code/modules/clothing/under/polychromic_clothes.dm b/code/modules/clothing/under/polychromic_clothes.dm index 53011d42d1..e56e1eb265 100644 --- a/code/modules/clothing/under/polychromic_clothes.dm +++ b/code/modules/clothing/under/polychromic_clothes.dm @@ -27,7 +27,7 @@ can_adjust = FALSE mutantrace_variation = NONE //Not all clothes are currently digi-compatible (only the shorts are as of time of writing) -/obj/item/clothing/under/polychromic/worn_overlays(isinhands, icon_file, style_flags = NONE) //this is where the main magic happens. +/obj/item/clothing/under/polychromic/worn_overlays(isinhands, icon_file, used_state, style_flags = NONE) //this is where the main magic happens. . = ..() if(hasprimary | hassecondary | hastertiary) if(!isinhands) //prevents the worn sprites from showing up if you're just holding them diff --git a/code/modules/food_and_drinks/pizzabox.dm b/code/modules/food_and_drinks/pizzabox.dm index b163c6ba97..3505a35487 100644 --- a/code/modules/food_and_drinks/pizzabox.dm +++ b/code/modules/food_and_drinks/pizzabox.dm @@ -86,7 +86,7 @@ tag_overlay.pixel_y = boxes.len * 3 add_overlay(tag_overlay) -/obj/item/pizzabox/worn_overlays(isinhands, icon_file, style_flags = NONE) +/obj/item/pizzabox/worn_overlays(isinhands, icon_file, used_state, style_flags = NONE) . = list() var/current_offset = 2 if(isinhands) diff --git a/code/modules/mining/equipment/explorer_gear.dm b/code/modules/mining/equipment/explorer_gear.dm index 5165d95340..d3bf4368f7 100644 --- a/code/modules/mining/equipment/explorer_gear.dm +++ b/code/modules/mining/equipment/explorer_gear.dm @@ -117,7 +117,7 @@ glass_overlay.appearance_flags = RESET_COLOR add_overlay(glass_overlay) -/obj/item/clothing/head/helmet/space/hostile_environment/worn_overlays(isinhands, icon_file, style_flags = NONE) +/obj/item/clothing/head/helmet/space/hostile_environment/worn_overlays(isinhands, icon_file, used_state, style_flags = NONE) . = ..() if(!isinhands) var/mutable_appearance/M = mutable_appearance('icons/mob/head.dmi', "hostile_env_glass") diff --git a/code/modules/mob/living/carbon/human/update_icons.dm b/code/modules/mob/living/carbon/human/update_icons.dm index f1b1570e24..fa138e38f8 100644 --- a/code/modules/mob/living/carbon/human/update_icons.dm +++ b/code/modules/mob/living/carbon/human/update_icons.dm @@ -593,7 +593,7 @@ generate/load female uniform sprites matching all previously decided variables //Get the overlays for this item when it's being worn //eg: ammo counters, primed grenade flashes, etc. - var/list/worn_overlays = worn_overlays(isinhands, file2use, style_flags) + var/list/worn_overlays = worn_overlays(isinhands, file2use, state, style_flags) if(worn_overlays && worn_overlays.len) standing.overlays.Add(worn_overlays) diff --git a/modular_citadel/code/modules/clothing/suits/polychromic_cloaks.dm b/modular_citadel/code/modules/clothing/suits/polychromic_cloaks.dm index ade6cee3ba..ac7d2e80b0 100644 --- a/modular_citadel/code/modules/clothing/suits/polychromic_cloaks.dm +++ b/modular_citadel/code/modules/clothing/suits/polychromic_cloaks.dm @@ -13,7 +13,7 @@ secondary_color = "#FFFFFF" tertiary_color = "#808080" -/obj/item/clothing/neck/cloak/polychromic/worn_overlays(isinhands, icon_file, style_flags = NONE) //this is where the main magic happens. Also mandates that ALL polychromic stuff MUST USE alternate_worn_icon +/obj/item/clothing/neck/cloak/polychromic/worn_overlays(isinhands, icon_file, used_state, style_flags = NONE) //this is where the main magic happens. Also mandates that ALL polychromic stuff MUST USE alternate_worn_icon . = ..() if(hasprimary | hassecondary | hastertiary) if(!isinhands) //prevents the worn sprites from showing up if you're just holding them diff --git a/modular_citadel/code/modules/projectiles/guns/energy/energy_gun.dm b/modular_citadel/code/modules/projectiles/guns/energy/energy_gun.dm index 49a8a26f35..49d48e0000 100644 --- a/modular_citadel/code/modules/projectiles/guns/energy/energy_gun.dm +++ b/modular_citadel/code/modules/projectiles/guns/energy/energy_gun.dm @@ -39,7 +39,7 @@ obj/item/gun/energy/e_gun/cx/AltClick(mob/living/user) body_color = sanitize_hexcolor(body_color_input, desired_format=6, include_crunch=1) update_icon() -obj/item/gun/energy/e_gun/cx/worn_overlays(isinhands, icon_file, style_flags = NONE) +obj/item/gun/energy/e_gun/cx/worn_overlays(isinhands, icon_file, used_state, style_flags = NONE) . = ..() if(isinhands) var/mutable_appearance/body_inhand = mutable_appearance(icon_file, "cxe_body") diff --git a/modular_citadel/code/modules/projectiles/guns/pumpenergy.dm b/modular_citadel/code/modules/projectiles/guns/pumpenergy.dm index f7c0b343c3..fcead7f179 100644 --- a/modular_citadel/code/modules/projectiles/guns/pumpenergy.dm +++ b/modular_citadel/code/modules/projectiles/guns/pumpenergy.dm @@ -87,7 +87,7 @@ . = ..() . += "Alt-click to change firing modes." -/obj/item/gun/energy/pumpaction/worn_overlays(isinhands, icon_file, style_flags = NONE) //ammo counter for inhands +/obj/item/gun/energy/pumpaction/worn_overlays(isinhands, icon_file, used_state, style_flags = NONE) //ammo counter for inhands . = ..() var/ratio = CEILING((cell.charge / cell.maxcharge) * charge_sections, 1) var/obj/item/ammo_casing/energy/shot = ammo_type[current_firemode_index] From 8c1f1cb5d0cc62e2f30231b4cc68032fde44eaa2 Mon Sep 17 00:00:00 2001 From: Seris02 Date: Sat, 14 Mar 2020 11:50:32 +0800 Subject: [PATCH 011/113] merge fixes --- icons/mob/feet.dmi | Bin 21180 -> 22505 bytes icons/mob/feet_digi.dmi | Bin 27423 -> 28901 bytes icons/obj/clothing/shoes.dmi | Bin 15994 -> 16721 bytes 3 files changed, 0 insertions(+), 0 deletions(-) diff --git a/icons/mob/feet.dmi b/icons/mob/feet.dmi index 2774976b26c08696d3940895dd55d7d3247bf052..123525d49808aa7ae8dd3b06e89b65738532776f 100644 GIT binary patch literal 22505 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 literal 21180 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%0Ag(KoW8Wk0+yqTwo> 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 literal 27423 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 sb@FL`B6udgO48c8OaYI5CR483qnHy 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 F{{eH_t6%^C literal 15994 zcmbVzbyOT*w`DgF+yV&_G{KS(+#N!I-~>W&cX#*T0fM^*cXw&r3GS{z8h2=*r}F#W zyqUG$dNcD)|IuAlUF+7pr|v!boPG8URgjawLVtx00)en3KYvmLfxy5a7=(%p{Ak)2 z8UrU&?q5|MKN&d~*qhlpn%P)`K(1-=37ytU%$PxAXG*9?JfbZ}DZ^3Os6p2+G1apf zXsb;X?AcHDT?PnriI}UoNNyj(p58r8=D@Dc-Q8XK87W!o_cPv#a&1adU~gh zWte*gN};>eB|i0@d8o#*wBfW$2BlpnvVww+E3UO#0p4wxRF!bXrTB8CNqk8w`pcC~ z;(WiR1c8Fn%h&1^8#q>TGaSQ$N`n5Km&#lYc%RyQhTlt1_9DH#LF9TgF`J#?lo`z0 znfv;B-|D&qEVXW@g_+aIwpTCGILf@=)@~OxYQuw@LVZ$L?mqletkHgj;LvT_;W*RA zk?qya4}BR!0)ue5k6WJ?P~mbA!GU}}qSv<4adazKY8Xf_*cux?LCH9=Sf5n!!hQv@ zeM{9a$bR>2DY^P(n7n@ktDAS9;+Jp;}=tK{^KY96bUs~m= z(qQD#4@vxZ8%0mVME9j|ns}%~GfWTkw0R}))`G=()PcmcM!V?P(x%0Z{WE+lS>op0 z+YvDT4aV#u<<08Nk2Da75+wOapU?W=oU&z%#TUTcnWL7GH@fTwyVV zuk5N~2vX1ZPYa&qsV-%geJh#8sPLU3cv05JM(}C7dNa`TiwLDKWk8e%zWvdk#q>3b z8a5A`>XsVZ`LT<$0RtCpw&WX`>XW(Mqy;x9r_E}(FeR$&CEYy;386Dol*m^Yw+j^! z7xg2N9tc4Ml?oI1TQ2~Niu5|18RSP9@En;EH-Nbdg!CO({D0k?Wb5N?)@fr;V^Zdm zhAn9yeRly(b$aSK71!3zkj`ps~_43mJ1Ly^b<5za+a0*P(N&RUn zoSBr{&B}V(sKi9No$YPiD%El54z`S!mjD9;gQ1a8bWBXPwFNT~xBYfVK5eDt0;}1< zbP@I*Rb|h0}gbv)O0kMt-&ya4R1gQmcUFsf}=O zz17Xvjzm~32YBa1M@Q!*izGsvm5oj7a&b{zR#x}VNV1}q7FkhIQEh#FvAd=w>F7NQ zg=d!J@^2iTSI6)n$A|qoSzZ$|%A40mSX@b$g(#Jm37YRTnKD)2++=Wie+;%Ap@3$p zwo*cp#R18EJH!d9^NR}_nuV>+&9_WUCLO-uxWvSgrM)Znq2b}8iV8X&9<{04XV0FQ zKkV(9&Q|D*86|4<-Cse;HY;@6GngQ^->VGz&0qN(;WsIMN_r6FL#say#;Dm*2@GL& zbMv9W92;kE#d!Db-3vm(*w|RaEZR0YE&6=fRN7=2T16$L8AB9PD=X#1qbswid`Z8Q zjz7WnG_WxqVW*PqZzvtba9~7qfzKT+K+-mY@qfadEoZ=-@y+$OL-+F6&_?q{PTHu< zOr~_7r@MpdPF+w|Y3WE_ugYvY$sCdtBy$x`@A#%og1l5M9cTR zR_FAZ9Ga6oNPwa9N=rX$z>iq4}i#P^^8ciXPqb#nRP2YN|oMn#R6k)y)tr_P`s2K7)W8}6&I%e(z`OcuOP z44M7NvA~D1?R2~Yv@O1k8?wXK}o z8p+z@wRFcGk8~P%2cN`qH(a8jp)opu)UQC8w4gcdQo5DogKt*5UElr2RKQ5Tf*+|% zyL`cjg@v|9-+TJ{cxAfG?Oqx$)|v^7<^t<{22@;J%-(`$Tf8~v1^PbTxkO#sX5Fqm zEII#oE{O(XJB^2nQzM~f7HA7wMa8BRNv%B3u@h7jK zKuK9y%-!8xxXOcS#z*aN9RC2mOXqmZu5#n_4M`@Rb)82 zRM3$C?SE)9e8OQW5<=la9)U-kjuT-?c;Jkt@BsBPP3e#;p?)b4s7lyBq~}2X72X z{#>HN`X1C>Y26(W!weRwyzLiydd;9-`!uI|GH6Uc=usx!5YX_)=wepqvpPP~aiR-n#3{m+@nNYVzL5HIiIQGMs< zkV(3N=AOtfTMF8v)kyz@D2G2I(WCqqGKaA`EQmWCs#WqxYu>Ojq;lmda|?^J8_h>n z-(r7GeC}1xlvH{KaXDw2ohKY_)NQaNm3ZM2=iyR+e^XOT0xdJ}+}yM{R8Uu$nZlHD z=e(Jo!bk31lSRBUSdP^)mqAQ!9@l^g(@#1#h9-wYek){#!45b14~aryxlm zlcU8t(6Y;#SFTq*l4|a&^fuxTIuOkiE*tHRs!Z>DGn8&NB251Ky&S;b>uz)fim;>u zM#yhf;`na0^wa(~N6y_|j@3c4MLF@&jklNg+d@`Mh31=eZX^YF&~+KS8O!fC;$Q#c zp8nG`C%SY~Kj?6w`z}ZPY#B6n-lzh&dKy}diOEQ`Rzd{@19$#-n*W1Q3{PFbw11J$ASCEsF<6m6-9{3P(n7=TtSuk4if?Yo+Hk0lO z3JUtyZHkT9&D5$yckl8djQg;|cUPP37?(z^HAH2?88jm%@NAic;X`$LfSGcB$^IZs zA^Ky^s;!S??kg|!Si4<*Eg~iLV<`po$J1U;q`5KDy-GP2Y~|^&yk+WU94MK?KRwV_Cah8wb4Out*nfa zqB!bQQ7GaR6%}1iJ5gvDWOOI8#qb7RCXC8pxp2da-#0as$S*@( zaDJ%}BCDNkhE3+uS0JtXbFF=v+>ffRe!Ey7Avu-bcD+sfE+K{|c#-mz{J?`IxOGU{Weda8@)s%a37Fx)b>TuJ>CSz?X$FY)`v@T`Fsu&Vx(<*Z;(L_VLw8C{Lt6-?cd=1iQ)x>UCfdY zQpK-ddu&^d8!G|=1Dhgp;+E_QeR@KkhgXjJ1Namj8@uJ=`Alb&VtssP4B^!C%kyZK z=#d+i)xs}1*}J3Z7WO8BfgQ=I-u)c`%;pgUt6@!e`k;`W`+^KF*9d8xPMx%tyWZa3 z?d@&X525*|Gb%bjo1#E4`c+kRZ>lr=6~}w`oDm z(2s+=r5jxSi862;FzOVuL=mZ*r*p8c{bTb

HyLiM#vLZ~{a30(FP; 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 Date: Wed, 18 Mar 2020 22:41:21 +0200 Subject: [PATCH 012/113] Argh --- code/__HELPERS/unsorted.dm | 10 ++-- .../game/gamemodes/bloodsucker/bloodsucker.dm | 10 +--- .../bloodsucker/bloodsucker_life.dm | 7 +-- .../bloodsucker/datum_bloodsucker.dm | 9 +++- .../bloodsucker/objects/bloodsucker_crypt.dm | 44 +++++++++------- .../food_and_drinks/food/snacks_bread.dm | 4 +- .../mining/equipment/regenerative_core.dm | 2 +- .../chemistry/reagents/food_reagents.dm | 52 ++++++++----------- .../code/modules/reagents/objects/clothes.dm | 2 +- 9 files changed, 70 insertions(+), 70 deletions(-) diff --git a/code/__HELPERS/unsorted.dm b/code/__HELPERS/unsorted.dm index 4193e813fa..50966b797c 100644 --- a/code/__HELPERS/unsorted.dm +++ b/code/__HELPERS/unsorted.dm @@ -1566,16 +1566,16 @@ GLOBAL_DATUM_INIT(dview_mob, /mob/dview, new) //Checks to see if either the victim has a garlic necklace or garlic in their blood /proc/sucking_checks(var/mob/living/carbon/target, check_neck, check_blood) - //Byppass this if the target isnt carbon. - if(!iscarbon) + //Bypass this if the target isnt carbon. + if(!iscarbon(target)) return TRUE if(check_neck) if(istype(target.get_item_by_slot(SLOT_NECK), /obj/item/clothing/neck/garlic_necklace)) - to_chat(owner, "[victim] is wearing a garlic clove around their neck! You cant drink from them while it is on them!") + to_chat(src, "[target] is wearing a garlic clove around their neck! You cant drink from them while it is on them!") return FALSE if(check_blood) if(target.reagents.has_reagent(/datum/reagent/consumable/garlic)) - to_chat(target, "[H] tries to bite you, but recoils in disgust!") - to_chat(owner, "[victim] reeks of garlic! you can't bring yourself to drain such tainted blood.") + to_chat(target, "[src] tries to bite you, but recoils in disgust!") + to_chat(src, "[target] reeks of garlic! you can't bring yourself to drain such tainted blood.") return FALSE return TRUE diff --git a/code/game/gamemodes/bloodsucker/bloodsucker.dm b/code/game/gamemodes/bloodsucker/bloodsucker.dm index 0796fc3c4c..6315ea525b 100644 --- a/code/game/gamemodes/bloodsucker/bloodsucker.dm +++ b/code/game/gamemodes/bloodsucker/bloodsucker.dm @@ -248,11 +248,11 @@ // WHEN YOU DELETE THE ABOVE: Remove the 3 second timer on converting the vassal too. return FALSE -/datum/game_mode/proc/make_vassal(/mob/living/target, /datum/mind/creator) +/datum/game_mode/proc/make_vassal(var/mob/living/target, var/datum/mind/creator) if(!can_make_vassal(target, creator)) return FALSE // Make Vassal - var/datum/antagonist/vassal/V = new (target.mind) + var/datum/antagonist/vassal/V = new(target.mind) var/datum/antagonist/bloodsucker/B = creator.has_antag_datum(ANTAG_DATUM_BLOODSUCKER) V.master = B target.mind.add_antag_datum(V, V.master.get_team()) @@ -265,12 +265,6 @@ /datum/game_mode/proc/remove_vassal(datum/mind/vassal) vassal.remove_antag_datum(ANTAG_DATUM_VASSAL) - -/datum/game_mode/proc/count_vassals(datum/mind/master) - var/datum/antagonist/bloodsucker/B = master.has_antag_datum(ANTAG_DATUM_BLOODSUCKER) - var/vassal_amount - len(B.vassals) - return vassal_amount \ No newline at end of file diff --git a/code/modules/antagonists/bloodsucker/bloodsucker_life.dm b/code/modules/antagonists/bloodsucker/bloodsucker_life.dm index 4101d55df1..11d94975b3 100644 --- a/code/modules/antagonists/bloodsucker/bloodsucker_life.dm +++ b/code/modules/antagonists/bloodsucker/bloodsucker_life.dm @@ -82,15 +82,16 @@ /datum/antagonist/bloodsucker/proc/HandleHealing(mult = 1) // NOTE: Mult of 0 is just a TEST to see if we are injured and need to go into Torpor! //It is called from your coffin on close (by you only) - if(poweron_masquerade == TRUE || owner.current.AmStaked() || owner?.reagents?.has_reagent(/datum/reagent/consumable/garlic) + if(poweron_masquerade == TRUE || owner.current.AmStaked() || owner.current.reagents?.has_reagent(/datum/reagent/consumable/garlic)) return FALSE owner.current.adjustStaminaLoss(-1.5 + (regenRate * -7) * mult, 0) // Humans lose stamina damage really quickly. Vamps should heal more. owner.current.adjustCloneLoss(-0.1 * (regenRate * 2) * mult, 0) owner.current.adjustOrganLoss(ORGAN_SLOT_BRAIN, -1 * (regenRate * 4) * mult) //adjustBrainLoss(-1 * (regenRate * 4) * mult, 0) // No Bleeding - if(ishuman(owner.current) && bleed_rate => 0) //NOTE Current bleeding is horrible, not to count the amount of blood ballistics delete. + if(ishuman(owner.current)) //NOTE Current bleeding is horrible, not to count the amount of blood ballistics delete. var/mob/living/carbon/human/H = owner.current - H.bleed_rate =- 1 + if(H.bleed_rate > 0) //Only heal bleeding if we are actually bleeding + H.bleed_rate =- 0.5 + regenRate * mult if(iscarbon(owner.current)) // Damage Heal: Do I have damage to ANY bodypart? var/mob/living/carbon/C = owner.current var/costMult = 1 // Coffin makes it cheaper diff --git a/code/modules/antagonists/bloodsucker/datum_bloodsucker.dm b/code/modules/antagonists/bloodsucker/datum_bloodsucker.dm index 19a7a2889e..28aef3b6d4 100644 --- a/code/modules/antagonists/bloodsucker/datum_bloodsucker.dm +++ b/code/modules/antagonists/bloodsucker/datum_bloodsucker.dm @@ -341,10 +341,10 @@ // Assign True Reputation if(vamplevel == 4) SelectReputation(am_fledgling = FALSE, forced = TRUE) - to_chat(owner.current, "You are now a rank [vamplevel] Bloodsucker. Your strength, health, feed rate, regen rate, and maximum blood have all increased!") + to_chat(owner.current, "You are now a rank [vamplevel] Bloodsucker. Your strength, health, feed rate, regen rate, can have up to [vamplevel - count_vassals()] vassals, and maximum blood have all increased!") to_chat(owner.current, "Your existing powers have all ranked up as well!") update_hud(TRUE) - owner.current.playsound_local(null, 'sound/effects/pope_entry.ogg', 25, 1) // Play THIS sound for user only. The "null" is where turf would go if a location was needed. Null puts it right in their head. + owner.current.playsound_local(null, 'sound/effects/pope_entry.ogg', 25, TRUE, pressure_affected = FALSE) //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// @@ -768,3 +768,8 @@ /obj/screen/bloodsucker/sunlight_counter/update_counter(value, valuecolor) ..() maptext = "

" + +/datum/antagonist/bloodsucker/proc/count_vassals(datum/mind/master) + var/datum/antagonist/bloodsucker/B = master.has_antag_datum(ANTAG_DATUM_BLOODSUCKER) + var/vassal_amount = B.vassals.len + return vassal_amount diff --git a/code/modules/antagonists/bloodsucker/objects/bloodsucker_crypt.dm b/code/modules/antagonists/bloodsucker/objects/bloodsucker_crypt.dm index ec7c7e9ba8..3b1698c287 100644 --- a/code/modules/antagonists/bloodsucker/objects/bloodsucker_crypt.dm +++ b/code/modules/antagonists/bloodsucker/objects/bloodsucker_crypt.dm @@ -115,13 +115,15 @@ qdel(src) /obj/structure/bloodsucker/vassalrack/examine(mob/user) + var/datum/antagonist/bloodsucker/B = user.mind.has_antag_datum(ANTAG_DATUM_BLOODSUCKER) . = ..() - if(isbloodsucker(user) || isobserver(user)) + if(B || isobserver(user)) . += {"This is the vassal rack, which allows you to thrall crewmembers into loyal minions in your service."} . += {"You need to first secure the vassal rack by clicking on it while it is in your lair."} . += {"Simply click and hold on a victim, and then drag their sprite on the vassal rack. Alt click on the vassal rack to unbuckle them."} . += {"Make sure that the victim is handcuffed, or else they can simply run away or resist, as the process is not instant."} . += {"To convert the victim, simply click on the vassal rack itself. Sharp weapons work faster than other tools."} + . += {" You have only the power for [B.vamplevel - B.count_vassals(user.mind)] vassals"} /* if(user.mind.has_antag_datum(ANTAG_DATUM_VASSAL) . += {"This is the vassal rack, which allows your master to thrall crewmembers into his minions.\n Aid your master in bringing their victims here and keeping them secure.\n @@ -222,15 +224,15 @@ // Go away. Torturing. if(useLock) return - var/datum/antagonist/bloodsucker/bloodsuckerdatum = user.mind.has_antag_datum(ANTAG_DATUM_BLOODSUCKER) + var/datum/antagonist/bloodsucker/B = user.mind.has_antag_datum(ANTAG_DATUM_BLOODSUCKER) // CHECK ONE: Am I claiming this? Is it in the right place? - if(istype(bloodsuckerdatum) && !owner) - if(!bloodsuckerdatum.lair) + if(istype(B) && !owner) + if(!B.lair) to_chat(user, "You don't have a lair. Claim a coffin to make that location your lair.") - if(bloodsuckerdatum.lair != get_area(src)) - to_chat(user, "You may only activate this structure in your lair: [bloodsuckerdatum.lair].") + if(B.lair != get_area(src)) + to_chat(user, "You may only activate this structure in your lair: [B.lair].") return - switch(alert(user,"Do you wish to afix this structure here? Be aware you wont be able to unsecure it anymore","Secure [src]","Yes", "No")) + switch(alert(user,"Do you wish to afix this structure here? Be aware you wont be able to unsecure it anymore", "Secure [src]", "Yes", "No")) if("Yes") owner = user density = FALSE @@ -241,27 +243,31 @@ return // CHECK TWO: Am I a non-bloodsucker? var/mob/living/carbon/C = pick(buckled_mobs) - if(!istype(bloodsuckerdatum)) + if(!istype(B)) // Try to release this guy user_unbuckle_mob(C, user) return // Bloodsucker Owner! Let the boy go. if(C.mind) - var/datum/antagonist/vassal/vassaldatum = C.mind.has_antag_datum(ANTAG_DATUM_VASSAL) - if(istype(vassaldatum) && vassaldatum.master == bloodsuckerdatum || C.stat >= DEAD) + var/datum/antagonist/vassal/V = C.mind.has_antag_datum(ANTAG_DATUM_VASSAL) + if(istype(V) && V.master == B || C.stat >= DEAD) unbuckle_mob(C) useLock = FALSE // Failsafe return // Just torture the boy torture_victim(user, C) +#define CONVERT_COST 150 + /obj/structure/bloodsucker/vassalrack/proc/torture_victim(mob/living/user, mob/living/target) - var/datum/antagonist/bloodsucker/bloodsuckerdatum = user.mind.has_antag_datum(ANTAG_DATUM_BLOODSUCKER) + var/datum/antagonist/bloodsucker/B = user.mind.has_antag_datum(ANTAG_DATUM_BLOODSUCKER) // Check Bloodmob/living/M, force = FALSE, check_loc = TRUE - var/convert_cost = 200 - if(user.blood_volume < convert_cost + 5) + if(user.blood_volume < CONVERT_COST + 5) to_chat(user, "You don't have enough blood to initiate the Dark Communion with [target].") return + if(B.count_vassals(user.mind) > B.vamplevel) + to_chat(user, "Your power is yet too weak to bring more vassals under your control....") + return // Prep... useLock = TRUE // Step One: Tick Down Conversion from 3 to 0 @@ -302,12 +308,13 @@ useLock = FALSE return // Check: Blood - if(user.blood_volume < convert_cost) - to_chat(user, "You don't have enough blood to initiate the Dark Communion with [target], you need [convert_cost - user.blood_volume] units more!") + if(user.blood_volume < CONVERT_COST) + to_chat(user, "You don't have enough blood to initiate the Dark Communion with [target], you need [CONVERT_COST - user.blood_volume] units more!") useLock = FALSE return - bloodsuckerdatum.AddBloodVolume(-convert_cost) - target.add_mob_blood(user) + B.AddBloodVolume(-CONVERT_COST) + target.add_mob_blood(user, "Youve used [CONVERT_COST] amount of blood to gain a new vassal!") + to_chat(user, ) user.visible_message("[user] marks a bloody smear on [target]'s forehead and puts a wrist up to [target.p_their()] mouth!", \ "You paint a bloody marking across [target]'s forehead, place your wrist to [target.p_their()] mouth, and subject [target.p_them()] to the Dark Communion.") if(!do_mob(user, src, 50)) @@ -315,7 +322,7 @@ useLock = FALSE return // Convert to Vassal! - if(bloodsuckerdatum && bloodsuckerdatum.attempt_turn_vassal(target)) + if(B && B.attempt_turn_vassal(target)) //remove_loyalties(target) // In case of Mindshield, or appropriate Antag (Traitor, Internal, etc) //if (!target.buckled) // to_chat(user, "The ritual has been interrupted!") @@ -329,6 +336,7 @@ //remove_victim(target) // Remove on CLICK ONLY! useLock = FALSE +#undef CONVERT_COST /obj/structure/bloodsucker/vassalrack/proc/do_torture(mob/living/user, mob/living/target, mult = 1) var/torture_time = 15 // Fifteen seconds if you aren't using anything. Shorter with weapons and such. var/torture_dmg_brute = 2 diff --git a/code/modules/food_and_drinks/food/snacks_bread.dm b/code/modules/food_and_drinks/food/snacks_bread.dm index 9866e306c6..bab49e9f83 100644 --- a/code/modules/food_and_drinks/food/snacks_bread.dm +++ b/code/modules/food_and_drinks/food/snacks_bread.dm @@ -185,8 +185,8 @@ icon = 'icons/obj/food/burgerbread.dmi' icon_state = "garlicbread" item_state = "garlicbread" - bonus_reagents = list(/datum/reagent/consumable/nutriment = 5, /datum/reagent/consumable/vitamin = 2) - list_reagents = list(/datum/reagent/consumable/nutriment = 5, /datum/reagent/consumable/vitamin = 4, /datum/reagent/consumable/garlic = 2) + bonus_reagents = list(/datum/reagent/consumable/nutriment = 5, /datum/reagent/consumable/nutriment/vitamin = 2) + list_reagents = list(/datum/reagent/consumable/nutriment = 5, /datum/reagent/consumable/nutriment/vitamin= 4, /datum/reagent/consumable/garlic = 2) bitesize = 3 tastes = list("bread" = 1, "garlic" = 1, "butter" = 1) foodtype = GRAIN diff --git a/code/modules/mining/equipment/regenerative_core.dm b/code/modules/mining/equipment/regenerative_core.dm index 65304c5460..c0bc3232b7 100644 --- a/code/modules/mining/equipment/regenerative_core.dm +++ b/code/modules/mining/equipment/regenerative_core.dm @@ -72,7 +72,7 @@ if(proximity_flag) apply_healing_core(target, user) -/obj/item/organ/regenerative_core/apply_healing_core(atom/target, mob/user) +/obj/item/organ/regenerative_core/proc/apply_healing_core(atom/target, mob/user) if(ishuman(target)) var/mob/living/carbon/human/H = target if(inert) diff --git a/code/modules/reagents/chemistry/reagents/food_reagents.dm b/code/modules/reagents/chemistry/reagents/food_reagents.dm index 9218df1ad1..1c4810dd34 100644 --- a/code/modules/reagents/chemistry/reagents/food_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/food_reagents.dm @@ -425,7 +425,7 @@ /datum/reagent/consumable/garlic //NOTE: having garlic in your blood stops vampires from biting you. name = "Garlic Juice" - id = "garlic" + //id = "garlic" description = "Crushed garlic. Chefs love it, but it can make you smell bad." color = "#FEFEFE" taste_description = "garlic" @@ -435,37 +435,9 @@ if(isvampire(M)) //incapacitating but not lethal. Unfortunately, vampires cannot vomit. if(prob(min(25, current_cycle))) to_chat(M, "You can't get the scent of garlic out of your nose! You can barely think...") - M.Paralyze(10) + M.Stun(10) M.Jitter(10) return - else if(isbloodsucker(M)) - var/datum/antagonist/bloodsucker/bloodsuckerdatum = M.mind.has_antag_datum(ANTAG_DATUM_BLOODSUCKER) - switch(method) - if(INGEST) - if(prob(min(30, current_cycle))) - to_chat(M, "You cant get the smell of garlic out of your nose! You cant think straight because of it!") - M.Jitter(15) - return - if(prob(min(15, current_cycle))) - M.visible_message("Something you ate is burning your stomach!", / - "[M] clutches their stomach and falls to the ground!" - ) - M.Knockdown(20) - M.emote("scream") - return - if(prob(min(5, current_cycle))) - M.vomit() - return - if(INJECT) - if(prob(min(20, current_cycle))) - to_chat(M, "You feel like your veins are boiling!") - M.emote("scream") - M.adjustFireLoss(5) - return - if(prob(min(5, current_cycle))) - to_chat(M, "You are trying to purge the contaminants from your blood!") - M.vomit() - return else if(ishuman(M)) var/mob/living/carbon/human/H = M @@ -475,6 +447,26 @@ . = 1 ..() +/datum/reagent/consumable/condensedcapsaicin/reaction_mob(mob/living/M, method, reac_volume) + if(isbloodsucker(M)) + switch(method) + if(INGEST) + if(prob(min(30, current_cycle))) + to_chat(M, "You cant get the smell of garlic out of your nose! You cant think straight because of it!") + M.Jitter(15) + if(prob(min(15, current_cycle))) + M.visible_message("Something you ate is burning your stomach!", "[M] clutches their stomach and falls to the ground!") + M.Knockdown(20) + M.emote("scream") + if(prob(min(5, current_cycle)) && iscarbon(M)) + var/mob/living/carbon/C + C.vomit() + if(INJECT) + if(prob(min(20, current_cycle))) + to_chat(M, "You feel like your veins are boiling!") + M.emote("scream") + M.adjustFireLoss(5) + /datum/reagent/consumable/sprinkles name = "Sprinkles" value = 3 diff --git a/modular_citadel/code/modules/reagents/objects/clothes.dm b/modular_citadel/code/modules/reagents/objects/clothes.dm index 457f1dfb39..34af39bbe0 100644 --- a/modular_citadel/code/modules/reagents/objects/clothes.dm +++ b/modular_citadel/code/modules/reagents/objects/clothes.dm @@ -25,7 +25,7 @@ /obj/item/clothing/head/hattip/MouseDrop(atom/over_object) //You sure do love tipping your hat. - if(user) + if(usr) var/mob/living/carbon/C = usr if(is_ninja(C)) to_chat(C, "Using your superior ninja reflexes, you take the hat off before tipping.") From e439c2231d9afc63386dae21796dc9f081cff153 Mon Sep 17 00:00:00 2001 From: Artur Date: Thu, 19 Mar 2020 17:47:21 +0200 Subject: [PATCH 013/113] fIXE --- code/modules/antagonists/bloodsucker/datum_bloodsucker.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/antagonists/bloodsucker/datum_bloodsucker.dm b/code/modules/antagonists/bloodsucker/datum_bloodsucker.dm index 28aef3b6d4..fa3666e0e7 100644 --- a/code/modules/antagonists/bloodsucker/datum_bloodsucker.dm +++ b/code/modules/antagonists/bloodsucker/datum_bloodsucker.dm @@ -341,7 +341,7 @@ // Assign True Reputation if(vamplevel == 4) SelectReputation(am_fledgling = FALSE, forced = TRUE) - to_chat(owner.current, "You are now a rank [vamplevel] Bloodsucker. Your strength, health, feed rate, regen rate, can have up to [vamplevel - count_vassals()] vassals, and maximum blood have all increased!") + to_chat(owner.current, "You are now a rank [vamplevel] Bloodsucker. Your strength, health, feed rate, regen rate, can have up to [vamplevel - count_vassals(owner.current.mind)] vassals, and maximum blood have all increased!") to_chat(owner.current, "Your existing powers have all ranked up as well!") update_hud(TRUE) owner.current.playsound_local(null, 'sound/effects/pope_entry.ogg', 25, TRUE, pressure_affected = FALSE) From 9bb7529a4988bef58f713a6498052ea0d3ed80de Mon Sep 17 00:00:00 2001 From: Artur Date: Tue, 24 Mar 2020 16:55:46 +0200 Subject: [PATCH 014/113] Progress --- .../game/gamemodes/bloodsucker/bloodsucker.dm | 8 ++- code/game/machinery/cloning.dm | 2 +- .../bloodsucker/bloodsucker_integration.dm | 35 +----------- .../bloodsucker/bloodsucker_life.dm | 57 +++++++++---------- .../bloodsucker/objects/bloodsucker_crypt.dm | 12 ++-- .../antagonists/bloodsucker/powers/feed.dm | 2 +- .../bloodsucker/powers/fortitude.dm | 9 +++ code/modules/hydroponics/grown/replicapod.dm | 2 +- .../mining/equipment/regenerative_core.dm | 2 +- .../living/carbon/alien/special/facehugger.dm | 2 +- code/modules/mob/living/carbon/carbon.dm | 2 +- code/modules/mob/mob_movement.dm | 2 +- code/modules/reagents/chemistry/reagents.dm | 2 +- .../chemistry/reagents/alcohol_reagents.dm | 2 +- .../chemistry/reagents/food_reagents.dm | 2 +- 15 files changed, 60 insertions(+), 81 deletions(-) diff --git a/code/game/gamemodes/bloodsucker/bloodsucker.dm b/code/game/gamemodes/bloodsucker/bloodsucker.dm index 6315ea525b..58559b721f 100644 --- a/code/game/gamemodes/bloodsucker/bloodsucker.dm +++ b/code/game/gamemodes/bloodsucker/bloodsucker.dm @@ -9,8 +9,12 @@ var/list/vassal_allowed_antags = list(/datum/antagonist/brother, /datum/antagonist/traitor, /datum/antagonist/traitor/internal_affairs, /datum/antagonist/survivalist, \ /datum/antagonist/rev, /datum/antagonist/nukeop, /datum/antagonist/pirate, /datum/antagonist/cult, /datum/antagonist/abductee, /datum/antagonist/valentine, /datum/antagonist/heartbreaker,) // The antags you're allowed to be if turning Vassal. -/proc/isbloodsucker(mob/living/M) - return istype(M) && M.mind && M.mind.has_antag_datum(/datum/antagonist/bloodsucker) + +/proc/AmBloodsucker(mob/living/M, falseIfInDisguise = FALSE) + // No Datum + if(!M.mind || !M.mind.has_antag_datum(ANTAG_DATUM_BLOODSUCKER)) + return FALSE + return TRUE /datum/game_mode/bloodsucker name = "bloodsucker" diff --git a/code/game/machinery/cloning.dm b/code/game/machinery/cloning.dm index 323d82e0bc..02016ab0bb 100644 --- a/code/game/machinery/cloning.dm +++ b/code/game/machinery/cloning.dm @@ -159,7 +159,7 @@ mess = TRUE update_icon() return FALSE - if(isbloodsucker(clonemind)) //If the mind is a bloodsucker + if(AmBloodsucker(clonemind)) //If the mind is a bloodsucker return FALSE attempting = TRUE //One at a time!! diff --git a/code/modules/antagonists/bloodsucker/bloodsucker_integration.dm b/code/modules/antagonists/bloodsucker/bloodsucker_integration.dm index 3a6b4efedb..98fb69e52c 100644 --- a/code/modules/antagonists/bloodsucker/bloodsucker_integration.dm +++ b/code/modules/antagonists/bloodsucker/bloodsucker_integration.dm @@ -1,12 +1,6 @@ // INTEGRATION: Adding Procs and Datums to existing "classes" -/mob/living/proc/AmBloodsucker(falseIfInDisguise=FALSE) - // No Datum - if(!mind || !mind.has_antag_datum(ANTAG_DATUM_BLOODSUCKER)) - return FALSE - return TRUE - -/mob/living/proc/HaveBloodsuckerBodyparts(var/displaymessage="") // displaymessage can be something such as "rising from death" for Torpid Sleep. givewarningto is the person receiving messages. +/mob/living/proc/HaveBloodsuckerBodyparts(displaymessage = "") // displaymessage can be something such as "rising from death" for Torpid Sleep. givewarningto is the person receiving messages. if(!getorganslot(ORGAN_SLOT_HEART)) if(displaymessage != "") to_chat(src, "Without a heart, you are incapable of [displaymessage].") @@ -21,33 +15,6 @@ return FALSE return TRUE - - -// GET DAMAGE - - -// Do NOT count the damage on prosthetics for this. -/mob/living/proc/getBruteLoss_nonProsthetic() - return getBruteLoss() - -/mob/living/proc/getFireLoss_nonProsthetic() - return getFireLoss() - -/mob/living/carbon/getBruteLoss_nonProsthetic() - var/amount = 0 - for(var/obj/item/bodypart/BP in bodyparts) - if(BP.status < 2) - amount += BP.brute_dam - return amount - -/mob/living/carbon/getFireLoss_nonProsthetic() - var/amount = 0 - for(var/obj/item/bodypart/BP in bodyparts) - if(BP.status < 2) - amount += BP.burn_dam - return amount - -/mob/living/carbon // EXAMINING /mob/living/carbon/human/proc/ReturnVampExamine(var/mob/viewer) if(!mind || !viewer.mind) diff --git a/code/modules/antagonists/bloodsucker/bloodsucker_life.dm b/code/modules/antagonists/bloodsucker/bloodsucker_life.dm index b4fe2c012e..af2fd1b374 100644 --- a/code/modules/antagonists/bloodsucker/bloodsucker_life.dm +++ b/code/modules/antagonists/bloodsucker/bloodsucker_life.dm @@ -99,7 +99,7 @@ var/amInCoffinWhileTorpor = istype(C.loc, /obj/structure/closet/crate/coffin) && (mult == 0 || HAS_TRAIT(C, TRAIT_DEATHCOMA)) // Check for mult 0 OR death coma. (mult 0 means we're testing from coffin) if(amInCoffinWhileTorpor) mult *= 4 // Increase multiplier if we're sleeping in a coffin. - fireheal = min(C.getFireLoss_nonProsthetic(), regenRate) // NOTE: Burn damage ONLY heals in torpor. + fireheal = min(C.getFireLoss(), regenRate) // NOTE: Burn damage ONLY heals in torpor. costMult = 0.25 C.ExtinguishMob() CureDisabilities() // Extinguish Fire @@ -113,7 +113,7 @@ //if (C.getFireLoss() > owner.current.getMaxHealth()) // fireheal = regenRate / 2 // BRUTE: Always Heal - var/bruteheal = min(C.getBruteLoss_nonProsthetic(), regenRate) + var/bruteheal = min(C.getBruteLoss(), regenRate) var/toxinheal = min(C.getToxLoss(), regenRate) // Heal if Damaged if(bruteheal + fireheal + toxinheal > 0) // Just a check? Don't heal/spend, and return. @@ -130,24 +130,23 @@ return TRUE // Healed! Done for this tick. if(amInCoffinWhileTorpor) // Limbs? (And I have no other healing) var/list/missing = owner.current.get_missing_limbs() // Heal Missing - if (missing.len) // Cycle through ALL limbs and regen them! + if(missing.len) // Cycle through ALL limbs and regen them! for (var/targetLimbZone in missing) // 1) Find ONE Limb and regenerate it. owner.current.regenerate_limb(targetLimbZone, 0) // regenerate_limbs() <--- If you want to EXCLUDE certain parts, do it like this ----> regenerate_limbs(0, list("head")) - var/obj/item/bodypart/L = owner.current.get_bodypart( targetLimbZone ) // 2) Limb returns Damaged + var/obj/item/bodypart/L = owner.current.get_bodypart(targetLimbZone) // 2) Limb returns Damaged AddBloodVolume(50 * costMult) // Costs blood to heal L.brute_dam = 60 to_chat(owner.current, "Your flesh knits as it regrows [L]!") playsound(owner.current, 'sound/magic/demon_consume.ogg', 50, 1) // DONE! After regenerating ANY number of limbs, we stop here. return TRUE - /*else // REMOVED: For now, let's just leave prosthetics on. Maybe you WANT to be a robovamp. + else // REMOVED: For now, let's just leave prosthetics on. Maybe you WANT to be a robovamp. In actuality, robovamps are very bad. // Remove Prosthetic/False Limb for(var/obj/item/bodypart/BP in C.bodyparts) - message_admins("T1: [BP] ") - if (istype(BP) && BP.status == 2) - message_admins("T2: [BP] ") + if(istype(BP) && BP.status == 2) + to_chat(owner.current, "Your body expels the [BP]!") BP.drop_limb() - return TRUE */ + return TRUE // NOTE: Limbs have a "status", like their hosts "stat". 2 is dead (aka Prosthetic). 1 seems to be idle/alive.*/ return FALSE @@ -180,7 +179,10 @@ if(owner.current.blood_volume < BLOOD_VOLUME_BAD / 2) owner.current.blur_eyes(8 - 8 * (owner.current.blood_volume / BLOOD_VOLUME_BAD)) // Nutrition - owner.current.nutrition = min(owner.current.blood_volume, NUTRITION_LEVEL_FED) // <-- 350 //NUTRITION_LEVEL_FULL + if(owner.current.blood_volume < BLOOD_VOLUME_NORMAL) + owner.current.nutrition = min(owner.current.blood_volume, NUTRITION_LEVEL_WELL_FED) + else if(owner.current.blood_volume < BLOOD_VOLUME_SAFE) + owner.current.nutrition = min(owner.current.blood_volume, NUTRITION_LEVEL_FED) // <-- 350 //NUTRITION_LEVEL_FULL ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // DEATH @@ -190,7 +192,7 @@ /datum/antagonist/bloodsucker/proc/HandleDeath() // FINAL DEATH // Fire Damage? (above double health) - if(owner.current.getFireLoss_nonProsthetic() >= owner.current.maxHealth * 2.5) + if(owner.current.getFireLoss() >= owner.current.maxHealth * 3) FinalDeath() return // Staked while "Temp Death" or Asleep @@ -210,8 +212,8 @@ // for (var/datum/action/bloodsucker/masquerade/P in powers) // P.Deactivate() // TEMP DEATH - var/total_brute = owner.current.getBruteLoss_nonProsthetic() - var/total_burn = owner.current.getFireLoss_nonProsthetic() + var/total_brute = owner.current.getBruteLoss() + var/total_burn = owner.current.getFireLoss() var/total_toxloss = owner.current.getToxLoss() //This is neater than just putting it in total_damage var/total_damage = total_brute + total_burn + total_toxloss // Died? Convert to Torpor (fake death) @@ -219,7 +221,7 @@ Torpor_Begin() to_chat(owner, "Your immortal body will not yet relinquish your soul to the abyss. You enter Torpor.") sleep(30) //To avoid spam - if (poweron_masquerade == TRUE) + if(poweron_masquerade == TRUE) to_chat(owner, "Your wounds will not heal until you disable the Masquerade power.") // End Torpor: else // No damage, OR toxin healed AND brute healed and NOT in coffin (since you cannot heal burn) @@ -229,17 +231,14 @@ Torpor_End() // Fake Unconscious if(poweron_masquerade == TRUE && total_damage >= owner.current.getMaxHealth() - HEALTH_THRESHOLD_FULLCRIT) - owner.current.Unconscious(20,1) - //HEALTH_THRESHOLD_CRIT 0 - //HEALTH_THRESHOLD_FULLCRIT -30 - //HEALTH_THRESHOLD_DEAD -100 + owner.current.Unconscious(20, 1) -/datum/antagonist/bloodsucker/proc/Torpor_Begin(amInCoffin=FALSE) +/datum/antagonist/bloodsucker/proc/Torpor_Begin(amInCoffin = FALSE) owner.current.stat = UNCONSCIOUS - owner.current.fakedeath("bloodsucker") // Come after UNCONSCIOUS or else it fails + ADD_TRAIT(owner.current, TRAIT_FAKEDEATH, "bloodsucker") // Come after UNCONSCIOUS or else it fails ADD_TRAIT(owner.current, TRAIT_NODEATH, "bloodsucker") // Without this, you'll just keep dying while you recover. ADD_TRAIT(owner.current, TRAIT_RESISTHIGHPRESSURE, "bloodsucker") // So you can heal in 0 G. otherwise you just...heal forever. - ADD_TRAIT(owner.current, TRAIT_RESISTLOWPRESSURE, "bloodsucker") // So you can heal in 0 G. otherwise you just...heal forever. + ADD_TRAIT(owner.current, TRAIT_RESISTLOWPRESSURE, "bloodsucker") // Visuals owner.current.update_sight() owner.current.reload_fullscreen() @@ -248,10 +247,9 @@ if(power.active && !power.can_use_in_torpor) power.DeactivatePower() - /datum/antagonist/bloodsucker/proc/Torpor_End() + REMOVE_TRAIT(owner.current, TRAIT_FAKEDEATH, "bloodsucker") owner.current.stat = SOFT_CRIT - owner.current.cure_fakedeath("bloodsucker") // Come after SOFT_CRIT or else it fails REMOVE_TRAIT(owner.current, TRAIT_NODEATH, "bloodsucker") REMOVE_TRAIT(owner.current, TRAIT_RESISTHIGHPRESSURE, "bloodsucker") REMOVE_TRAIT(owner.current, TRAIT_RESISTLOWPRESSURE, "bloodsucker") @@ -288,14 +286,15 @@ owner.current.visible_message("[owner.current]'s skin crackles and dries, their skin and bones withering to dust. A hollow cry whips from what is now a sandy pile of remains.", \ "Your soul escapes your withering body as the abyss welcomes you to your Final Death.", \ "You hear a dry, crackling sound.") + sleep(50) owner.current.dust() // Fledglings get Gibbed else owner.current.visible_message("[owner.current]'s skin bursts forth in a spray of gore and detritus. A horrible cry echoes from what is now a wet pile of decaying meat.", \ "Your soul escapes your withering body as the abyss welcomes you to your Final Death.", \ "You hear a wet, bursting sound.") - owner.current.gib(TRUE, FALSE, FALSE)//Brain cloning is wierd and allows hellbounds. Lets destroy the brain for safety. - playsound(owner.current.loc, 'sound/effects/tendril_destroyed.ogg', 40, 1) + owner.current.gib(TRUE, FALSE, FALSE) //Brain cloning is wierd and allows hellbounds. Lets destroy the brain for safety. + playsound(owner.current, 'sound/effects/tendril_destroyed.ogg', 40, TRUE) @@ -305,15 +304,15 @@ ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/mob/proc/CheckBloodsuckerEatFood(var/food_nutrition) +/mob/proc/CheckBloodsuckerEatFood(food_nutrition) if(!isliving(src)) return var/mob/living/L = src - if(!L.AmBloodsucker()) + if(!AmBloodsucker(L)) return // We're a bloodsucker? Try to eat food... - var/datum/antagonist/bloodsucker/bloodsuckerdatum = mind.has_antag_datum(ANTAG_DATUM_BLOODSUCKER) - bloodsuckerdatum.bloodsucker_disgust(food_nutrition) + var/datum/antagonist/bloodsucker/B = L.mind.has_antag_datum(ANTAG_DATUM_BLOODSUCKER) + B.handle_eat_human_food(food_nutrition) /datum/antagonist/bloodsucker/proc/handle_eat_human_food(food_nutrition, puke_blood = TRUE, masquerade_override) // Called from snacks.dm and drinks.dm diff --git a/code/modules/antagonists/bloodsucker/objects/bloodsucker_crypt.dm b/code/modules/antagonists/bloodsucker/objects/bloodsucker_crypt.dm index 419093d153..c5f24ab537 100644 --- a/code/modules/antagonists/bloodsucker/objects/bloodsucker_crypt.dm +++ b/code/modules/antagonists/bloodsucker/objects/bloodsucker_crypt.dm @@ -132,7 +132,7 @@ /obj/structure/bloodsucker/vassalrack/MouseDrop_T(atom/movable/O, mob/user) if(!O.Adjacent(src) || O == user || !isliving(O) || !isliving(user) || useLock || has_buckled_mobs() || user.incapacitated()) return - if(!anchored && isbloodsucker(user)) + if(!anchored && AmBloodsucker(user)) to_chat(user, "Until this rack is secured in place, it cannot serve its purpose.") return // PULL TARGET: Remember if I was pullin this guy, so we can restore this @@ -185,7 +185,7 @@ /obj/structure/bloodsucker/vassalrack/user_unbuckle_mob(mob/living/M, mob/user) // Attempt Unbuckle - if(!isbloodsucker(user)) + if(!AmBloodsucker(user)) if(M == user) M.visible_message("[user] tries to release themself from the rack!",\ "You attempt to release yourself from the rack!") // For sound if not seen --> "You hear a squishy wet noise.") @@ -462,7 +462,7 @@ /obj/structure/bloodsucker/candelabrum/examine(mob/user) . = ..() - if((isbloodsucker()) || isobserver(user)) + if((AmBloodsucker(user)) || isobserver(user)) . += {"This is a magical candle which drains at the sanity of mortals who are not under your command while it is active."} . += {"You can alt click on it from any range to turn it on remotely, or simply be next to it and click on it to turn it on and off normally."} /* if(user.mind.has_antag_datum(ANTAG_DATUM_VASSAL) @@ -471,12 +471,12 @@ /obj/structure/bloodsucker/candelabrum/attack_hand(mob/user) var/datum/antagonist/vassal/T = user.mind.has_antag_datum(ANTAG_DATUM_VASSAL) - if(isbloodsucker(user) || istype(T)) + if(AmBloodsucker(user) || istype(T)) toggle() /obj/structure/bloodsucker/candelabrum/AltClick(mob/user) // Bloodsuckers can turn their candles on from a distance. SPOOOOKY. - if(isbloodsucker(user)) + if(AmBloodsucker(user)) toggle() /obj/structure/bloodsucker/candelabrum/proc/toggle(mob/user) @@ -493,7 +493,7 @@ if(lit) for(var/mob/living/carbon/human/H in viewers(7, src)) var/datum/antagonist/vassal/T = H.mind.has_antag_datum(ANTAG_DATUM_VASSAL) - if(isbloodsucker(H) || T) //We dont want vassals or vampires affected by this + if(AmBloodsucker(H) || T) //We dont want vassals or vampires affected by this return H.hallucination = 20 SEND_SIGNAL(H, COMSIG_ADD_MOOD_EVENT, "vampcandle", /datum/mood_event/vampcandle) diff --git a/code/modules/antagonists/bloodsucker/powers/feed.dm b/code/modules/antagonists/bloodsucker/powers/feed.dm index 178a5afd84..b0678d5ff4 100644 --- a/code/modules/antagonists/bloodsucker/powers/feed.dm +++ b/code/modules/antagonists/bloodsucker/powers/feed.dm @@ -267,7 +267,7 @@ to_chat(user, "You are full. Further blood will be wasted.") warning_full = TRUE // Blood Remaining? (Carbons/Humans only) - if(iscarbon(target) && !target.AmBloodsucker(1)) + if(iscarbon(target) && !AmBloodsucker(target, TRUE)) if(target.blood_volume <= BLOOD_VOLUME_BAD && warning_target_bloodvol > BLOOD_VOLUME_BAD) to_chat(user, "Your victim's blood volume is fatally low!") else if(target.blood_volume <= BLOOD_VOLUME_OKAY && warning_target_bloodvol > BLOOD_VOLUME_OKAY) diff --git a/code/modules/antagonists/bloodsucker/powers/fortitude.dm b/code/modules/antagonists/bloodsucker/powers/fortitude.dm index f0724f8204..a58034df0d 100644 --- a/code/modules/antagonists/bloodsucker/powers/fortitude.dm +++ b/code/modules/antagonists/bloodsucker/powers/fortitude.dm @@ -33,6 +33,15 @@ if(was_running) user.toggle_move_intent() while(bloodsuckerdatum && ContinueActive(user) || user.m_intent == MOVE_INTENT_RUN) + if(istype(user.buckled, /obj/vehicle)) //We dont want people using fortitude being able to use vehicles + var/obj/vehicle/V = user.buckled + var/datum/component/riding/VRD = V.GetComponent(/datum/component/riding) + if(VRD) + VRD.force_dismount(user) + to_chat(user, "You trip off the [V], your muscles too heavy for it to support you.") + else + V.unbuckle_mob(user, force = TRUE) + to_chat(user, "You fall off the [V], your weight making you too heavy to be supported by it.") // Pay Blood Toll (if awake) if(user.stat == CONSCIOUS) bloodsuckerdatum.AddBloodVolume(-0.5) // Used to be 0.3 blood per 2 seconds, but we're making it more expensive to keep on. diff --git a/code/modules/hydroponics/grown/replicapod.dm b/code/modules/hydroponics/grown/replicapod.dm index 3769f9eacc..aeddf771b8 100644 --- a/code/modules/hydroponics/grown/replicapod.dm +++ b/code/modules/hydroponics/grown/replicapod.dm @@ -78,7 +78,7 @@ make_podman = 1 break else - if(M.ckey == ckey && M.stat == DEAD && !M.suiciding) + if(M.ckey == ckey && M.stat == DEAD && !M.suiciding && AmBloodsucker(M)) make_podman = 1 if(isliving(M)) var/mob/living/L = M diff --git a/code/modules/mining/equipment/regenerative_core.dm b/code/modules/mining/equipment/regenerative_core.dm index 3b449ade7d..c89698530f 100644 --- a/code/modules/mining/equipment/regenerative_core.dm +++ b/code/modules/mining/equipment/regenerative_core.dm @@ -88,7 +88,7 @@ else to_chat(user, "You start to smear [src] on yourself. It feels and smells disgusting, but you feel amazingly refreshed in mere moments.") SSblackbox.record_feedback("nested tally", "hivelord_core", 1, list("[type]", "used", "self")) - if(!isbloodsucker(H)) + if(!AmBloodsucker(H)) H.revive(full_heal = TRUE) else H.revive(full_heal = FALSE) diff --git a/code/modules/mob/living/carbon/alien/special/facehugger.dm b/code/modules/mob/living/carbon/alien/special/facehugger.dm index de65b775b4..9640c72481 100644 --- a/code/modules/mob/living/carbon/alien/special/facehugger.dm +++ b/code/modules/mob/living/carbon/alien/special/facehugger.dm @@ -252,7 +252,7 @@ return 0 if(M.getorgan(/obj/item/organ/alien/hivenode)) return 0 - if(isbloodsucker(M)) + if(AmBloodsucker(M)) return 0 if(ismonkey(M)) diff --git a/code/modules/mob/living/carbon/carbon.dm b/code/modules/mob/living/carbon/carbon.dm index 6e2398c487..fb06ec8186 100644 --- a/code/modules/mob/living/carbon/carbon.dm +++ b/code/modules/mob/living/carbon/carbon.dm @@ -853,7 +853,7 @@ /mob/living/carbon/proc/can_defib() var/tlimit = DEFIB_TIME_LIMIT * 10 var/obj/item/organ/heart = getorgan(/obj/item/organ/heart) - if(suiciding || hellbound || HAS_TRAIT(src, TRAIT_HUSK) || isbloodsucker()) + if(suiciding || hellbound || HAS_TRAIT(src, TRAIT_HUSK) || AmBloodsucker()) return if((world.time - timeofdeath) > tlimit) return diff --git a/code/modules/mob/mob_movement.dm b/code/modules/mob/mob_movement.dm index bac8053c9a..a7e739b70e 100644 --- a/code/modules/mob/mob_movement.dm +++ b/code/modules/mob/mob_movement.dm @@ -354,7 +354,7 @@ if(m_intent == MOVE_INTENT_RUN) m_intent = MOVE_INTENT_WALK else - if (HAS_TRAIT(src,TRAIT_NORUNNING)) // FULPSTATION 7/10/19 So you can't run during fortitude. + if (HAS_TRAIT(src,TRAIT_NORUNNING)) to_chat(src, "You find yourself unable to run.") return FALSE m_intent = MOVE_INTENT_RUN diff --git a/code/modules/reagents/chemistry/reagents.dm b/code/modules/reagents/chemistry/reagents.dm index 384a113b27..5eb5b94de9 100644 --- a/code/modules/reagents/chemistry/reagents.dm +++ b/code/modules/reagents/chemistry/reagents.dm @@ -214,7 +214,7 @@ GLOBAL_LIST_INIT(name2reagent, build_name2reagent()) //For easy bloodsucker disgusting and blood removal /datum/reagent/proc/disgust_bloodsucker(mob/living/carbon/C, disgust, blood_change, blood_puke = TRUE, force) - if(isvamp(C)) + if(AmBloodsucker(C)) var/datum/antagonist/bloodsucker/bloodsuckerdatum = C.mind.has_antag_datum(ANTAG_DATUM_BLOODSUCKER) if(disgust) bloodsuckerdatum.handle_eat_human_food(disgust, blood_puke, force) diff --git a/code/modules/reagents/chemistry/reagents/alcohol_reagents.dm b/code/modules/reagents/chemistry/reagents/alcohol_reagents.dm index b7f32421aa..a7c0d55bb6 100644 --- a/code/modules/reagents/chemistry/reagents/alcohol_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/alcohol_reagents.dm @@ -579,7 +579,7 @@ All effects don't start immediately, but rather get worse over time; the rate is value = 1.3 /datum/reagent/consumable/ethanol/bloody_mary/on_mob_life(mob/living/carbon/C) - if(isvamp(C)) + if(AmBloodsucker(C)) disgust_bloodsucker(FALSE, 1) //Bloodsuckers get SOME blood from it, for style reasons. if(C.blood_volume < (BLOOD_VOLUME_NORMAL*C.blood_ratio)) C.blood_volume = min((BLOOD_VOLUME_NORMAL*C.blood_ratio), C.blood_volume + 3) //Bloody Mary quickly restores blood loss. diff --git a/code/modules/reagents/chemistry/reagents/food_reagents.dm b/code/modules/reagents/chemistry/reagents/food_reagents.dm index d6715988be..837c3614a8 100644 --- a/code/modules/reagents/chemistry/reagents/food_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/food_reagents.dm @@ -448,7 +448,7 @@ ..() /datum/reagent/consumable/condensedcapsaicin/reaction_mob(mob/living/M, method, reac_volume) - if(isbloodsucker(M)) + if(AmBloodsucker(M)) switch(method) if(INGEST) if(prob(min(30, current_cycle))) From fdc6a02eea369ec293e9656d50dc5ff7eb188157 Mon Sep 17 00:00:00 2001 From: Artur Date: Wed, 25 Mar 2020 12:46:42 +0200 Subject: [PATCH 015/113] Hm --- code/_onclick/item_attack.dm | 2 +- .../crafting/recipes/recipes_clothing.dm | 9 ++++++ .../game/gamemodes/bloodsucker/bloodsucker.dm | 2 +- code/game/objects/items/stacks/medical.dm | 4 +++ .../bloodsucker/bloodsucker_life.dm | 26 +++++++++++++++--- .../bloodsucker/bloodsucker_powers.dm | 6 ++++ .../bloodsucker/datum_bloodsucker.dm | 6 ++-- .../antagonists/bloodsucker/powers/cloak.dm | 2 +- code/modules/hydroponics/grown/garlic.dm | 4 ++- .../living/carbon/alien/special/facehugger.dm | 14 +++++----- .../carbon/human/species_types/vampire.dm | 4 +-- .../chemistry/reagents/food_reagents.dm | 1 + icons/mob/neck.dmi | Bin 45707 -> 45980 bytes icons/obj/clothing/neck.dmi | Bin 2866 -> 2996 bytes 14 files changed, 60 insertions(+), 20 deletions(-) diff --git a/code/_onclick/item_attack.dm b/code/_onclick/item_attack.dm index fe407509fe..baa1add7e1 100644 --- a/code/_onclick/item_attack.dm +++ b/code/_onclick/item_attack.dm @@ -119,7 +119,7 @@ send_item_attack_message(I, user) if(I.force) apply_damage(totitemdamage, I.damtype) //CIT CHANGE - replaces I.force with totitemdamage - if(I.damtype == BRUTE && !HAS_TRAIT(src, TRAIT_NOMARROW)) + if(I.damtype == BRUTE) if(prob(33)) I.add_mob_blood(src) var/turf/location = get_turf(src) diff --git a/code/datums/components/crafting/recipes/recipes_clothing.dm b/code/datums/components/crafting/recipes/recipes_clothing.dm index 5636be6b2a..fb3500a037 100644 --- a/code/datums/components/crafting/recipes/recipes_clothing.dm +++ b/code/datums/components/crafting/recipes/recipes_clothing.dm @@ -287,3 +287,12 @@ /obj/item/bedsheet/cosmos = 1) time = 60 category = CAT_CLOTHING + + +/datum/crafting_recipe/wintercoat_cosmic + name = "Cosmic Winter Coat" + result = /obj/item/clothing/neck/garlic_necklace + reqs = list(/obj/item/reagent_containers/food/snacks/grown/garlic = 15, + /obj/item/stack/cable_coil = 10) + time = 100 //Takes awhile to put all the garlics on the coil and knot it. + category = CAT_CLOTHING diff --git a/code/game/gamemodes/bloodsucker/bloodsucker.dm b/code/game/gamemodes/bloodsucker/bloodsucker.dm index 58559b721f..7f9873cfb0 100644 --- a/code/game/gamemodes/bloodsucker/bloodsucker.dm +++ b/code/game/gamemodes/bloodsucker/bloodsucker.dm @@ -262,7 +262,7 @@ target.mind.add_antag_datum(V, V.master.get_team()) // Update Bloodsucker Title (we're a daddy now) B.SelectTitle(am_fledgling = FALSE) // Only works if you have no title yet. - // lOg it + // Log it message_admins("[target] has become a Vassal, and is enslaved to [creator].") log_admin("[target] has become a Vassal, and is enslaved to [creator].") return TRUE diff --git a/code/game/objects/items/stacks/medical.dm b/code/game/objects/items/stacks/medical.dm index 205ce57251..50e9b94e97 100644 --- a/code/game/objects/items/stacks/medical.dm +++ b/code/game/objects/items/stacks/medical.dm @@ -72,6 +72,8 @@ to_chat(user, " [M] is at full health.") return FALSE user.visible_message("[user] applies \the [src] on [M].", "You apply \the [src] on [M].") + if(AmBloodsucker(M)) + return M.heal_bodypart_damage((heal_brute/2)) return TRUE if(iscarbon(M)) @@ -148,6 +150,8 @@ return if(iscarbon(M)) return heal_carbon(M, user, 0, heal_burn) + if(AmBloodsucker(M)) + return to_chat(user, "You can't heal [M] with the \the [src]!") /obj/item/stack/medical/ointment/suicide_act(mob/living/user) diff --git a/code/modules/antagonists/bloodsucker/bloodsucker_life.dm b/code/modules/antagonists/bloodsucker/bloodsucker_life.dm index af2fd1b374..01e8774c27 100644 --- a/code/modules/antagonists/bloodsucker/bloodsucker_life.dm +++ b/code/modules/antagonists/bloodsucker/bloodsucker_life.dm @@ -12,7 +12,7 @@ /datum/antagonist/bloodsucker/proc/LifeTick()// Should probably run from life.dm, same as handle_changeling, but will be an utter pain to move set waitfor = FALSE // Don't make on_gain() wait for this function to finish. This lets this code run on the side. - var/notice_healing = FALSE + var/notice_healing while(owner && !AmFinalDeath()) // owner.has_antag_datum(ANTAG_DATUM_BLOODSUCKER) == src if(owner.current.stat == CONSCIOUS && !poweron_feed && !HAS_TRAIT(owner.current, TRAIT_DEATHCOMA)) // Deduct Blood AddBloodVolume(-0.1) // -.15 (before tick went from 10 to 30, but we also charge more for faking life now) @@ -82,16 +82,32 @@ /datum/antagonist/bloodsucker/proc/HandleHealing(mult = 1) // NOTE: Mult of 0 is just a TEST to see if we are injured and need to go into Torpor! //It is called from your coffin on close (by you only) - if(poweron_masquerade == TRUE || owner.current.AmStaked() || owner.current.reagents?.has_reagent(/datum/reagent/consumable/garlic)) + var/notice_garlic + var/notice_necklace + if(poweron_masquerade == TRUE || owner.current.AmStaked()) + return FALSE + if(owner.current.reagents?.has_reagent(/datum/reagent/consumable/garlic)) + if(notice_garlic) + to_chat(owner.current, "Garlic in your blood is interfering with your regeneration!") + notice_garlic = TRUE + return FALSE + if(istype(owner.current.get_item_by_slot(SLOT_NECK), /obj/item/clothing/neck/garlic_necklace)) + if(notice_necklace) + to_chat(owner.current, "The necklace on your neck is interrupting your healing!") + notice_necklace = TRUE return FALSE owner.current.adjustStaminaLoss(-1.5 + (regenRate * -7) * mult, 0) // Humans lose stamina damage really quickly. Vamps should heal more. owner.current.adjustCloneLoss(-0.1 * (regenRate * 2) * mult, 0) owner.current.adjustOrganLoss(ORGAN_SLOT_BRAIN, -1 * (regenRate * 4) * mult) //adjustBrainLoss(-1 * (regenRate * 4) * mult, 0) + if(notice_garlic) + notice_garlic = FALSE + if(notice_necklace) + notice_necklace = FALSE // No Bleeding if(ishuman(owner.current)) //NOTE Current bleeding is horrible, not to count the amount of blood ballistics delete. var/mob/living/carbon/human/H = owner.current if(H.bleed_rate > 0) //Only heal bleeding if we are actually bleeding - H.bleed_rate =- 0.5 + regenRate * mult + H.bleed_rate =- 0.5 + regenRate * 0.2 * mult if(iscarbon(owner.current)) // Damage Heal: Do I have damage to ANY bodypart? var/mob/living/carbon/C = owner.current var/costMult = 1 // Coffin makes it cheaper @@ -235,6 +251,7 @@ /datum/antagonist/bloodsucker/proc/Torpor_Begin(amInCoffin = FALSE) owner.current.stat = UNCONSCIOUS + owner.current.apply_status_effect(STATUS_EFFECT_UNCONSCIOUS) ADD_TRAIT(owner.current, TRAIT_FAKEDEATH, "bloodsucker") // Come after UNCONSCIOUS or else it fails ADD_TRAIT(owner.current, TRAIT_NODEATH, "bloodsucker") // Without this, you'll just keep dying while you recover. ADD_TRAIT(owner.current, TRAIT_RESISTHIGHPRESSURE, "bloodsucker") // So you can heal in 0 G. otherwise you just...heal forever. @@ -248,8 +265,9 @@ power.DeactivatePower() /datum/antagonist/bloodsucker/proc/Torpor_End() - REMOVE_TRAIT(owner.current, TRAIT_FAKEDEATH, "bloodsucker") owner.current.stat = SOFT_CRIT + owner.current.remove_status_effect(STATUS_EFFECT_UNCONSCIOUS) + owner.current.cure_fakedeath("bloodsucker") REMOVE_TRAIT(owner.current, TRAIT_NODEATH, "bloodsucker") REMOVE_TRAIT(owner.current, TRAIT_RESISTHIGHPRESSURE, "bloodsucker") REMOVE_TRAIT(owner.current, TRAIT_RESISTLOWPRESSURE, "bloodsucker") diff --git a/code/modules/antagonists/bloodsucker/bloodsucker_powers.dm b/code/modules/antagonists/bloodsucker/bloodsucker_powers.dm index 507e1f2739..abfd2d120f 100644 --- a/code/modules/antagonists/bloodsucker/bloodsucker_powers.dm +++ b/code/modules/antagonists/bloodsucker/bloodsucker_powers.dm @@ -93,6 +93,12 @@ if(display_error) to_chat(owner, "You have a stake in your chest! Your powers are useless.") return FALSE + if(istype(owner.get_item_by_slot(SLOT_NECK), /obj/item/clothing/neck/garlic_necklace)) + to_chat(owner, "") + return FALSE + if(owner.reagents?.has_reagent(/datum/reagent/consumable/garlic)) + to_chat(owner, "Garlic in your blood is interfering with your powers!") + return FALSE // Incap? if(must_be_capacitated) var/mob/living/L = owner diff --git a/code/modules/antagonists/bloodsucker/datum_bloodsucker.dm b/code/modules/antagonists/bloodsucker/datum_bloodsucker.dm index 20ce602fce..1821ec2f3d 100644 --- a/code/modules/antagonists/bloodsucker/datum_bloodsucker.dm +++ b/code/modules/antagonists/bloodsucker/datum_bloodsucker.dm @@ -22,7 +22,7 @@ // STATS var/vamplevel = 0 var/vamplevel_unspent = 1 - var/regenRate = 0.4 // How many points of Brute do I heal per tick? + var/regenRate = 0.4 // How fast do I regenerate? var/feedAmount = 15 // Amount of blood drawn from a target per tick. var/maxBloodVolume = 600 // Maximum blood a Vamp can hold via feeding. // BLOOD_VOLUME_NORMAL 550 // BLOOD_VOLUME_SAFE 475 //BLOOD_VOLUME_OKAY 336 //BLOOD_VOLUME_BAD 224 // BLOOD_VOLUME_SURVIVE 122 // OBJECTIVES @@ -47,8 +47,8 @@ SSticker.mode.bloodsuckers |= owner // Add if not already in here (and you might be, if you were picked at round start) SSticker.mode.check_start_sunlight()// Start Sunlight? (if first Vamp) SelectFirstName()// Name & Title - SelectTitle(am_fledgling=TRUE) // If I have a creator, then set as Fledgling. - SelectReputation(am_fledgling=TRUE) + SelectTitle(am_fledgling = TRUE) // If I have a creator, then set as Fledgling. + SelectReputation(am_fledgling = TRUE) AssignStarterPowersAndStats()// Give Powers & Stats forge_bloodsucker_objectives()// Objectives & Team update_bloodsucker_icons_added(owner.current, "bloodsucker") // Add Antag HUD diff --git a/code/modules/antagonists/bloodsucker/powers/cloak.dm b/code/modules/antagonists/bloodsucker/powers/cloak.dm index 1bb7b02357..a616c39923 100644 --- a/code/modules/antagonists/bloodsucker/powers/cloak.dm +++ b/code/modules/antagonists/bloodsucker/powers/cloak.dm @@ -2,7 +2,7 @@ /datum/action/bloodsucker/cloak name = "Cloak of Darkness" - desc = "Blend into the shadows and become invisible to the untrained eye. Movement is slowed in brightly lit areas." + desc = "Blend into the shadows and become invisible to the untrained eye. Movement is slowed in brightly lit areas, and you cannot dissapear while mortals watch you." button_icon_state = "power_cloak" bloodcost = 5 cooldown = 50 diff --git a/code/modules/hydroponics/grown/garlic.dm b/code/modules/hydroponics/grown/garlic.dm index 7ee8aab9a8..fd24376282 100644 --- a/code/modules/hydroponics/grown/garlic.dm +++ b/code/modules/hydroponics/grown/garlic.dm @@ -23,6 +23,8 @@ /obj/item/clothing/neck/garlic_necklace name = "garlic necklace" - desc = "A clove of garlic on a string, tied to itself in a circle, just might fit around your neck. For paranoid people who fear getting their blood sucked." + desc = "A clove of garlic on a cable, tied to itself in a circle, just might fit around your neck. For loonies people who fear getting their blood sucked." icon_state = "garlic_necklace" + item_state = "garlic_necklace" + alternate_worn_icon = 'icons/mob/neck.dmi' \ No newline at end of file diff --git a/code/modules/mob/living/carbon/alien/special/facehugger.dm b/code/modules/mob/living/carbon/alien/special/facehugger.dm index 9640c72481..eb1b38b9ff 100644 --- a/code/modules/mob/living/carbon/alien/special/facehugger.dm +++ b/code/modules/mob/living/carbon/alien/special/facehugger.dm @@ -247,13 +247,13 @@ /proc/CanHug(mob/living/M) if(!istype(M)) - return 0 + return FALSE if(M.stat == DEAD) - return 0 + return FALSE if(M.getorgan(/obj/item/organ/alien/hivenode)) - return 0 + return FALSE if(AmBloodsucker(M)) - return 0 + return FALSE if(ismonkey(M)) return 1 @@ -262,9 +262,9 @@ if(ishuman(C) && !(SLOT_WEAR_MASK in C.dna.species.no_equip)) var/mob/living/carbon/human/H = C if(H.is_mouth_covered(head_only = 1)) - return 0 - return 1 - return 0 + return FALSE + return TRUE + return FALSE #undef MIN_ACTIVE_TIME #undef MAX_ACTIVE_TIME diff --git a/code/modules/mob/living/carbon/human/species_types/vampire.dm b/code/modules/mob/living/carbon/human/species_types/vampire.dm index b62b8304da..6a4ef2e9d9 100644 --- a/code/modules/mob/living/carbon/human/species_types/vampire.dm +++ b/code/modules/mob/living/carbon/human/species_types/vampire.dm @@ -82,7 +82,7 @@ to_chat(H, "You're already full!") return //This checks whether or not they are wearing a garlic clove on their neck - if(sucking_checks(victim, TRUE, FALSE)) + if(!sucking_checks(victim, TRUE, FALSE)) return if(victim.stat == DEAD) to_chat(H, "You need a living victim!") @@ -96,7 +96,7 @@ to_chat(H, "[victim] is blessed! You stop just in time to avoid catching fire.") return //Here we check now for both the garlic cloves on the neck and for blood in the victims bloodstream. - if(sucking_checks(victim, TRUE, TRUE)) + if(!sucking_checks(victim, TRUE, TRUE)) return if(!do_after(H, 30, target = victim)) return diff --git a/code/modules/reagents/chemistry/reagents/food_reagents.dm b/code/modules/reagents/chemistry/reagents/food_reagents.dm index 837c3614a8..ce276a0d8b 100644 --- a/code/modules/reagents/chemistry/reagents/food_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/food_reagents.dm @@ -18,6 +18,7 @@ /datum/reagent/consumable/on_mob_life(mob/living/carbon/M) current_cycle++ M.nutrition += nutriment_factor + M.CheckBloodsuckerEatFood(nutriment_factor) holder.remove_reagent(type, metabolization_rate) /datum/reagent/consumable/reaction_mob(mob/living/M, method=TOUCH, reac_volume) diff --git a/icons/mob/neck.dmi b/icons/mob/neck.dmi index de59a136d99ca23e0b751b962395756793bcaafb..d899950b791ce189c53b278e03adf02163ad67a3 100644 GIT binary patch delta 3295 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 delta 3009 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 DO}7Xq diff --git a/icons/obj/clothing/neck.dmi b/icons/obj/clothing/neck.dmi index 0bdaa36e6248c6651f423569e52749145389f88c..ea44ae0a7c1ef53a3ef91b29ff6da5ca40799b05 100644 GIT binary patch delta 2685 zcmV-@3WD{r7PJ?TBmq9LB{Knk?%kvI?ak`fnDXA$^5(pGG0MpR0004WQchCV=-0C=30l(9|&F${+1%Tq+{45Glwf?8D_=qn&6aWB^8 zl9S_t;OPkzA$36K+wAE3f7!B~wSC_04@bLwIhZ%(N+sJT`*?e2x_1hH5?k_cZ@P%o zN4X?bK(K`?m(D1JE7Jwy+FmxMJ28xSiT^mppuu8cCYMx}RZwE7zD)D1OW+5UsRusI zQlID;bf}L^RYs^fyb9BVp=ZRrNbx<0MS?aF9Y3M?k`l0^)MDxydf-IONYc zOp9Alsn!4gAJ{qP-asVx+*rGrJZoN*#OFftd){;3bFVRsNS~^IVln-AJgy&4BtGu` z$)tWfHu6YI7$1GCB}|N^K8i3o{zOk0o6r-+C-sDhbSnKZgvlvAVQge#VnhQNADx^W z)c__^>1iG?lkw#npPCxi1I|oLXaQ#@C$)enzQ$SO4uH9-DGeYPI5ROb!v+NmoSmGV zWrG3*9-AIZtAdh$rFS1fFfccj%ke>pJsO#a!8GJdj6WWojKef!OiWCt(?Bbi%iBL^aD&Lb2&|b2@mqC#e@7R_)@7Jk~&or#28#uf)%5GgGAh&gK z08!+BpmGo65aP_6&*wdSxO4IOFX`V9QR+Sbg!A*B@`g%K=1}uRiWDi*f2@LOE-Yxq ziPuGStu~$h_}3K6^jo_HITqFOQn*UP~chRayb}6lkk4{VP!=PXc69z zKd!C@1xR=(HK9d#D4uYQ#NWeje4WG$7R=IriU2fCQ!!q&%BupLcj6#ot>TC z-MzhCrH2wwCYc44Nmc_?Dvh{YjItLH5-b}HMp*?|!P|59&s8_)z&<|1`?c*Yu#e9$ z_$B};D?@;gVem}=QdSgzb!amcexdLiKipm4+uLIn63Vaubhb3N`7px*(Am;|C;+m$ zWh~d6gGtCPA~*-PU=lKekPt*H6`W2ploCh?B9@Czr%|K?02}=6{l^b?cMiER;F5?7 z&X(pDAaF^}VTr!pl3k8G%K%xU=*Z8urTwE+76aW$(AnR}T z@9KAWEuoKC>=GUU*){$Lyq3{NEOr@>fc%hvui*7NK>=I=kBB_bYk2*CK~Ml!#3Ld< zuwF?Y1so#Z)@$jbfJ5X5*DDF>g%f%$Ap?PP#KAcV6fRPv|AAVzeRLEwghq&Wd~CN` zL4z<7cy_zp4kw{acz^zRauQZR!b63Wuw}PT1fXr(LBlB2YPSR+MkU06GRZ;HC}i6w zt+vFoZPg?^eRKK-eonc6D|9wG8}QS)FM;zw6sJ!08%I|9d>((8&h_>aGs~0mOczIq^0coFDF^7f^sX#}5b8 zUSA|wHX4kwH^<=po3pbwvJwhHKr@UDS!uP-&NPH@eZ%0c4;co3-vl6KMbT(ZPtX4P z>x|<=!ofSk2jABb4&FU{m|+3vY-v9H2L8JL_aPyO*lszUhFOkvCAy35`+eY&h)2$r zCS3akQCdK>Wg`q9VEg2R`V567e0##9))DNZPuezl39Mn;RUaG2t)mt~0U*%qq2My)cTX_9VPypA$BO-@PZ>5g{4v|Brw-PdxaE?L^7b#MtNRc9a zoVw?zZqOK<0Pg~iVMXi;JUqMT1_{Ec&xhyCXFB~iW|*GKuphYWT{fHW#(rP>eDRz) zA12iBAzX)lxOIte2+0uoJYVz&bRN1e4_`V1hm{|=> z;qz_!h;Fcd#{|T6eV-e!4JIt&>l+Gn!@O58sK1RgVl`# zcokB>YsFcZL%?xm|Nr`yr)&KKI@QcoR&C z_0Q*Sf-kYp^Ep?I11ho4^Enq)fUBME`CQl=^}xcwD(s{F9wDr2alf)5tuW|4);6pK rMp11;TVN9GsDnm`6e&`qPfY&+-(PbFg4`VK00000NkvXXu0mjf4fXKt delta 2554 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 Q^Z)<=07*qoM6N<$f@%1{O#lD@ From 7d22cb00d03b31b63cd79661b9dacb1063d398c1 Mon Sep 17 00:00:00 2001 From: Artur Date: Wed, 25 Mar 2020 19:32:46 +0200 Subject: [PATCH 016/113] Mixes and fixes --- code/__HELPERS/unsorted.dm | 3 - code/_onclick/hud/human.dm | 2 +- .../game/gamemodes/bloodsucker/bloodsucker.dm | 2 +- .../bloodsucker/bloodsucker_life.dm | 51 +++----- .../bloodsucker/bloodsucker_powers.dm | 6 +- .../bloodsucker/bloodsucker_sunlight.dm | 10 +- .../bloodsucker/datum_bloodsucker.dm | 120 ++++++++---------- .../bloodsucker/objects/bloodsucker_crypt.dm | 4 +- .../antagonists/bloodsucker/powers/feed.dm | 4 +- code/modules/language/vampiric.dm | 2 +- .../carbon/human/species_types/jellypeople.dm | 2 +- .../chemistry/reagents/food_reagents.dm | 6 +- 12 files changed, 97 insertions(+), 115 deletions(-) diff --git a/code/__HELPERS/unsorted.dm b/code/__HELPERS/unsorted.dm index e0300eca10..1240c38d93 100644 --- a/code/__HELPERS/unsorted.dm +++ b/code/__HELPERS/unsorted.dm @@ -1573,11 +1573,8 @@ GLOBAL_DATUM_INIT(dview_mob, /mob/dview, new) return TRUE if(check_neck) if(istype(target.get_item_by_slot(SLOT_NECK), /obj/item/clothing/neck/garlic_necklace)) - to_chat(src, "[target] is wearing a garlic clove around their neck! You cant drink from them while it is on them!") return FALSE if(check_blood) if(target.reagents.has_reagent(/datum/reagent/consumable/garlic)) - to_chat(target, "[src] tries to bite you, but recoils in disgust!") - to_chat(src, "[target] reeks of garlic! you can't bring yourself to drain such tainted blood.") return FALSE return TRUE diff --git a/code/_onclick/hud/human.dm b/code/_onclick/hud/human.dm index 490f0aa0f0..328e008f10 100644 --- a/code/_onclick/hud/human.dm +++ b/code/_onclick/hud/human.dm @@ -367,7 +367,7 @@ blood_display.hud = src infodisplay += blood_display - vamprank_display = new /obj/screen/bloodsucker/rank_counter // Vampire Rank + vamprank_display = new /obj/screen/bloodsucker/rank_counter // Bloodsucker Rank vamprank_display.hud = src infodisplay += vamprank_display diff --git a/code/game/gamemodes/bloodsucker/bloodsucker.dm b/code/game/gamemodes/bloodsucker/bloodsucker.dm index 7f9873cfb0..adcb80ff07 100644 --- a/code/game/gamemodes/bloodsucker/bloodsucker.dm +++ b/code/game/gamemodes/bloodsucker/bloodsucker.dm @@ -133,7 +133,7 @@ // Not High Enough if(creator) var/datum/antagonist/bloodsucker/creator_bloodsucker = creator.has_antag_datum(ANTAG_DATUM_BLOODSUCKER) - if(!istype(creator_bloodsucker) || creator_bloodsucker.vamplevel < BLOODSUCKER_LEVEL_TO_EMBRACE) + if(!istype(creator_bloodsucker) || creator_bloodsucker.bloodsucker_level < BLOODSUCKER_LEVEL_TO_EMBRACE) to_chat(creator, "Your blood is too thin to turn this corpse!") return FALSE return TRUE diff --git a/code/modules/antagonists/bloodsucker/bloodsucker_life.dm b/code/modules/antagonists/bloodsucker/bloodsucker_life.dm index 01e8774c27..90919a4e80 100644 --- a/code/modules/antagonists/bloodsucker/bloodsucker_life.dm +++ b/code/modules/antagonists/bloodsucker/bloodsucker_life.dm @@ -15,7 +15,7 @@ var/notice_healing while(owner && !AmFinalDeath()) // owner.has_antag_datum(ANTAG_DATUM_BLOODSUCKER) == src if(owner.current.stat == CONSCIOUS && !poweron_feed && !HAS_TRAIT(owner.current, TRAIT_DEATHCOMA)) // Deduct Blood - AddBloodVolume(-0.1) // -.15 (before tick went from 10 to 30, but we also charge more for faking life now) + AddBloodVolume(passive_blood_drain) // -.1 currently if(HandleHealing(1)) // Heal if(notice_healing == FALSE && owner.current.blood_volume > 0) to_chat(owner, "The power of your blood begins knitting your wounds...") @@ -39,12 +39,12 @@ ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////// /datum/antagonist/bloodsucker/proc/AddBloodVolume(value) - owner.current.blood_volume = CLAMP(owner.current.blood_volume + value, 0, maxBloodVolume) + owner.current.blood_volume = CLAMP(owner.current.blood_volume + value, 0, max_blood_volume) update_hud() /datum/antagonist/bloodsucker/proc/HandleFeeding(mob/living/carbon/target, mult=1) // mult: SILENT feed is 1/3 the amount - var/blood_taken = min(feedAmount, target.blood_volume) * mult // Starts at 15 (now 8 since we doubled the Feed time) + var/blood_taken = min(feed_amount, target.blood_volume) * mult // Starts at 15 (now 8 since we doubled the Feed time) target.blood_volume -= blood_taken // Simple Animals lose a LOT of blood, and take damage. This is to keep cats, cows, and so forth from giving you insane amounts of blood. if(!ishuman(target)) @@ -82,32 +82,21 @@ /datum/antagonist/bloodsucker/proc/HandleHealing(mult = 1) // NOTE: Mult of 0 is just a TEST to see if we are injured and need to go into Torpor! //It is called from your coffin on close (by you only) - var/notice_garlic - var/notice_necklace + var/actual_regen = regen_rate + additional_regen if(poweron_masquerade == TRUE || owner.current.AmStaked()) return FALSE - if(owner.current.reagents?.has_reagent(/datum/reagent/consumable/garlic)) - if(notice_garlic) - to_chat(owner.current, "Garlic in your blood is interfering with your regeneration!") - notice_garlic = TRUE + if(owner.current.reagents.has_reagent(/datum/reagent/consumable/garlic)) return FALSE if(istype(owner.current.get_item_by_slot(SLOT_NECK), /obj/item/clothing/neck/garlic_necklace)) - if(notice_necklace) - to_chat(owner.current, "The necklace on your neck is interrupting your healing!") - notice_necklace = TRUE return FALSE - owner.current.adjustStaminaLoss(-1.5 + (regenRate * -7) * mult, 0) // Humans lose stamina damage really quickly. Vamps should heal more. - owner.current.adjustCloneLoss(-0.1 * (regenRate * 2) * mult, 0) - owner.current.adjustOrganLoss(ORGAN_SLOT_BRAIN, -1 * (regenRate * 4) * mult) //adjustBrainLoss(-1 * (regenRate * 4) * mult, 0) - if(notice_garlic) - notice_garlic = FALSE - if(notice_necklace) - notice_necklace = FALSE + owner.current.adjustStaminaLoss(-1.5 + (actual_regen * -7) * mult, 0) // Humans lose stamina damage really quickly. Vamps should heal more. + owner.current.adjustCloneLoss(-0.1 * (actual_regen * 2) * mult, 0) + owner.current.adjustOrganLoss(ORGAN_SLOT_BRAIN, -1 * (actual_regen * 4) * mult) // No Bleeding if(ishuman(owner.current)) //NOTE Current bleeding is horrible, not to count the amount of blood ballistics delete. var/mob/living/carbon/human/H = owner.current if(H.bleed_rate > 0) //Only heal bleeding if we are actually bleeding - H.bleed_rate =- 0.5 + regenRate * 0.2 * mult + H.bleed_rate =- 0.5 + actual_regen * 0.2 * mult if(iscarbon(owner.current)) // Damage Heal: Do I have damage to ANY bodypart? var/mob/living/carbon/C = owner.current var/costMult = 1 // Coffin makes it cheaper @@ -115,7 +104,7 @@ var/amInCoffinWhileTorpor = istype(C.loc, /obj/structure/closet/crate/coffin) && (mult == 0 || HAS_TRAIT(C, TRAIT_DEATHCOMA)) // Check for mult 0 OR death coma. (mult 0 means we're testing from coffin) if(amInCoffinWhileTorpor) mult *= 4 // Increase multiplier if we're sleeping in a coffin. - fireheal = min(C.getFireLoss(), regenRate) // NOTE: Burn damage ONLY heals in torpor. + fireheal = min(C.getFireLoss(), actual_regen) // NOTE: Burn damage ONLY heals in torpor. costMult = 0.25 C.ExtinguishMob() CureDisabilities() // Extinguish Fire @@ -125,12 +114,10 @@ else if(owner.current.blood_volume <= 0) // No Blood? Lower Mult mult = 0.25 - // Crit from burn? Lower damage to maximum allowed. - //if (C.getFireLoss() > owner.current.getMaxHealth()) - // fireheal = regenRate / 2 + // BRUTE: Always Heal - var/bruteheal = min(C.getBruteLoss(), regenRate) - var/toxinheal = min(C.getToxLoss(), regenRate) + var/bruteheal = min(C.getBruteLoss(), actual_regen) + var/toxinheal = min(C.getToxLoss(), actual_regen) // Heal if Damaged if(bruteheal + fireheal + toxinheal > 0) // Just a check? Don't heal/spend, and return. if(mult == 0) @@ -195,10 +182,14 @@ if(owner.current.blood_volume < BLOOD_VOLUME_BAD / 2) owner.current.blur_eyes(8 - 8 * (owner.current.blood_volume / BLOOD_VOLUME_BAD)) // Nutrition + owner.current.nutrition = clamp(owner.current.blood_volume, 545, 0) //The amount of blood is how full we are. + //A bit higher regeneration based on blood volume if(owner.current.blood_volume < BLOOD_VOLUME_NORMAL) - owner.current.nutrition = min(owner.current.blood_volume, NUTRITION_LEVEL_WELL_FED) - else if(owner.current.blood_volume < BLOOD_VOLUME_SAFE) - owner.current.nutrition = min(owner.current.blood_volume, NUTRITION_LEVEL_FED) // <-- 350 //NUTRITION_LEVEL_FULL + additional_regen = 0.3 + else if(owner.current.blood_volume < BLOOD_VOLUME_OKAY) + additional_regen = 0.2 + else if(owner.current.blood_volume < BLOOD_VOLUME_BAD) + additional_regen = 0.1 ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // DEATH @@ -300,7 +291,7 @@ // Free my Vassals! FreeAllVassals() // Elders get Dusted - if(vamplevel >= 4) // (vamptitle) + if(bloodsucker_level >= 4) // (bloodsucker_title) owner.current.visible_message("[owner.current]'s skin crackles and dries, their skin and bones withering to dust. A hollow cry whips from what is now a sandy pile of remains.", \ "Your soul escapes your withering body as the abyss welcomes you to your Final Death.", \ "You hear a dry, crackling sound.") diff --git a/code/modules/antagonists/bloodsucker/bloodsucker_powers.dm b/code/modules/antagonists/bloodsucker/bloodsucker_powers.dm index abfd2d120f..5c4b1f2b9f 100644 --- a/code/modules/antagonists/bloodsucker/bloodsucker_powers.dm +++ b/code/modules/antagonists/bloodsucker/bloodsucker_powers.dm @@ -94,10 +94,12 @@ to_chat(owner, "You have a stake in your chest! Your powers are useless.") return FALSE if(istype(owner.get_item_by_slot(SLOT_NECK), /obj/item/clothing/neck/garlic_necklace)) - to_chat(owner, "") + if(display_error) + to_chat(owner, "") return FALSE if(owner.reagents?.has_reagent(/datum/reagent/consumable/garlic)) - to_chat(owner, "Garlic in your blood is interfering with your powers!") + if(display_error) + to_chat(owner, "Garlic in your blood is interfering with your powers!") return FALSE // Incap? if(must_be_capacitated) diff --git a/code/modules/antagonists/bloodsucker/bloodsucker_sunlight.dm b/code/modules/antagonists/bloodsucker/bloodsucker_sunlight.dm index 263f91a9a6..b7d98c6783 100644 --- a/code/modules/antagonists/bloodsucker/bloodsucker_sunlight.dm +++ b/code/modules/antagonists/bloodsucker/bloodsucker_sunlight.dm @@ -141,23 +141,23 @@ if(!bloodsuckerdatum.warn_sun_locker) to_chat(M, "Your skin sizzles. The [M.current.loc] doesn't protect well against UV bombardment.") bloodsuckerdatum.warn_sun_locker = TRUE - M.current.adjustFireLoss(0.5 + bloodsuckerdatum.vamplevel / 2) // M.current.fireloss += 0.5 + bloodsuckerdatum.vamplevel / 2 // Do DIRECT damage. Being spaced was causing this to not occur. setFireLoss(bloodsuckerdatum.vamplevel) + M.current.adjustFireLoss(0.5 + bloodsuckerdatum.bloodsucker_level / 2) // M.current.fireloss += 0.5 + bloodsuckerdatum.bloodsucker_level / 2 // Do DIRECT damage. Being spaced was causing this to not occur. setFireLoss(bloodsuckerdatum.bloodsucker_level) M.current.updatehealth() SEND_SIGNAL(M.current, COMSIG_ADD_MOOD_EVENT, "vampsleep", /datum/mood_event/daylight_1) // Out in the Open? Buh Bye else if(!bloodsuckerdatum.warn_sun_burn) - if(bloodsuckerdatum.vamplevel > 0) + if(bloodsuckerdatum.bloodsucker_level > 0) to_chat(M, "The solar flare sets your skin ablaze!") else to_chat(M, "The solar flare scalds your neophyte skin!") bloodsuckerdatum.warn_sun_burn = TRUE if(M.current.fire_stacks <= 0) M.current.fire_stacks = 0 - if(bloodsuckerdatum.vamplevel > 0) - M.current.adjust_fire_stacks(0.2 + bloodsuckerdatum.vamplevel / 10) + if(bloodsuckerdatum.bloodsucker_level > 0) + M.current.adjust_fire_stacks(0.2 + bloodsuckerdatum.bloodsucker_level / 10) M.current.IgniteMob() - M.current.adjustFireLoss(2 + bloodsuckerdatum.vamplevel) // M.current.fireloss += 2 + bloodsuckerdatum.vamplevel // Do DIRECT damage. Being spaced was causing this to not occur. //setFireLoss(2 + bloodsuckerdatum.vamplevel) + M.current.adjustFireLoss(2 + bloodsuckerdatum.bloodsucker_level) // M.current.fireloss += 2 + bloodsuckerdatum.bloodsucker_level // Do DIRECT damage. Being spaced was causing this to not occur. //setFireLoss(2 + bloodsuckerdatum.bloodsucker_level) M.current.updatehealth() SEND_SIGNAL(M.current, COMSIG_ADD_MOOD_EVENT, "vampsleep", /datum/mood_event/daylight_2) diff --git a/code/modules/antagonists/bloodsucker/datum_bloodsucker.dm b/code/modules/antagonists/bloodsucker/datum_bloodsucker.dm index 1821ec2f3d..f8c35f7938 100644 --- a/code/modules/antagonists/bloodsucker/datum_bloodsucker.dm +++ b/code/modules/antagonists/bloodsucker/datum_bloodsucker.dm @@ -8,9 +8,9 @@ job_rank = ROLE_BLOODSUCKER // NAME - var/vampname // My Dracula name - var/vamptitle // My Dracula title - var/vampreputation // My "Surname" or description of my deeds + var/bloodsucker_name // My Dracula style name + var/bloodsucker_title // My Dracula style title + var/bloodsucker_reputation // My "Surname" or description of my deeds // CLAN var/datum/team/vampireclan/clan var/list/datum/antagonist/vassal/vassals = list()// Vassals under my control. Periodically remove the dead ones. @@ -20,28 +20,26 @@ var/poweron_feed = FALSE // Am I feeding? var/poweron_masquerade = FALSE // STATS - var/vamplevel = 0 - var/vamplevel_unspent = 1 - var/regenRate = 0.4 // How fast do I regenerate? - var/feedAmount = 15 // Amount of blood drawn from a target per tick. - var/maxBloodVolume = 600 // Maximum blood a Vamp can hold via feeding. // BLOOD_VOLUME_NORMAL 550 // BLOOD_VOLUME_SAFE 475 //BLOOD_VOLUME_OKAY 336 //BLOOD_VOLUME_BAD 224 // BLOOD_VOLUME_SURVIVE 122 + var/bloodsucker_level + var/bloodsucker_level_unspent = 1 + var/regen_rate = 0.4 // How fast do I regenerate? + var/additional_regen // How much additional blood regen we gain from bonuses such as high blood. + var/feed_amount = 15 // Amount of blood drawn from a target per tick. + var/max_blood_volume = 600 // Maximum blood a Vamp can hold via feeding. // OBJECTIVES var/list/datum/objective/objectives_given = list() // For removal if needed. var/area/lair var/obj/structure/closet/crate/coffin // TRACKING - var/foodInGut = 0 // How much food to throw up later. You shouldn't have eaten that. - var/warn_sun_locker = FALSE // So we only get the locker burn message once per day. - var/warn_sun_burn = FALSE // So we only get the sun burn message once per day. - var/had_toxlover = FALSE + var/foodInGut // How much food to throw up later. You shouldn't have eaten that. + var/warn_sun_locker // So we only get the locker burn message once per day. + var/warn_sun_burn // So we only get the sun burn message once per day. + var/had_toxlover var/level_bloodcost + var/passive_blood_drain = -0.1 //The amount of blood we loose each bloodsucker life() tick // LISTS var/static/list/defaultTraits = list (TRAIT_STABLEHEART, TRAIT_NOBREATH, TRAIT_SLEEPIMMUNE, TRAIT_NOCRITDAMAGE, TRAIT_RESISTCOLD, TRAIT_RADIMMUNE, TRAIT_NIGHT_VISION, \ TRAIT_NOSOFTCRIT, TRAIT_NOHARDCRIT, TRAIT_AGEUSIA, TRAIT_COLDBLOODED, TRAIT_NONATURALHEAL, TRAIT_NOMARROW, TRAIT_NOPULSE, TRAIT_VIRUSIMMUNE) - // NOTES: TRAIT_AGEUSIA <-- Doesn't like flavors. - // REMOVED: TRAIT_NODEATH - // TO ADD: - //var/static/list/defaultOrgans = list (/obj/item/organ/heart/vampheart,/obj/item/organ/heart/vampeyes) /datum/antagonist/bloodsucker/on_gain() SSticker.mode.bloodsuckers |= owner // Add if not already in here (and you might be, if you were picked at round start) @@ -68,18 +66,18 @@ /datum/antagonist/bloodsucker/greet() var/fullname = ReturnFullName(TRUE) - to_chat(owner, "You are [fullname], a bloodsucking vampire!
") + to_chat(owner, "You are [fullname], a strain of vampire dubbed bloodsucker!
") owner.announce_objectives() to_chat(owner, "* You regenerate your health slowly, you're weak to fire, and you depend on blood to survive. Allow your stolen blood to run too low, and you will find yourself at \ risk of being discovered!
") //to_chat(owner, "As an immortal, your power is linked to your age. The older you grow, the more abilities you will have access to.") - var/vamp_greet - vamp_greet += "* Other Bloodsuckers are not necessarily your friends, but your survival may depend on cooperation. Betray them at your own discretion and peril.
" - vamp_greet += "* Use \",b\" to speak your ancient Bloodsucker language.
" - vamp_greet += "Bloodsucker Tip: Rest in a Coffin to claim it, and that area, as your lair.
" - vamp_greet += "Bloodsucker Tip: Fear the daylight! Solar flares will bombard the station periodically, and only your coffin can guarantee your safety.
" - vamp_greet += "Bloodsucker Tip: You wont loose blood if you are unconcious or sleeping. Use this to your advantage to conserve blood.
" - to_chat(owner, vamp_greet) + var/bloodsucker_greet + bloodsucker_greet += "* Other Bloodsuckers are not necessarily your friends, but your survival may depend on cooperation. Betray them at your own discretion and peril.
" + bloodsucker_greet += "* Use \",b\" to speak your ancient Bloodsucker language.
" + bloodsucker_greet += "Bloodsucker Tip: Rest in a Coffin to claim it, and that area, as your lair.
" + bloodsucker_greet += "Bloodsucker Tip: Fear the daylight! Solar flares will bombard the station periodically, and only your coffin can guarantee your safety.
" + bloodsucker_greet += "Bloodsucker Tip: You wont loose blood if you are unconcious or sleeping. Use this to your advantage to conserve blood.
" + to_chat(owner, bloodsucker_greet) owner.current.playsound_local(null, 'sound/bloodsucker/BloodsuckerAlert.ogg', 100, FALSE, pressure_affected = FALSE) antag_memory += "Although you were born a mortal, in un-death you earned the name [fullname].
" @@ -100,7 +98,7 @@ /datum/antagonist/bloodsucker/proc/SelectFirstName() // Names (EVERYONE gets one)) if(owner.current.gender == MALE) - vampname = pick("Desmond","Rudolph","Dracul","Vlad","Pyotr","Gregor","Cristian","Christoff","Marcu","Andrei","Constantin","Gheorghe","Grigore","Ilie","Iacob","Luca","Mihail","Pavel","Vasile","Octavian","Sorin", \ + bloodsucker_name = pick("Desmond","Rudolph","Dracul","Vlad","Pyotr","Gregor","Cristian","Christoff","Marcu","Andrei","Constantin","Gheorghe","Grigore","Ilie","Iacob","Luca","Mihail","Pavel","Vasile","Octavian","Sorin", \ "Sveyn","Aurel","Alexe","Iustin","Theodor","Dimitrie","Octav","Damien","Magnus","Caine","Abel", // Romanian/Ancient "Lucius","Gaius","Otho","Balbinus","Arcadius","Romanos","Alexios","Vitellius", // Latin "Melanthus","Teuthras","Orchamus","Amyntor","Axion", // Greek @@ -108,7 +106,7 @@ "Dio") else - vampname = pick("Islana","Tyrra","Greganna","Pytra","Hilda","Andra","Crina","Viorela","Viorica","Anemona","Camelia","Narcisa","Sorina","Alessia","Sophia","Gladda","Arcana","Morgan","Lasarra","Ioana","Elena", \ + bloodsucker_name = pick("Islana","Tyrra","Greganna","Pytra","Hilda","Andra","Crina","Viorela","Viorica","Anemona","Camelia","Narcisa","Sorina","Alessia","Sophia","Gladda","Arcana","Morgan","Lasarra","Ioana","Elena", \ "Alina","Rodica","Teodora","Denisa","Mihaela","Svetla","Stefania","Diyana","Kelssa","Lilith", // Romanian/Ancient "Alexia","Athanasia","Callista","Karena","Nephele","Scylla","Ursa", // Latin "Alcestis","Damaris","Elisavet","Khthonia","Teodora", // Greek @@ -116,57 +114,57 @@ /datum/antagonist/bloodsucker/proc/SelectTitle(am_fledgling = 0, forced = FALSE) // Already have Title - if (!forced && vamptitle != null) + if(!forced && bloodsucker_title != null) return // Titles [Master] - if (!am_fledgling) + if(!am_fledgling) if(owner.current.gender == MALE) - vamptitle = pick ("Count","Baron","Viscount","Prince","Duke","Tzar","Dreadlord","Lord","Master") + bloodsucker_title = pick ("Count","Baron","Viscount","Prince","Duke","Tzar","Dreadlord","Lord","Master") else - vamptitle = pick ("Countess","Baroness","Viscountess","Princess","Duchess","Tzarina","Dreadlady","Lady","Mistress") + bloodsucker_title = pick ("Countess","Baroness","Viscountess","Princess","Duchess","Tzarina","Dreadlady","Lady","Mistress") to_chat(owner, "You have earned a title! You are now known as [ReturnFullName(TRUE)]!") // Titles [Fledgling] else - vamptitle = null + bloodsucker_title = null /datum/antagonist/bloodsucker/proc/SelectReputation(am_fledgling = 0, forced=FALSE) // Already have Reputation - if(!forced && vampreputation != null) + if(!forced && bloodsucker_reputation != null) return // Reputations [Master] if(!am_fledgling) - vampreputation = pick("Butcher","Blood Fiend","Crimson","Red","Black","Terror","Nightman","Feared","Ravenous","Fiend","Malevolent","Wicked","Ancient","Plaguebringer","Sinister","Forgotten","Wretched","Baleful", \ + bloodsucker_reputation = pick("Butcher","Blood Fiend","Crimson","Red","Black","Terror","Nightman","Feared","Ravenous","Fiend","Malevolent","Wicked","Ancient","Plaguebringer","Sinister","Forgotten","Wretched","Baleful", \ "Inqisitor","Harvester","Reviled","Robust","Betrayer","Destructor","Damned","Accursed","Terrible","Vicious","Profane","Vile","Depraved","Foul","Slayer","Manslayer","Sovereign","Slaughterer", \ "Forsaken","Mad","Dragon","Savage","Villainous","Nefarious","Inquisitor","Marauder","Horrible","Immortal","Undying","Overlord","Corrupt","Hellspawn","Tyrant","Sanguineous") if(owner.current.gender == MALE) if(prob(10)) // Gender override - vampreputation = pick("King of the Damned", "Blood King", "Emperor of Blades", "Sinlord", "God-King") + bloodsucker_reputation = pick("King of the Damned", "Blood King", "Emperor of Blades", "Sinlord", "God-King") else if(prob(10)) // Gender override - vampreputation = pick("Queen of the Damned", "Blood Queen", "Empress of Blades", "Sinlady", "God-Queen") + bloodsucker_reputation = pick("Queen of the Damned", "Blood Queen", "Empress of Blades", "Sinlady", "God-Queen") to_chat(owner, "You have earned a reputation! You are now known as [ReturnFullName(TRUE)]!") // Reputations [Fledgling] else - vampreputation = pick ("Crude","Callow","Unlearned","Neophyte","Novice","Unseasoned","Fledgling","Young","Neonate","Scrapling","Untested","Unproven","Unknown","Newly Risen","Born","Scavenger","Unknowing",\ + bloodsucker_reputation = pick ("Crude","Callow","Unlearned","Neophyte","Novice","Unseasoned","Fledgling","Young","Neonate","Scrapling","Untested","Unproven","Unknown","Newly Risen","Born","Scavenger","Unknowing",\ "Unspoiled","Disgraced","Defrocked","Shamed","Meek","Timid","Broken")//,"Fresh") /datum/antagonist/bloodsucker/proc/AmFledgling() - return !vamptitle + return !bloodsucker_title /datum/antagonist/bloodsucker/proc/ReturnFullName(var/include_rep=0) var/fullname // Name First - fullname = (vampname ? vampname : owner.current.name) + fullname = (bloodsucker_name ? bloodsucker_name : owner.current.name) // Title - if(vamptitle) - fullname = vamptitle + " " + fullname + if(bloodsucker_title) + fullname = bloodsucker_title + " " + fullname // Rep - if(include_rep && vampreputation) - fullname = fullname + " the " + vampreputation + if(include_rep && bloodsucker_reputation) + fullname = fullname + " the " + bloodsucker_reputation return fullname @@ -201,15 +199,12 @@ var/mob/living/carbon/human/H = owner.current var/datum/species/S = H.dna.species // Make Changes - H.physiology.brute_mod *= 0.8 // <-------------------- Start small, but burn mod increases based on rank! + H.physiology.brute_mod *= 0.8 H.physiology.cold_mod = 0 H.physiology.stun_mod *= 0.5 H.physiology.siemens_coeff *= 0.75 //base electrocution coefficient 1 - //S.heatmod += 0.5 // Heat shouldn't affect. Only Fire. - //S.punchstunthreshold = 8 //damage at which punches from this race will stun 9 S.punchdamagelow += 1 //lowest possible punch damage 0 S.punchdamagehigh += 1 //highest possible punch damage 9 - // Clown if(istype(H) && owner.assigned_role == "Clown") H.dna.remove_mutation(CLOWNMUT) to_chat(H, "As a vampiric clown, you are no longer a danger to yourself. Your nature is subdued.") @@ -217,8 +212,6 @@ CheckVampOrgans() // Heart, Eyes // Language owner.current.grant_language(/datum/language/vampiric) - // Soul - //owner.current.hellbound = TRUE Causes wierd stuff owner.hasSoul = FALSE // If false, renders the character unable to sell their soul. owner.isholy = FALSE // is this person a chaplain or admin role allowed to use bibles // Disabilities @@ -250,7 +243,6 @@ // Clown if(istype(H) && owner.assigned_role == "Clown") H.dna.add_mutation(CLOWNMUT) - // NOTE: Use initial() to return things to default! // Physiology owner.current.regenerate_organs() // Update Health @@ -266,13 +258,13 @@ set waitfor = FALSE if(!owner || !owner.current) return - vamplevel_unspent ++ + bloodsucker_level_unspent ++ // Spend Rank Immediately? if(istype(owner.current.loc, /obj/structure/closet/crate/coffin)) SpendRank() else to_chat(owner, "You have grown more ancient! Sleep in a coffin that you have claimed to thicken your blood and become more powerful.") - if(vamplevel_unspent >= 2) + if(bloodsucker_level_unspent >= 2) to_chat(owner, "Bloodsucker Tip: If you cannot find or steal a coffin to use, you can build one from wooden planks.
") /datum/antagonist/bloodsucker/proc/LevelUpPowers() @@ -281,10 +273,10 @@ /datum/antagonist/bloodsucker/proc/SpendRank() set waitfor = FALSE - if(vamplevel_unspent <= 0 || !owner || !owner.current || !owner.current.client || !isliving(owner.current)) + if(bloodsucker_level_unspent <= 0 || !owner || !owner.current || !owner.current.client || !isliving(owner.current)) return var/mob/living/L = owner.current - level_bloodcost = maxBloodVolume * 0.2 + level_bloodcost = max_blood_volume * 0.2 //If the blood volume of the bloodsucker is lower than the cost to level up, return and inform the bloodsucker //TODO: Make this into a radial, or perhaps a tgui next UI @@ -300,7 +292,7 @@ if(options.len > 1) var/choice = input(owner.current, "You have the opportunity to grow more ancient at the cost of [level_bloodcost] units of blood. Select a power to advance your Rank.", "Your Blood Thickens...") in options // Cheat-Safety: Can't keep opening/closing coffin to spam levels - if(vamplevel_unspent <= 0) // Already spent all your points, and tried opening/closing your coffin, pal. + if(bloodsucker_level_unspent <= 0) // Already spent all your points, and tried opening/closing your coffin, pal. return if(!istype(owner.current.loc, /obj/structure/closet/crate/coffin)) to_chat(owner.current, "Return to your coffin to advance your Rank.") @@ -331,17 +323,17 @@ // More Health owner.current.setMaxHealth(owner.current.maxHealth + 10) // Vamp Stats - regenRate += 0.05 // Points of brute healed (starts at 0.3) - feedAmount += 2 // Increase how quickly I munch down vics (15) - maxBloodVolume += 100 // Increase my max blood (600) + regen_rate += 0.05 // Points of brute healed (starts at 0.3) + feed_amount += 2 // Increase how quickly I munch down vics (15) + max_blood_volume += 100 // Increase my max blood (600) ///////// - vamplevel ++ - vamplevel_unspent -- + bloodsucker_level ++ + bloodsucker_level_unspent -- // Assign True Reputation - if(vamplevel == 4) + if(bloodsucker_level == 4) SelectReputation(am_fledgling = FALSE, forced = TRUE) - to_chat(owner.current, "You are now a rank [vamplevel] Bloodsucker. Your strength, health, feed rate, regen rate, can have up to [vamplevel - count_vassals(owner.current.mind)] vassals, and maximum blood have all increased!") + to_chat(owner.current, "You are now a rank [bloodsucker_level] Bloodsucker. Your strength, health, feed rate, regen rate, can have up to [bloodsucker_level - count_vassals(owner.current.mind)] vassals, and maximum blood have all increased!") to_chat(owner.current, "Your existing powers have all ranked up as well!") update_hud(TRUE) owner.current.playsound_local(null, 'sound/effects/pope_entry.ogg', 25, TRUE, pressure_affected = FALSE) @@ -707,10 +699,10 @@ // Update Rank Counter if(owner.current.hud_used.vamprank_display) - var/valuecolor = vamplevel_unspent ? "#FFFF00" : "#FF0000" - owner.current.hud_used.vamprank_display.update_counter(vamplevel, valuecolor) + var/valuecolor = bloodsucker_level_unspent ? "#FFFF00" : "#FF0000" + owner.current.hud_used.vamprank_display.update_counter(bloodsucker_level, valuecolor) if(updateRank) // Only change icon on special request. - owner.current.hud_used.vamprank_display.icon_state = (vamplevel_unspent > 0) ? "rank_up" : "rank" + owner.current.hud_used.vamprank_display.icon_state = (bloodsucker_level_unspent > 0) ? "rank_up" : "rank" /obj/screen/bloodsucker diff --git a/code/modules/antagonists/bloodsucker/objects/bloodsucker_crypt.dm b/code/modules/antagonists/bloodsucker/objects/bloodsucker_crypt.dm index c5f24ab537..7998a33c7b 100644 --- a/code/modules/antagonists/bloodsucker/objects/bloodsucker_crypt.dm +++ b/code/modules/antagonists/bloodsucker/objects/bloodsucker_crypt.dm @@ -123,7 +123,7 @@ . += {"Simply click and hold on a victim, and then drag their sprite on the vassal rack. Alt click on the vassal rack to unbuckle them."} . += {"Make sure that the victim is handcuffed, or else they can simply run away or resist, as the process is not instant."} . += {"To convert the victim, simply click on the vassal rack itself. Sharp weapons work faster than other tools."} - . += {" You have only the power for [B.vamplevel - B.count_vassals(user.mind)] vassals"} + . += {" You have only the power for [B.bloodsucker_level - B.count_vassals(user.mind)] vassals"} /* if(user.mind.has_antag_datum(ANTAG_DATUM_VASSAL) . += {"This is the vassal rack, which allows your master to thrall crewmembers into his minions.\n Aid your master in bringing their victims here and keeping them secure.\n @@ -265,7 +265,7 @@ if(user.blood_volume < CONVERT_COST + 5) to_chat(user, "You don't have enough blood to initiate the Dark Communion with [target].") return - if(B.count_vassals(user.mind) > B.vamplevel) + if(B.count_vassals(user.mind) > B.bloodsucker_level) to_chat(user, "Your power is yet too weak to bring more vassals under your control....") return // Prep... diff --git a/code/modules/antagonists/bloodsucker/powers/feed.dm b/code/modules/antagonists/bloodsucker/powers/feed.dm index b0678d5ff4..5e82a282b2 100644 --- a/code/modules/antagonists/bloodsucker/powers/feed.dm +++ b/code/modules/antagonists/bloodsucker/powers/feed.dm @@ -263,7 +263,7 @@ to_chat(user, "Your victim is dead. [target.p_their(TRUE)] blood barely nourishes you.") warning_target_dead = TRUE // Full? - if(!warning_full && user.blood_volume >= bloodsuckerdatum.maxBloodVolume) + if(!warning_full && user.blood_volume >= bloodsuckerdatum.max_blood_volume) to_chat(user, "You are full. Further blood will be wasted.") warning_full = TRUE // Blood Remaining? (Carbons/Humans only) @@ -300,7 +300,7 @@ /datum/action/bloodsucker/feed/proc/CheckKilledTarget(mob/living/user, mob/living/target) - // Bad Vampire. You shouldn't do that. + // Bad Bloodsucker. You shouldn't do that. if(target && target.stat >= DEAD && ishuman(target)) SEND_SIGNAL(user, COMSIG_ADD_MOOD_EVENT, "drankkilled", /datum/mood_event/drankkilled) // BAD // in bloodsucker_life.dm diff --git a/code/modules/language/vampiric.dm b/code/modules/language/vampiric.dm index 6da54ce844..ab48a17d2f 100644 --- a/code/modules/language/vampiric.dm +++ b/code/modules/language/vampiric.dm @@ -1,4 +1,4 @@ -// VAMPIRE LANGUAGE // +// BLOODSUCKER LANGUAGE // /datum/language/vampiric name = "Blah-Sucker" diff --git a/code/modules/mob/living/carbon/human/species_types/jellypeople.dm b/code/modules/mob/living/carbon/human/species_types/jellypeople.dm index 147cb30772..d81251eca9 100644 --- a/code/modules/mob/living/carbon/human/species_types/jellypeople.dm +++ b/code/modules/mob/living/carbon/human/species_types/jellypeople.dm @@ -44,7 +44,7 @@ C.faction |= "slime" /datum/species/jelly/spec_life(mob/living/carbon/human/H) - if(H.stat == DEAD || HAS_TRAIT(H, TRAIT_NOMARROW)) //can't farm slime jelly from a dead slime/jelly person indefinitely, and no regeneration for vampires + if(H.stat == DEAD || HAS_TRAIT(H, TRAIT_NOMARROW)) //can't farm slime jelly from a dead slime/jelly person indefinitely, and no regeneration for blooduskers return if(!H.blood_volume) H.blood_volume += 5 diff --git a/code/modules/reagents/chemistry/reagents/food_reagents.dm b/code/modules/reagents/chemistry/reagents/food_reagents.dm index ce276a0d8b..c003fc7111 100644 --- a/code/modules/reagents/chemistry/reagents/food_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/food_reagents.dm @@ -448,8 +448,8 @@ . = 1 ..() -/datum/reagent/consumable/condensedcapsaicin/reaction_mob(mob/living/M, method, reac_volume) - if(AmBloodsucker(M)) +/datum/reagent/consumable/garlic/reaction_mob(mob/living/M, method, reac_volume) + if(AmBloodsucker(M, TRUE)) //Theyll be immune to garlic as long as they masquarade, but they cant do it if they already have it. switch(method) if(INGEST) if(prob(min(30, current_cycle))) @@ -467,7 +467,7 @@ to_chat(M, "You feel like your veins are boiling!") M.emote("scream") M.adjustFireLoss(5) - + ..() /datum/reagent/consumable/sprinkles name = "Sprinkles" value = 3 From 6e22438fb56f4856ac609962266a96deef1b97e1 Mon Sep 17 00:00:00 2001 From: Artur Date: Wed, 25 Mar 2020 19:39:19 +0200 Subject: [PATCH 017/113] Whoopsie~ Forgot to rename the recipy --- code/datums/components/crafting/recipes/recipes_clothing.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/datums/components/crafting/recipes/recipes_clothing.dm b/code/datums/components/crafting/recipes/recipes_clothing.dm index fb3500a037..444eaeafaf 100644 --- a/code/datums/components/crafting/recipes/recipes_clothing.dm +++ b/code/datums/components/crafting/recipes/recipes_clothing.dm @@ -290,7 +290,7 @@ /datum/crafting_recipe/wintercoat_cosmic - name = "Cosmic Winter Coat" + name = "Garlic Necklace" result = /obj/item/clothing/neck/garlic_necklace reqs = list(/obj/item/reagent_containers/food/snacks/grown/garlic = 15, /obj/item/stack/cable_coil = 10) From 8d629221fd1ce03e1f8684003e758ad7cee66eb4 Mon Sep 17 00:00:00 2001 From: Artur Date: Wed, 25 Mar 2020 19:42:52 +0200 Subject: [PATCH 018/113] Make it look nicer --- code/game/gamemodes/bloodsucker/bloodsucker.dm | 3 --- 1 file changed, 3 deletions(-) diff --git a/code/game/gamemodes/bloodsucker/bloodsucker.dm b/code/game/gamemodes/bloodsucker/bloodsucker.dm index adcb80ff07..3fe67fd431 100644 --- a/code/game/gamemodes/bloodsucker/bloodsucker.dm +++ b/code/game/gamemodes/bloodsucker/bloodsucker.dm @@ -269,6 +269,3 @@ /datum/game_mode/proc/remove_vassal(datum/mind/vassal) vassal.remove_antag_datum(ANTAG_DATUM_VASSAL) - - - \ No newline at end of file From 2546de3ee26c91deb336ee2feee424d0851c940e Mon Sep 17 00:00:00 2001 From: Artur Date: Wed, 25 Mar 2020 19:45:40 +0200 Subject: [PATCH 019/113] This is not neccesary --- code/modules/antagonists/bloodsucker/powers/feed.dm | 6 ------ 1 file changed, 6 deletions(-) diff --git a/code/modules/antagonists/bloodsucker/powers/feed.dm b/code/modules/antagonists/bloodsucker/powers/feed.dm index 5e82a282b2..71b866b2f4 100644 --- a/code/modules/antagonists/bloodsucker/powers/feed.dm +++ b/code/modules/antagonists/bloodsucker/powers/feed.dm @@ -67,12 +67,6 @@ if(display_error) to_chat(owner, "Your victim's blood is not suitable for you to take.") return FALSE - if(iscarbon(owner)) - //We want to check if the target is wearing a garlic necklance. - if(istype(owner.get_item_by_slot(SLOT_NECK), /obj/item/clothing/neck/garlic_necklace)) - if(display_error) - to_chat(owner, "Your victim is wearing a garlic clove on their neck! Disgusting!") - return FALSE return TRUE // If I'm not grabbing someone, find me someone nearby. From 4c4b1b340b844432c49eba3d05dcad43890c4e3c Mon Sep 17 00:00:00 2001 From: Artur Date: Wed, 25 Mar 2020 20:24:54 +0200 Subject: [PATCH 020/113] might as well fix the regen core name and a few tweaks. --- .../antagonists/bloodsucker/bloodsucker_life.dm | 15 +++++++++------ .../antagonists/bloodsucker/datum_bloodsucker.dm | 2 +- .../modules/mining/equipment/regenerative_core.dm | 14 ++++++++------ 3 files changed, 18 insertions(+), 13 deletions(-) diff --git a/code/modules/antagonists/bloodsucker/bloodsucker_life.dm b/code/modules/antagonists/bloodsucker/bloodsucker_life.dm index 90919a4e80..06eb271dd6 100644 --- a/code/modules/antagonists/bloodsucker/bloodsucker_life.dm +++ b/code/modules/antagonists/bloodsucker/bloodsucker_life.dm @@ -184,12 +184,15 @@ // Nutrition owner.current.nutrition = clamp(owner.current.blood_volume, 545, 0) //The amount of blood is how full we are. //A bit higher regeneration based on blood volume - if(owner.current.blood_volume < BLOOD_VOLUME_NORMAL) - additional_regen = 0.3 - else if(owner.current.blood_volume < BLOOD_VOLUME_OKAY) - additional_regen = 0.2 - else if(owner.current.blood_volume < BLOOD_VOLUME_BAD) - additional_regen = 0.1 + switch(owner.current.blood_volume) + if(owner.current.blood_volume < 700) + additional_regen = 0.4 + if(owner.current.blood_volume < BLOOD_VOLUME_NORMAL) + additional_regen = 0.3 + if(owner.current.blood_volume < BLOOD_VOLUME_OKAY) + additional_regen = 0.2 + if(owner.current.blood_volume < BLOOD_VOLUME_BAD) + additional_regen = 0.1 ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // DEATH diff --git a/code/modules/antagonists/bloodsucker/datum_bloodsucker.dm b/code/modules/antagonists/bloodsucker/datum_bloodsucker.dm index f8c35f7938..f95883e7c8 100644 --- a/code/modules/antagonists/bloodsucker/datum_bloodsucker.dm +++ b/code/modules/antagonists/bloodsucker/datum_bloodsucker.dm @@ -22,7 +22,7 @@ // STATS var/bloodsucker_level var/bloodsucker_level_unspent = 1 - var/regen_rate = 0.4 // How fast do I regenerate? + var/regen_rate = 0.3 // How fast do I regenerate? var/additional_regen // How much additional blood regen we gain from bonuses such as high blood. var/feed_amount = 15 // Amount of blood drawn from a target per tick. var/max_blood_volume = 600 // Maximum blood a Vamp can hold via feeding. diff --git a/code/modules/mining/equipment/regenerative_core.dm b/code/modules/mining/equipment/regenerative_core.dm index c89698530f..c14aa097bb 100644 --- a/code/modules/mining/equipment/regenerative_core.dm +++ b/code/modules/mining/equipment/regenerative_core.dm @@ -26,8 +26,8 @@ slot = "hivecore" force = 0 actions_types = list(/datum/action/item_action/organ_action/use) - var/inert = 0 - var/preserved = 0 + var/inert + var/preserved /obj/item/organ/regenerative_core/Initialize() . = ..() @@ -38,7 +38,9 @@ go_inert() /obj/item/organ/regenerative_core/proc/preserved(implanted = 0) - inert = FALSE + if(inert) + name = initial(name) + inert = FALSE preserved = TRUE update_icon() desc = "All that remains of a hivelord. It is preserved, allowing you to use it to heal completely without danger of decay." @@ -88,10 +90,10 @@ else to_chat(user, "You start to smear [src] on yourself. It feels and smells disgusting, but you feel amazingly refreshed in mere moments.") SSblackbox.record_feedback("nested tally", "hivelord_core", 1, list("[type]", "used", "self")) - if(!AmBloodsucker(H)) - H.revive(full_heal = TRUE) - else + if(AmBloodsucker(H)) H.revive(full_heal = FALSE) + else + H.revive(full_heal = TRUE) qdel(src) user.log_message("[user] used [src] to heal [H]! Wake the fuck up, Samurai!", LOG_ATTACK, color="green") //Logging for 'old' style legion core use, when clicking on a sprite of yourself or another. From e8f3e0a3a1a5be681dee89385d07983310b53465 Mon Sep 17 00:00:00 2001 From: Artur Date: Thu, 26 Mar 2020 09:49:20 +0200 Subject: [PATCH 021/113] Forgot to add the mutation, what a dummy i am --- code/modules/hydroponics/grown/onion.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/hydroponics/grown/onion.dm b/code/modules/hydroponics/grown/onion.dm index 2ebaa6d5e2..a75b9caf5f 100644 --- a/code/modules/hydroponics/grown/onion.dm +++ b/code/modules/hydroponics/grown/onion.dm @@ -14,7 +14,7 @@ weed_chance = 3 growing_icon = 'icons/obj/hydroponics/growing_vegetables.dmi' reagents_add = list(/datum/reagent/consumable/nutriment/vitamin = 0.04, /datum/reagent/consumable/nutriment = 0.1) - mutatelist = list(/obj/item/seeds/onion/red) + mutatelist = list(/obj/item/seeds/onion/red, /obj/item/seeds/garlic) /obj/item/reagent_containers/food/snacks/grown/onion seed = /obj/item/seeds/onion From 9db779ddc643ae2f15a8f16a6c335144942b9a23 Mon Sep 17 00:00:00 2001 From: Artur Date: Thu, 26 Mar 2020 23:38:25 +0200 Subject: [PATCH 022/113] Else if chain ahoy --- .../antagonists/bloodsucker/bloodsucker_life.dm | 17 ++++++++--------- 1 file changed, 8 insertions(+), 9 deletions(-) diff --git a/code/modules/antagonists/bloodsucker/bloodsucker_life.dm b/code/modules/antagonists/bloodsucker/bloodsucker_life.dm index 06eb271dd6..178d069f52 100644 --- a/code/modules/antagonists/bloodsucker/bloodsucker_life.dm +++ b/code/modules/antagonists/bloodsucker/bloodsucker_life.dm @@ -184,15 +184,14 @@ // Nutrition owner.current.nutrition = clamp(owner.current.blood_volume, 545, 0) //The amount of blood is how full we are. //A bit higher regeneration based on blood volume - switch(owner.current.blood_volume) - if(owner.current.blood_volume < 700) - additional_regen = 0.4 - if(owner.current.blood_volume < BLOOD_VOLUME_NORMAL) - additional_regen = 0.3 - if(owner.current.blood_volume < BLOOD_VOLUME_OKAY) - additional_regen = 0.2 - if(owner.current.blood_volume < BLOOD_VOLUME_BAD) - additional_regen = 0.1 + if(owner.current.blood_volume < 700) + additional_regen = 0.4 + else if(owner.current.blood_volume < BLOOD_VOLUME_NORMAL) + additional_regen = 0.3 + else if(owner.current.blood_volume < BLOOD_VOLUME_OKAY) + additional_regen = 0.2 + else if(owner.current.blood_volume < BLOOD_VOLUME_BAD) + additional_regen = 0.1 ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // DEATH From 75c4e8b19ab478d8679b67f22dcbd28b3dbd88a5 Mon Sep 17 00:00:00 2001 From: Artur Date: Fri, 27 Mar 2020 10:17:42 +0200 Subject: [PATCH 023/113] What the fuck travis --- code/modules/antagonists/bloodsucker/datum_bloodsucker.dm | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/code/modules/antagonists/bloodsucker/datum_bloodsucker.dm b/code/modules/antagonists/bloodsucker/datum_bloodsucker.dm index f95883e7c8..137739ec1d 100644 --- a/code/modules/antagonists/bloodsucker/datum_bloodsucker.dm +++ b/code/modules/antagonists/bloodsucker/datum_bloodsucker.dm @@ -22,9 +22,9 @@ // STATS var/bloodsucker_level var/bloodsucker_level_unspent = 1 - var/regen_rate = 0.3 // How fast do I regenerate? + var/regen_rate = 0.3 // How fast do I regenerate? var/additional_regen // How much additional blood regen we gain from bonuses such as high blood. - var/feed_amount = 15 // Amount of blood drawn from a target per tick. + var/feed_amount = 15 // Amount of blood drawn from a target per tick. var/max_blood_volume = 600 // Maximum blood a Vamp can hold via feeding. // OBJECTIVES var/list/datum/objective/objectives_given = list() // For removal if needed. From a5b158301bba58948253486542455412552f63db Mon Sep 17 00:00:00 2001 From: Ghom <42542238+Ghommie@users.noreply.github.com> Date: Sat, 28 Mar 2020 03:11:56 +0100 Subject: [PATCH 024/113] Update kinetic_crusher.dm --- code/modules/mining/equipment/kinetic_crusher.dm | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/code/modules/mining/equipment/kinetic_crusher.dm b/code/modules/mining/equipment/kinetic_crusher.dm index b515ebbc13..1fd1b31b69 100644 --- a/code/modules/mining/equipment/kinetic_crusher.dm +++ b/code/modules/mining/equipment/kinetic_crusher.dm @@ -433,19 +433,23 @@ desc = "A glowing trinket that was originally the Hierophant's beacon. Suitable as a trophy for a kinetic crusher." icon_state = "vortex_talisman" denied_type = /obj/item/crusher_trophy/vortex_talisman + var/vortex_cd /obj/item/crusher_trophy/vortex_talisman/effect_desc() - return "mark detonation to create a barrier you can pass" + return "mark detonation to create a barrier you can pass that lasts for 7.5 seconds, with a cooldown of 9 seconds after creation." /obj/item/crusher_trophy/vortex_talisman/on_mark_detonation(mob/living/target, mob/living/user) + if(vortex_cd >= world.time) + return var/turf/T = get_turf(user) - new /obj/effect/temp_visual/hierophant/wall/crusher(T, user) //a wall only you can pass! + var/obj/effect/temp_visual/hierophant/wall/crusher/W = new (T, user) //a wall only you can pass! var/turf/otherT = get_step(T, turn(user.dir, 90)) if(otherT) new /obj/effect/temp_visual/hierophant/wall/crusher(otherT, user) otherT = get_step(T, turn(user.dir, -90)) if(otherT) new /obj/effect/temp_visual/hierophant/wall/crusher(otherT, user) + vortex_cd = world.time + W.duration * 1.2 /obj/effect/temp_visual/hierophant/wall/crusher duration = 75 From 5e5bc2a690f298e6bcacbdd7b33548ec73fef248 Mon Sep 17 00:00:00 2001 From: Ghommie <42542238+Ghommie@users.noreply.github.com> Date: Sun, 29 Mar 2020 17:01:05 +0200 Subject: [PATCH 025/113] force push. --- code/datums/helper_datums/teleport.dm | 2 +- code/modules/antagonists/swarmer/swarmer.dm | 61 ++++++++++++++++++- .../antagonists/swarmer/swarmer_event.dm | 6 +- 3 files changed, 63 insertions(+), 6 deletions(-) diff --git a/code/datums/helper_datums/teleport.dm b/code/datums/helper_datums/teleport.dm index 6b0981665d..c46a03a986 100644 --- a/code/datums/helper_datums/teleport.dm +++ b/code/datums/helper_datums/teleport.dm @@ -128,7 +128,7 @@ // Can most things breathe? if(trace_gases) continue - if(A_gases[/datum/gas/oxygen] >= 16) + if(A_gases[/datum/gas/oxygen] <= 16) continue if(A_gases[/datum/gas/plasma]) continue diff --git a/code/modules/antagonists/swarmer/swarmer.dm b/code/modules/antagonists/swarmer/swarmer.dm index 724c4e6f76..d4ed9a21e5 100644 --- a/code/modules/antagonists/swarmer/swarmer.dm +++ b/code/modules/antagonists/swarmer/swarmer.dm @@ -179,8 +179,8 @@ /obj/swarmer_act(mob/living/simple_animal/hostile/swarmer/S) if(resistance_flags & INDESTRUCTIBLE) return FALSE - for(var/mob/living/L in contents) - if(!issilicon(L) && !isbrain(L)) + for(var/mob/living/L in GetAllContents()) + if(!ispAI(L) && !isbrain(L)) to_chat(S, "An organism has been detected inside this object. Aborting.") return FALSE return ..() @@ -416,6 +416,57 @@ to_chat(S, "Destroying this object would cause a catastrophic chain reaction. Aborting.") return FALSE +/obj/machinery/ore_silo/swarmer_act(mob/living/simple_animal/hostile/swarmer/S) + to_chat(S, "Destroying this object, however tempting it's, will disrupt the research development that may serve for our masters in the future. Aborting.") + return FALSE + +/obj/machinery/rnd/server/swarmer_act(mob/living/simple_animal/hostile/swarmer/S) + to_chat(S, "Destroying this object, will disrupt the research development that may serve for our masters in the future. Aborting.") + return FALSE + +/obj/machinery/pool/swarmer_act(mob/living/simple_animal/hostile/swarmer/S) //pool's closed, but not. + to_chat(S, "The pool must not be closed, it will provide healthy fun for our masters in the future. Aborting.") + return FALSE + +/obj/structure/pool/swarmer_act(mob/living/simple_animal/hostile/swarmer/S) + to_chat(S, "The pool must not be closed, it will provide healthy fun for our masters in the future. Aborting.") + return FALSE + +/obj/structure/holosign/barrier/swarmer_act(mob/living/simple_animal/hostile/swarmer/S) + var/static/list/lazy_typecache = typecacheof(list(/obj/structure/holosign/barrier/engineering, /obj/structure/holosign/barrier/firelock, /obj/structure/holosign/barrier/atmos, /obj/structure/holosign/barrier/combifan)) + if(lazy_typecache[type]) + to_chat(S, "Destroying this holographic barrier may not benefit us. Aborting.") + return FALSE + return ..() + +/obj/machinery/dominator/swarmer_act(mob/living/simple_animal/hostile/swarmer/S) + to_chat(S, "This advanced piece of technology may be of use for our masters in the future. Aborting.") + return FALSE + +/obj/machinery/computer/bsa_control/swarmer_act(mob/living/simple_animal/hostile/swarmer/S) + to_chat(S, "This advanced piece of technology may be of use for our masters in the future. Aborting.") + return FALSE + +/obj/machinery/bsa/swarmer_act(mob/living/simple_animal/hostile/swarmer/S) + to_chat(S, "This advanced piece of technology may be of use for our masters in the future. Aborting.") + return FALSE + +/obj/machinery/dna_vault/swarmer_act(mob/living/simple_animal/hostile/swarmer/S) + to_chat(S, "This advanced piece of technology may be of use for our masters in the future. Aborting.") + return FALSE + +/obj/structure/filler/swarmer_act(mob/living/simple_animal/hostile/swarmer/S) + to_chat(S, "This advanced piece of technology may be of use for our masters in the future. Aborting.") + return FALSE + +/obj/machinery/computer/sat_control/swarmer_act(mob/living/simple_animal/hostile/swarmer/S) + to_chat(S, "Destroying this object will lower the station shielding against space debris. Aborting.") + return FALSE + +/obj/machinery/satellite/meteor_shield/swarmer_act(mob/living/simple_animal/hostile/swarmer/S) + to_chat(S, "Destroying this object will lower the station shielding against space debris. Aborting.") + return FALSE + ////END CTRL CLICK FOR SWARMERS//// /mob/living/simple_animal/hostile/swarmer/proc/Fabricate(atom/fabrication_object,fabrication_cost = 0) @@ -429,6 +480,12 @@ return new fabrication_object(loc) /mob/living/simple_animal/hostile/swarmer/proc/Integrate(atom/movable/target) + if(target.resistance_flags & INDESTRUCTIBLE) + return FALSE + for(var/mob/living/L in GetAllContents()) + if(!ispAI(L) && !isbrain(L)) + to_chat(src, "An organism has been detected inside this object. Aborting.") + return FALSE var/resource_gain = target.IntegrateAmount() if(resources + resource_gain > max_resources) to_chat(src, "We cannot hold more materials!") diff --git a/code/modules/antagonists/swarmer/swarmer_event.dm b/code/modules/antagonists/swarmer/swarmer_event.dm index 6ef35fdbaa..c626799a53 100644 --- a/code/modules/antagonists/swarmer/swarmer_event.dm +++ b/code/modules/antagonists/swarmer/swarmer_event.dm @@ -1,10 +1,10 @@ /datum/round_event_control/spawn_swarmer name = "Spawn Swarmer Shell" typepath = /datum/round_event/spawn_swarmer - weight = 0 - max_occurrences = 0 + weight = 7 + max_occurrences = 1 //Only once okay fam earliest_start = 30 MINUTES - min_players = 15 + min_players = 35 gamemode_blacklist = list("dynamic") From 98eff75e9fbbbd25c5740e6d2549df3e9356f62f Mon Sep 17 00:00:00 2001 From: Ghom <42542238+Ghommie@users.noreply.github.com> Date: Sun, 29 Mar 2020 18:57:48 +0200 Subject: [PATCH 026/113] Objects. --- code/modules/antagonists/swarmer/swarmer.dm | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/code/modules/antagonists/swarmer/swarmer.dm b/code/modules/antagonists/swarmer/swarmer.dm index d4ed9a21e5..c1f493ac52 100644 --- a/code/modules/antagonists/swarmer/swarmer.dm +++ b/code/modules/antagonists/swarmer/swarmer.dm @@ -480,8 +480,10 @@ return new fabrication_object(loc) /mob/living/simple_animal/hostile/swarmer/proc/Integrate(atom/movable/target) - if(target.resistance_flags & INDESTRUCTIBLE) - return FALSE + if(isobj(target)) + var/obj/O = target + if(O.resistance_flags & INDESTRUCTIBLE) + return FALSE for(var/mob/living/L in GetAllContents()) if(!ispAI(L) && !isbrain(L)) to_chat(src, "An organism has been detected inside this object. Aborting.") From 694abd072458356da51baefc9681725bf8902b49 Mon Sep 17 00:00:00 2001 From: Artur Date: Tue, 31 Mar 2020 19:44:01 +0300 Subject: [PATCH 027/113] Fixes compile. I blame putnam. --- code/modules/antagonists/bloodsucker/datum_bloodsucker.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/antagonists/bloodsucker/datum_bloodsucker.dm b/code/modules/antagonists/bloodsucker/datum_bloodsucker.dm index edac8763c8..e70160484e 100644 --- a/code/modules/antagonists/bloodsucker/datum_bloodsucker.dm +++ b/code/modules/antagonists/bloodsucker/datum_bloodsucker.dm @@ -90,7 +90,7 @@ owner.current.blood_volume = max(owner.current.blood_volume,BLOOD_VOLUME_SAFE) /datum/antagonist/bloodsucker/threat() - return ..()+3*vamplevel + return ..()+3*bloodsucker_level /datum/antagonist/bloodsucker/proc/SelectFirstName() From 7a5bb4804d59ec0cb910fac1ee25c00e7649d16b Mon Sep 17 00:00:00 2001 From: Artur Date: Tue, 31 Mar 2020 19:46:54 +0300 Subject: [PATCH 028/113] Nice spacing --- code/modules/antagonists/bloodsucker/datum_bloodsucker.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/antagonists/bloodsucker/datum_bloodsucker.dm b/code/modules/antagonists/bloodsucker/datum_bloodsucker.dm index e70160484e..946be31ed6 100644 --- a/code/modules/antagonists/bloodsucker/datum_bloodsucker.dm +++ b/code/modules/antagonists/bloodsucker/datum_bloodsucker.dm @@ -90,7 +90,7 @@ owner.current.blood_volume = max(owner.current.blood_volume,BLOOD_VOLUME_SAFE) /datum/antagonist/bloodsucker/threat() - return ..()+3*bloodsucker_level + return ..() + 3 * bloodsucker_level /datum/antagonist/bloodsucker/proc/SelectFirstName() From 6e62ea5cb1dd6634e466ca8d5af8f7eb32964a78 Mon Sep 17 00:00:00 2001 From: Artur Date: Wed, 1 Apr 2020 09:15:31 +0300 Subject: [PATCH 029/113] Quickfix for baaad problem --- code/modules/antagonists/bloodsucker/bloodsucker_life.dm | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/code/modules/antagonists/bloodsucker/bloodsucker_life.dm b/code/modules/antagonists/bloodsucker/bloodsucker_life.dm index 178d069f52..fe43310875 100644 --- a/code/modules/antagonists/bloodsucker/bloodsucker_life.dm +++ b/code/modules/antagonists/bloodsucker/bloodsucker_life.dm @@ -236,7 +236,7 @@ else // No damage, OR toxin healed AND brute healed and NOT in coffin (since you cannot heal burn) if(total_damage <= 0 || total_toxloss <= 0 && total_brute <= 0 && !istype(owner.current.loc, /obj/structure/closet/crate/coffin)) // Not Daytime, Not in Torpor - if(!SSticker.mode.is_daylight() && HAS_TRAIT_FROM(owner.current, TRAIT_DEATHCOMA, "bloodsucker")) + if(!SSticker.mode.is_daylight() && HAS_TRAIT_FROM(owner.current, TRAIT_FAKEDEATH, "bloodsucker")) Torpor_End() // Fake Unconscious if(poweron_masquerade == TRUE && total_damage >= owner.current.getMaxHealth() - HEALTH_THRESHOLD_FULLCRIT) @@ -261,6 +261,7 @@ owner.current.stat = SOFT_CRIT owner.current.remove_status_effect(STATUS_EFFECT_UNCONSCIOUS) owner.current.cure_fakedeath("bloodsucker") + REMOVE_TRAIT(owner.current, TRAIT_FAKEDEATH, "bloodsucker") REMOVE_TRAIT(owner.current, TRAIT_NODEATH, "bloodsucker") REMOVE_TRAIT(owner.current, TRAIT_RESISTHIGHPRESSURE, "bloodsucker") REMOVE_TRAIT(owner.current, TRAIT_RESISTLOWPRESSURE, "bloodsucker") From ca1f3d9a1e10e10cba8cc5a9d5b6477f7e0db7cd Mon Sep 17 00:00:00 2001 From: Artur Date: Wed, 1 Apr 2020 11:45:11 +0300 Subject: [PATCH 030/113] Added succ sound for the victim --- code/modules/antagonists/bloodsucker/powers/feed.dm | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/code/modules/antagonists/bloodsucker/powers/feed.dm b/code/modules/antagonists/bloodsucker/powers/feed.dm index 71b866b2f4..40e0dbd25a 100644 --- a/code/modules/antagonists/bloodsucker/powers/feed.dm +++ b/code/modules/antagonists/bloodsucker/powers/feed.dm @@ -275,8 +275,9 @@ break // Blood Gulp Sound - owner.playsound_local(null, 'sound/effects/singlebeat.ogg', 40, 1) // Play THIS sound for user only. The "null" is where turf would go if a location was needed. Null puts it right in their head. - + owner.playsound_local(null, 'sound/effects/singlebeat.ogg', 40, TRUE) + if(!amSilent) + target.playsound_local(null, 'sound/effects/singlebeat.ogg', 40, TRUE) // DONE! //DeactivatePower(user,target) if(amSilent) @@ -299,7 +300,7 @@ SEND_SIGNAL(user, COMSIG_ADD_MOOD_EVENT, "drankkilled", /datum/mood_event/drankkilled) // BAD // in bloodsucker_life.dm /datum/action/bloodsucker/feed/ContinueActive(mob/living/user, mob/living/target) - return ..() && target && (!target_grappled || user.pulling == target) && sucking_checks(target, TRUE, TRUE) // Active, and still Antag, + return ..() && target && (!target_grappled || user.pulling == target) && sucking_checks(target, TRUE, TRUE) // Active, and still antag, // NOTE: We only care about pulling if target started off that way. Mostly only important for Aggressive feed. /datum/action/bloodsucker/feed/proc/ApplyVictimEffects(mob/living/target) From 67f43191771538edf5992cb797f3791b4f699a34 Mon Sep 17 00:00:00 2001 From: Artur Date: Fri, 3 Apr 2020 01:52:08 +0300 Subject: [PATCH 031/113] fixes burn regen and some tweaks --- .../game/gamemodes/bloodsucker/bloodsucker.dm | 4 +- .../bloodsucker/bloodsucker_life.dm | 58 +++++++++---------- .../bloodsucker/items/bloodsucker_organs.dm | 3 +- 3 files changed, 34 insertions(+), 31 deletions(-) diff --git a/code/game/gamemodes/bloodsucker/bloodsucker.dm b/code/game/gamemodes/bloodsucker/bloodsucker.dm index 01b6035034..bb776d7bc0 100644 --- a/code/game/gamemodes/bloodsucker/bloodsucker.dm +++ b/code/game/gamemodes/bloodsucker/bloodsucker.dm @@ -11,8 +11,10 @@ // The antags you're allowed to be if turning Vassal. /proc/AmBloodsucker(mob/living/M, falseIfInDisguise = FALSE) + if(!M.mind) + return FALSE // No Datum - if(!M.mind || !M.mind.has_antag_datum(ANTAG_DATUM_BLOODSUCKER)) + if(!M.mind.has_antag_datum(ANTAG_DATUM_BLOODSUCKER)) return FALSE return TRUE diff --git a/code/modules/antagonists/bloodsucker/bloodsucker_life.dm b/code/modules/antagonists/bloodsucker/bloodsucker_life.dm index fe43310875..0814fd217d 100644 --- a/code/modules/antagonists/bloodsucker/bloodsucker_life.dm +++ b/code/modules/antagonists/bloodsucker/bloodsucker_life.dm @@ -93,27 +93,25 @@ owner.current.adjustCloneLoss(-0.1 * (actual_regen * 2) * mult, 0) owner.current.adjustOrganLoss(ORGAN_SLOT_BRAIN, -1 * (actual_regen * 4) * mult) // No Bleeding - if(ishuman(owner.current)) //NOTE Current bleeding is horrible, not to count the amount of blood ballistics delete. + /*if(ishuman(owner.current)) //NOTE Current bleeding is horrible, not to count the amount of blood ballistics delete. var/mob/living/carbon/human/H = owner.current if(H.bleed_rate > 0) //Only heal bleeding if we are actually bleeding - H.bleed_rate =- 0.5 + actual_regen * 0.2 * mult + H.bleed_rate =- 0.5 + actual_regen * 0.2 */ if(iscarbon(owner.current)) // Damage Heal: Do I have damage to ANY bodypart? var/mob/living/carbon/C = owner.current var/costMult = 1 // Coffin makes it cheaper var/fireheal = 0 // BURN: Heal in Coffin while Fakedeath, or when damage above maxhealth (you can never fully heal fire) - var/amInCoffinWhileTorpor = istype(C.loc, /obj/structure/closet/crate/coffin) && (mult == 0 || HAS_TRAIT(C, TRAIT_DEATHCOMA)) // Check for mult 0 OR death coma. (mult 0 means we're testing from coffin) + var/amInCoffinWhileTorpor = istype(C.loc, /obj/structure/closet/crate/coffin) && (mult == 0 || HAS_TRAIT(C, TRAIT_FAKEDEATH)) // Check for mult 0 OR death coma. (mult 0 means we're testing from coffin) if(amInCoffinWhileTorpor) mult *= 4 // Increase multiplier if we're sleeping in a coffin. - fireheal = min(C.getFireLoss(), actual_regen) // NOTE: Burn damage ONLY heals in torpor. - costMult = 0.25 + fireheal = min(C.getFireLoss(), regen_rate) // NOTE: Burn damage ONLY heals in torpor. C.ExtinguishMob() CureDisabilities() // Extinguish Fire C.remove_all_embedded_objects() // Remove Embedded! owner.current.regenerate_organs() // Heal Organs (will respawn original eyes etc. but we replace right away, next) CheckVampOrgans() // Heart, Eyes - else - if(owner.current.blood_volume <= 0) // No Blood? Lower Mult - mult = 0.25 + if(check_limbs(costMult)) + return TRUE // BRUTE: Always Heal var/bruteheal = min(C.getBruteLoss(), actual_regen) @@ -131,27 +129,29 @@ //C.heal_overall_damage(bruteheal * mult, fireheal * mult) // REMOVED: We need to FORCE this, because otherwise, vamps won't heal EVER. Swapped to above. AddBloodVolume((bruteheal * -0.5 + fireheal * -1 + toxinheal * -0.2) / mult * costMult) // Costs blood to heal return TRUE // Healed! Done for this tick. - if(amInCoffinWhileTorpor) // Limbs? (And I have no other healing) - var/list/missing = owner.current.get_missing_limbs() // Heal Missing - if(missing.len) // Cycle through ALL limbs and regen them! - for (var/targetLimbZone in missing) // 1) Find ONE Limb and regenerate it. - owner.current.regenerate_limb(targetLimbZone, 0) // regenerate_limbs() <--- If you want to EXCLUDE certain parts, do it like this ----> regenerate_limbs(0, list("head")) - var/obj/item/bodypart/L = owner.current.get_bodypart(targetLimbZone) // 2) Limb returns Damaged - AddBloodVolume(50 * costMult) // Costs blood to heal - L.brute_dam = 60 - to_chat(owner.current, "Your flesh knits as it regrows [L]!") - playsound(owner.current, 'sound/magic/demon_consume.ogg', 50, 1) - // DONE! After regenerating ANY number of limbs, we stop here. - return TRUE - else // REMOVED: For now, let's just leave prosthetics on. Maybe you WANT to be a robovamp. In actuality, robovamps are very bad. - // Remove Prosthetic/False Limb - for(var/obj/item/bodypart/BP in C.bodyparts) - if(istype(BP) && BP.status == 2) - to_chat(owner.current, "Your body expels the [BP]!") - BP.drop_limb() - return TRUE - // NOTE: Limbs have a "status", like their hosts "stat". 2 is dead (aka Prosthetic). 1 seems to be idle/alive.*/ - return FALSE + + + +/datum/antagonist/bloodsucker/proc/check_limbs(costMult) + var/limb_regen_cost = 50 * costMult + var/mob/living/carbon/C = owner.current + var/list/missing = C.get_missing_limbs() + if(missing.len && C.blood_volume < limb_regen_cost + 5) + return FALSE + for(var/targetLimbZone in missing) // 1) Find ONE Limb and regenerate it. + C.regenerate_limb(targetLimbZone, FALSE) // regenerate_limbs() <--- If you want to EXCLUDE certain parts, do it like this ----> regenerate_limbs(0, list("head")) + C.AddBloodVolume(50) + var/obj/item/bodypart/L = C.get_bodypart(targetLimbZone) // 2) Limb returns Damaged + L.brute_dam = 60 + to_chat(C, "Your flesh knits as it regrows your [L]!") + playsound(C, 'sound/magic/demon_consume.ogg', 50, TRUE) + return TRUE + /*for(var/obj/item/bodypart/BP in C.bodyparts) + if(!istype(BP) && !BP.status == 2) + return FALSE + to_chat(C, "Your body expels the [BP]!") + BP.drop_limb() + return TRUE */ /datum/antagonist/bloodsucker/proc/CureDisabilities() var/mob/living/carbon/C = owner.current diff --git a/code/modules/antagonists/bloodsucker/items/bloodsucker_organs.dm b/code/modules/antagonists/bloodsucker/items/bloodsucker_organs.dm index e4e26fe034..640c53946f 100644 --- a/code/modules/antagonists/bloodsucker/items/bloodsucker_organs.dm +++ b/code/modules/antagonists/bloodsucker/items/bloodsucker_organs.dm @@ -5,7 +5,8 @@ var/obj/item/organ/O // Heart O = owner.current.getorganslot(ORGAN_SLOT_HEART) - if(!istype(O, /obj/item/organ/heart/vampheart)) + + if(!istype(O, /obj/item/organ/heart/vampheart) && !istype(O, /obj/item/organ/heart/demon)) qdel(O) var/obj/item/organ/heart/vampheart/H = new H.Insert(owner.current) From 991f73893ffa020a21f5fe2a2fa4450323e724f0 Mon Sep 17 00:00:00 2001 From: Artur Date: Fri, 3 Apr 2020 02:00:41 +0300 Subject: [PATCH 032/113] Fuck me im tired --- code/modules/antagonists/bloodsucker/bloodsucker_life.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/antagonists/bloodsucker/bloodsucker_life.dm b/code/modules/antagonists/bloodsucker/bloodsucker_life.dm index 0814fd217d..ae685c5603 100644 --- a/code/modules/antagonists/bloodsucker/bloodsucker_life.dm +++ b/code/modules/antagonists/bloodsucker/bloodsucker_life.dm @@ -140,7 +140,7 @@ return FALSE for(var/targetLimbZone in missing) // 1) Find ONE Limb and regenerate it. C.regenerate_limb(targetLimbZone, FALSE) // regenerate_limbs() <--- If you want to EXCLUDE certain parts, do it like this ----> regenerate_limbs(0, list("head")) - C.AddBloodVolume(50) + AddBloodVolume(50) var/obj/item/bodypart/L = C.get_bodypart(targetLimbZone) // 2) Limb returns Damaged L.brute_dam = 60 to_chat(C, "Your flesh knits as it regrows your [L]!") From 154e145e2582b1d741d9735ff498b50bbbf66d92 Mon Sep 17 00:00:00 2001 From: kevinz000 <2003111+kevinz000@users.noreply.github.com> Date: Mon, 6 Apr 2020 18:40:20 -0700 Subject: [PATCH 033/113] storage --- code/__DEFINES/inventory.dm | 8 ----- code/__DEFINES/storage.dm | 32 +++++++++++++++++++ .../components/storage/concrete/rped.dm | 1 + .../components/storage/concrete/stack.dm | 1 + code/datums/components/storage/storage.dm | 15 +++++++-- code/game/objects/items.dm | 9 ++++++ tgstation.dme | 1 + 7 files changed, 56 insertions(+), 11 deletions(-) create mode 100644 code/__DEFINES/storage.dm diff --git a/code/__DEFINES/inventory.dm b/code/__DEFINES/inventory.dm index 2756be76fb..2aba7b496b 100644 --- a/code/__DEFINES/inventory.dm +++ b/code/__DEFINES/inventory.dm @@ -1,13 +1,5 @@ /*ALL DEFINES RELATED TO INVENTORY OBJECTS, MANAGEMENT, ETC, GO HERE*/ -//ITEM INVENTORY WEIGHT, FOR w_class -#define WEIGHT_CLASS_TINY 1 //Usually items smaller then a human hand, ex: Playing Cards, Lighter, Scalpel, Coins/Money -#define WEIGHT_CLASS_SMALL 2 //Pockets can hold small and tiny items, ex: Flashlight, Multitool, Grenades, GPS Device -#define WEIGHT_CLASS_NORMAL 3 //Standard backpacks can carry tiny, small & normal items, ex: Fire extinguisher, Stunbaton, Gas Mask, Metal Sheets -#define WEIGHT_CLASS_BULKY 4 //Items that can be weilded or equipped but not stored in a normal bag, ex: Defibrillator, Backpack, Space Suits -#define WEIGHT_CLASS_HUGE 5 //Usually represents objects that require two hands to operate, ex: Shotgun, Two Handed Melee Weapons - Can not fit in Boh -#define WEIGHT_CLASS_GIGANTIC 6 //Essentially means it cannot be picked up or placed in an inventory, ex: Mech Parts, Safe - Can not fit in Boh - //Inventory depth: limits how many nested storage items you can access directly. //1: stuff in mob, 2: stuff in backpack, 3: stuff in box in backpack, etc #define INVENTORY_DEPTH 3 diff --git a/code/__DEFINES/storage.dm b/code/__DEFINES/storage.dm new file mode 100644 index 0000000000..065551b975 --- /dev/null +++ b/code/__DEFINES/storage.dm @@ -0,0 +1,32 @@ +// storage_flags variable on /datum/component/storage + +// Storage limits. These can be combined I guess but you really, really shouldn't (don't do it really) +/// Check max_items and contents.len when trying to insert +#define STORAGE_LIMIT_MAX_ITEMS (1<<0) +/// Check w_class and max_combined_w_class, aka legacy behavior if you combine it with [STORAGE_LIMIT_MAX_ITEMS]. +#define STORAGE_LIMIT_COMBINED_W_CLASS (1<<1) +/// Use max_w_class for maximum w_class but use the new volume system. Will automatically force rendering to use the new volume/baystation scaling UI so this is kind of incompatible with stuff like stack storage etc etc. +#define STORAGE_LIMIT_VOLUME (1<<2) + +//ITEM INVENTORY WEIGHT, FOR w_class +/// Usually items smaller then a human hand, ex: Playing Cards, Lighter, Scalpel, Coins/Money +#define WEIGHT_CLASS_TINY 1 +/// Pockets can hold small and tiny items, ex: Flashlight, Multitool, Grenades, GPS Device +#define WEIGHT_CLASS_SMALL 2 +/// Standard backpacks can carry tiny, small & normal items, ex: Fire extinguisher, Stunbaton, Gas Mask, Metal Sheets +#define WEIGHT_CLASS_NORMAL 3 +/// Items that can be weilded or equipped but not stored in a normal bag, ex: Defibrillator, Backpack, Space Suits +#define WEIGHT_CLASS_BULKY 4 +/// Usually represents objects that require two hands to operate, ex: Shotgun, Two Handed Melee Weapons - Can not fit in Boh +#define WEIGHT_CLASS_HUGE 5 +/// Essentially means it cannot be picked up or placed in an inventory, ex: Mech Parts, Safe - Can not fit in Boh +#define WEIGHT_CLASS_GIGANTIC 6 + +/// Macro for automatically getting the volume of an item from its w_class. +#define AUTO_SCALE_VOLUME(w_class) (w_class ** 2) +/// Macro for automatically getting the volume of a storage item from its max_w_class and max_items. +#define AUTO_SCALE_STORAGE_VOLUME(w_class, max_items) (AUTO_SCALE_VOLUME(w_class) * max_items) + +// UI defines +/// Minimum pixels an item must have in volumetric scaled storage UI +#define MINIMUM_PIXELS_PER_ITEM 5 diff --git a/code/datums/components/storage/concrete/rped.dm b/code/datums/components/storage/concrete/rped.dm index 2f95466238..1e609c4107 100644 --- a/code/datums/components/storage/concrete/rped.dm +++ b/code/datums/components/storage/concrete/rped.dm @@ -3,6 +3,7 @@ allow_quick_gather = TRUE allow_quick_empty = TRUE click_gather = TRUE + storage_flags = STORAGE_LIMIT_MAX_ITEMS | STORAGE_LIMIT_COMBINED_W_CLASS max_w_class = WEIGHT_CLASS_NORMAL max_combined_w_class = 100 max_items = 100 diff --git a/code/datums/components/storage/concrete/stack.dm b/code/datums/components/storage/concrete/stack.dm index 1f0c44c650..76c7bc2af5 100644 --- a/code/datums/components/storage/concrete/stack.dm +++ b/code/datums/components/storage/concrete/stack.dm @@ -1,6 +1,7 @@ //Stack-only storage. /datum/component/storage/concrete/stack display_numerical_stacking = TRUE + storage_flags = STORAGE_LIMIT_COMBINED_W_CLASS | STORAGE_LIMIT_MAX_ITEMS var/max_combined_stack_amount = 300 max_w_class = WEIGHT_CLASS_NORMAL max_combined_w_class = WEIGHT_CLASS_NORMAL * 14 diff --git a/code/datums/components/storage/storage.dm b/code/datums/components/storage/storage.dm index 55e5c03c2b..e8fe8c6698 100644 --- a/code/datums/components/storage/storage.dm +++ b/code/datums/components/storage/storage.dm @@ -21,9 +21,16 @@ var/locked = FALSE //when locked nothing can see inside or use it. - var/max_w_class = WEIGHT_CLASS_SMALL //max size of objects that will fit. - var/max_combined_w_class = 14 //max combined sizes of objects that will fit. - var/max_items = 7 //max number of objects that will fit. + /// Storage flags, including what kinds of limiters we use for how many items we can hold + var/storage_flags = STORAGE_LIMIT_VOLUME + /// Max w_class we can hold. Applies to [STORAGE_LIMIT_COMBINED_W_CLASS] and [STORAGE_LIMIT_VOLUME] + var/max_w_class = WEIGHT_CLASS_SMALL + /// Max combined w_class. Applies to [STORAGE_LIMIT_COMBINED_W_CLASS] + var/max_combined_w_class = WEIGHT_CLASS_SMALL * 7 + /// Max items we can hold. Applies to [STORAGE_LIMIT_MAX_ITEMS] + var/max_items = 7 + /// Max volume we can hold. Applies to [STORAGE_LIMIT_VOLUME]. Auto scaled on New() if unset. + var/max_volume var/emp_shielded = FALSE @@ -65,6 +72,8 @@ /datum/component/storage/Initialize(datum/component/storage/concrete/master) if(!isatom(parent)) return COMPONENT_INCOMPATIBLE + if(isnull(max_volume)) + max_volume = AUTO_SCALE_STORAGE_VOLUME(max_w_class, max_items) if(master) change_master(master) boxes = new(null, src) diff --git a/code/game/objects/items.dm b/code/game/objects/items.dm index 78dde8d206..278c8bccbc 100644 --- a/code/game/objects/items.dm +++ b/code/game/objects/items.dm @@ -33,7 +33,12 @@ GLOBAL_VAR_INIT(rpg_loot_items, FALSE) var/hitsound = null var/usesound = null var/throwhitsound = null + + /// Weight class for how much storage capacity it uses and how big it physically is meaning storages can't hold it if their maximum weight class isn't as high as it. var/w_class = WEIGHT_CLASS_NORMAL + /// Volume override for the item, otherwise automatically calculated from w_class. + var/volume + var/total_mass //Total mass in arbitrary pound-like values. If there's no balance reasons for an item to have otherwise, this var should be the item's weight in pounds. var/slot_flags = 0 //This is used to determine on which slots an item can fit. pass_flags = PASSTABLE @@ -850,3 +855,7 @@ GLOBAL_VAR_INIT(rpg_loot_items, FALSE) if (HAS_TRAIT(src, TRAIT_NODROP)) return return ..() + +/// Get an item's volume that it uses when being stored. +/obj/item/proc/get_volume() + return isnull(volume)? AUTOSCALE_VOLUME(w_class) : volume diff --git a/tgstation.dme b/tgstation.dme index 7d64b2ce7f..6cf1d09437 100755 --- a/tgstation.dme +++ b/tgstation.dme @@ -98,6 +98,7 @@ #include "code\__DEFINES\stat.dm" #include "code\__DEFINES\stat_tracking.dm" #include "code\__DEFINES\status_effects.dm" +#include "code\__DEFINES\storage.dm" #include "code\__DEFINES\subsystems.dm" #include "code\__DEFINES\tgs.config.dm" #include "code\__DEFINES\tgs.dm" From 7ec669ecd493940f383f08f19f2518fbd4782301 Mon Sep 17 00:00:00 2001 From: kevinz000 <2003111+kevinz000@users.noreply.github.com> Date: Tue, 7 Apr 2020 16:11:58 -0700 Subject: [PATCH 034/113] bet --- code/__DEFINES/dcs/signals.dm | 1 + code/__DEFINES/storage.dm | 2 + code/_onclick/hud/screen_objects.dm | 38 --- code/_onclick/hud/screen_objects/storage.dm | 41 ++++ code/datums/components/storage/storage.dm | 141 ++--------- code/datums/components/storage/ui.dm | 259 ++++++++++++++++++++ code/modules/mob/logout.dm | 1 + icons/mob/screen_gen.dmi | Bin 118425 -> 118971 bytes 8 files changed, 326 insertions(+), 157 deletions(-) create mode 100644 code/_onclick/hud/screen_objects/storage.dm create mode 100644 code/datums/components/storage/ui.dm diff --git a/code/__DEFINES/dcs/signals.dm b/code/__DEFINES/dcs/signals.dm index 1ef8b9bb66..6255319a08 100644 --- a/code/__DEFINES/dcs/signals.dm +++ b/code/__DEFINES/dcs/signals.dm @@ -190,6 +190,7 @@ #define COMSIG_LIVING_MINOR_SHOCK "living_minor_shock" //sent by stuff like stunbatons and tasers: () #define COMSIG_LIVING_REVIVE "living_revive" //from base of mob/living/revive() (full_heal, admin_revive) #define COMSIG_MOB_CLIENT_LOGIN "comsig_mob_client_login" //sent when a mob/login() finishes: (client) +#define COMSIG_MOB_CLIENT_LOGOUT "comsig_mob_client_logout" //sent when a mob/logout() starts: (client) #define COMSIG_MOB_CLIENT_MOVE "comsig_mob_client_move" //sent when client/Move() finishes with no early returns: (client, direction, n, oldloc) #define COMSIG_LIVING_GUN_PROCESS_FIRE "living_gun_process_fire" //from base of /obj/item/gun/proc/process_fire(): (atom/target, params, zone_override) #define COMSIG_LIVING_COMBAT_ENABLED "combatmode_enabled" //from base of mob/living/enable_combat_mode() (was_forced) diff --git a/code/__DEFINES/storage.dm b/code/__DEFINES/storage.dm index 065551b975..27bf502252 100644 --- a/code/__DEFINES/storage.dm +++ b/code/__DEFINES/storage.dm @@ -30,3 +30,5 @@ // UI defines /// Minimum pixels an item must have in volumetric scaled storage UI #define MINIMUM_PIXELS_PER_ITEM 5 +/// Maximum number of objects that will be allowed to be displayed using the volumetric display system. Arbitrary number to prevent server lockups. +#define MAXIMUM_VOLUMETRIC_ITEMS 256 diff --git a/code/_onclick/hud/screen_objects.dm b/code/_onclick/hud/screen_objects.dm index f5eb8535a5..4ed286eb08 100644 --- a/code/_onclick/hud/screen_objects.dm +++ b/code/_onclick/hud/screen_objects.dm @@ -210,20 +210,6 @@ user.swap_hand(held_index) return TRUE -/obj/screen/close - name = "close" - layer = ABOVE_HUD_LAYER - plane = ABOVE_HUD_PLANE - icon_state = "backpack_close" - -/obj/screen/close/Initialize(mapload, new_master) - . = ..() - master = new_master - -/obj/screen/close/Click() - var/datum/component/storage/S = master - S.hide_from(usr) - return TRUE /obj/screen/drop name = "drop" @@ -406,30 +392,6 @@ else icon_state = "act_rest0" -/obj/screen/storage - name = "storage" - icon_state = "block" - screen_loc = "7,7 to 10,8" - layer = HUD_LAYER - plane = HUD_PLANE - -/obj/screen/storage/Initialize(mapload, new_master) - . = ..() - master = new_master - -/obj/screen/storage/Click(location, control, params) - if(world.time <= usr.next_move) - return TRUE - if(usr.incapacitated()) - return TRUE - if (ismecha(usr.loc)) // stops inventory actions in a mech - return TRUE - if(master) - var/obj/item/I = usr.get_active_held_item() - if(I) - master.attackby(null, I, usr, params) - return TRUE - /obj/screen/throw_catch name = "throw/catch" icon = 'icons/mob/screen_midnight.dmi' diff --git a/code/_onclick/hud/screen_objects/storage.dm b/code/_onclick/hud/screen_objects/storage.dm new file mode 100644 index 0000000000..5e78ba45e0 --- /dev/null +++ b/code/_onclick/hud/screen_objects/storage.dm @@ -0,0 +1,41 @@ +/obj/screen/storage + name = "storage" + var/insertion_click = FALSE + +/obj/screen/storage/Initialize(mapload, new_master) + . = ..() + master = new_master + +/obj/screen/storage/Click(location, control, params) + if(!insertion_click) + return ..() + if(world.time <= usr.next_move) + return TRUE + if(usr.incapacitated()) + return TRUE + if (ismecha(usr.loc)) // stops inventory actions in a mech + return TRUE + if(master) + var/obj/item/I = usr.get_active_held_item() + if(I) + master.attackby(null, I, usr, params) + return TRUE + +/obj/screen/storage/boxes + name = "storage" + icon_state = "block" + screen_loc = "7,7 to 10,8" + layer = HUD_LAYER + plane = HUD_PLANE + insertion_click = TRUE + +/obj/screen/storage/close + name = "close" + layer = ABOVE_HUD_LAYER + plane = ABOVE_HUD_PLANE + icon_state = "backpack_close" + +/obj/screen/storage/close/Click() + var/datum/component/storage/S = master + S.hide_from(usr) + return TRUE diff --git a/code/datums/components/storage/storage.dm b/code/datums/components/storage/storage.dm index 576bd196dc..c3ac3c48a8 100644 --- a/code/datums/components/storage/storage.dm +++ b/code/datums/components/storage/storage.dm @@ -46,8 +46,19 @@ var/display_numerical_stacking = FALSE //stack things of the same type and show as a single object with a number. - var/obj/screen/storage/boxes //storage display object - var/obj/screen/close/closer //close button object + /// "legacy"/default view mode's storage "boxes" + var/obj/screen/storage/boxes/ui_boxes + /// New volumetric storage display mode's left side + var/obj/screen/storage/left/ui_left + /// New volumetric storage display mode's right side + var/obj/screen/storage/right/ui_right + /// New volumetric storage display mode's center 'blocks' + var/obj/screen/storage/continuous/ui_continuous + /// The close button, used in all modes. + var/obj/screen/storage/close/ui_closer + /// Associative list of list(item = screen object) for volumetric storage item screen blocks + var/list/ui_item_blocks + var/current_maxscreensize var/allow_big_nesting = FALSE //allow storage objects of the same or greater size. @@ -120,8 +131,15 @@ /datum/component/storage/Destroy() close_all() - QDEL_NULL(boxes) - QDEL_NULL(closer) + QDEL_NULL(ui_boxes) + QDEL_NULL(ui_closer) + QDEL_NULL(ui_continuous) + QDEL_NULL(ui_left) + QDEL_NULL(ui_right) + // DO NOT USE QDEL_LIST_ASSOC. + for(var/i in ui_item_blocks) + qdel(ui_item_blocks[i]) //qdel the screen object not the item + ui_item_blocks.Cut() LAZYCLEARLIST(is_using) return ..() @@ -309,103 +327,6 @@ if(check_locked()) close_all() -/datum/component/storage/proc/_process_numerical_display() - . = list() - for(var/obj/item/I in accessible_items()) - if(QDELETED(I)) - continue - if(!.[I.type]) - .[I.type] = new /datum/numbered_display(I, 1) - else - var/datum/numbered_display/ND = .[I.type] - ND.number++ - . = sortTim(., /proc/cmp_numbered_displays_name_asc, associative = TRUE) - -//This proc determines the size of the inventory to be displayed. Please touch it only if you know what you're doing. -/datum/component/storage/proc/orient2hud(mob/user, maxcolumns) - var/list/accessible_contents = accessible_items() - var/adjusted_contents = length(accessible_contents) - - //Numbered contents display - var/list/datum/numbered_display/numbered_contents - if(display_numerical_stacking) - numbered_contents = _process_numerical_display() - adjusted_contents = numbered_contents.len - - var/columns = CLAMP(max_items, 1, maxcolumns ? maxcolumns : screen_max_columns) - var/rows = CLAMP(CEILING(adjusted_contents / columns, 1), 1, screen_max_rows) - standard_orient_objs(rows, columns, numbered_contents) - -//This proc draws out the inventory and places the items on it. It uses the standard position. -/datum/component/storage/proc/standard_orient_objs(rows, cols, list/obj/item/numerical_display_contents) - boxes.screen_loc = "[screen_start_x]:[screen_pixel_x],[screen_start_y]:[screen_pixel_y] to [screen_start_x+cols-1]:[screen_pixel_x],[screen_start_y+rows-1]:[screen_pixel_y]" - var/cx = screen_start_x - var/cy = screen_start_y - if(islist(numerical_display_contents)) - for(var/type in numerical_display_contents) - var/datum/numbered_display/ND = numerical_display_contents[type] - ND.sample_object.mouse_opacity = MOUSE_OPACITY_OPAQUE - ND.sample_object.screen_loc = "[cx]:[screen_pixel_x],[cy]:[screen_pixel_y]" - ND.sample_object.maptext = "[(ND.number > 1)? "[ND.number]" : ""]" - ND.sample_object.layer = ABOVE_HUD_LAYER - ND.sample_object.plane = ABOVE_HUD_PLANE - cx++ - if(cx - screen_start_x >= cols) - cx = screen_start_x - cy++ - if(cy - screen_start_y >= rows) - break - else - for(var/obj/O in accessible_items()) - if(QDELETED(O)) - continue - O.mouse_opacity = MOUSE_OPACITY_OPAQUE //This is here so storage items that spawn with contents correctly have the "click around item to equip" - O.screen_loc = "[cx]:[screen_pixel_x],[cy]:[screen_pixel_y]" - O.maptext = "" - O.layer = ABOVE_HUD_LAYER - O.plane = ABOVE_HUD_PLANE - cx++ - if(cx - screen_start_x >= cols) - cx = screen_start_x - cy++ - if(cy - screen_start_y >= rows) - break - closer.screen_loc = "[screen_start_x + cols]:[screen_pixel_x],[screen_start_y]:[screen_pixel_y]" - -/datum/component/storage/proc/show_to(mob/M, set_screen_size = TRUE) - if(!M.client) - return FALSE - var/list/cview = getviewsize(M.client.view) - var/maxallowedscreensize = cview[1]-8 - if(set_screen_size) - current_maxscreensize = maxallowedscreensize - else if(current_maxscreensize) - maxallowedscreensize = current_maxscreensize - if(M.active_storage != src && (M.stat == CONSCIOUS)) - for(var/obj/item/I in accessible_items()) - if(I.on_found(M)) - return FALSE - if(M.active_storage) - M.active_storage.hide_from(M) - orient2hud(M, (isliving(M) ? maxallowedscreensize : 7)) - M.client.screen |= boxes - M.client.screen |= closer - M.client.screen |= accessible_items() - M.active_storage = src - LAZYOR(is_using, M) - return TRUE - -/datum/component/storage/proc/hide_from(mob/M) - if(!M.client) - return TRUE - var/atom/real_location = real_location() - M.client.screen -= boxes - M.client.screen -= closer - M.client.screen -= real_location.contents - if(M.active_storage == src) - M.active_storage = null - LAZYREMOVE(is_using, M) - return TRUE /datum/component/storage/proc/close(mob/M) hide_from(M) @@ -427,24 +348,6 @@ var/datum/component/storage/concrete/master = master() master.emp_act(source, severity) -//This proc draws out the inventory and places the items on it. tx and ty are the upper left tile and mx, my are the bottm right. -//The numbers are calculated from the bottom-left The bottom-left slot being 1,1. -/datum/component/storage/proc/orient_objs(tx, ty, mx, my) - var/atom/real_location = real_location() - var/cx = tx - var/cy = ty - boxes.screen_loc = "[tx]:,[ty] to [mx],[my]" - for(var/obj/O in real_location) - if(QDELETED(O)) - continue - O.screen_loc = "[cx],[cy]" - O.layer = ABOVE_HUD_LAYER - O.plane = ABOVE_HUD_PLANE - cx++ - if(cx > mx) - cx = tx - cy-- - closer.screen_loc = "[mx+1],[my]" //Resets something that is being removed from storage. /datum/component/storage/proc/_removal_reset(atom/movable/thing) diff --git a/code/datums/components/storage/ui.dm b/code/datums/components/storage/ui.dm new file mode 100644 index 0000000000..f73aff43ec --- /dev/null +++ b/code/datums/components/storage/ui.dm @@ -0,0 +1,259 @@ +/** + * Generates a list of numbered_display datums for the numerical display system. + */ +/datum/component/storage/proc/_process_numerical_display() + . = list() + for(var/obj/item/I in accessible_items()) + if(QDELETED(I)) + continue + if(!.[I.type]) + .[I.type] = new /datum/numbered_display(I, 1) + else + var/datum/numbered_display/ND = .[I.type] + ND.number++ + . = sortTim(., /proc/cmp_numbered_displays_name_asc, associative = TRUE) + +/** + * Orients all objects in legacy mode, and returns the objects to show to the user. + */ +/datum/component/storage/proc/orient2hud_legacy(mob/user, maxcolumns) + . = list() + var/list/accessible_contents = accessible_items() + var/adjusted_contents = length(accessible_contents) + + //Numbered contents display + var/list/datum/numbered_display/numbered_contents + if(display_numerical_stacking) + numbered_contents = _process_numerical_display() + adjusted_contents = numbered_contents.len + + var/columns = CLAMP(max_items, 1, maxcolumns ? maxcolumns : screen_max_columns) + var/rows = CLAMP(CEILING(adjusted_contents / columns, 1), 1, screen_max_rows) + + // First, boxes. + ui_boxes.screen_loc = "[screen_start_x]:[screen_pixel_x],[screen_start_y]:[screen_pixel_y] to [screen_start_x+columns-1]:[screen_pixel_x],[screen_start_y+rows-1]:[screen_pixel_y]" + . += ui_boxes + // Then, closer. + closer.screen_loc = "[screen_start_x + columns]:[screen_pixel_x],[screen_start_y]:[screen_pixel_y]" + . += ui_closer + // Then orient the actual items. + var/cx = screen_start_x + var/cy = screen_start_y + if(islist(numerical_display_contents)) + for(var/type in numerical_display_contents) + var/datum/numbered_display/ND = numerical_display_contents[type] + ND.sample_object.mouse_opacity = MOUSE_OPACITY_OPAQUE + ND.sample_object.screen_loc = "[cx]:[screen_pixel_x],[cy]:[screen_pixel_y]" + ND.sample_object.maptext = "[(ND.number > 1)? "[ND.number]" : ""]" + ND.sample_object.layer = ABOVE_HUD_LAYER + ND.sample_object.plane = ABOVE_HUD_PLANE + . += ND.sample_object + cx++ + if(cx - screen_start_x >= columns) + cx = screen_start_x + cy++ + if(cy - screen_start_y >= rows) + break + else + for(var/obj/O in accessible_items()) + if(QDELETED(O)) + continue + O.mouse_opacity = MOUSE_OPACITY_OPAQUE //This is here so storage items that spawn with contents correctly have the "click around item to equip" + O.screen_loc = "[cx]:[screen_pixel_x],[cy]:[screen_pixel_y]" + O.maptext = "" + O.layer = ABOVE_HUD_LAYER + O.plane = ABOVE_HUD_PLANE + . += O + cx++ + if(cx - screen_start_x >= columns) + cx = screen_start_x + cy++ + if(cy - screen_start_y >= rows) + break + +/** + * Orients all objects in .. volumetric mode. + */ +/datum/component/storage/proc/orient2hud_volumetric(mob/user, maxcolumns) + . = list() + var/list/accessible_contents = accessible_items() + var/adjusted_contents = length(accessible_contents) + + //Numbered contents display + var/list/datum/numbered_display/numbered_contents + if(display_numerical_stacking) + numbered_contents = _process_numerical_display() + adjusted_contents = numbered_contents.len + + var/columns = CLAMP(max_items, 1, maxcolumns ? maxcolumns : screen_max_columns) + var/rows = CLAMP(CEILING(adjusted_contents / columns, 1), 1, screen_max_rows) + + // First, continuous section. + ui_continuous.screen_loc = "[screen_start_x]:[screen_pixel_x],[screen_start_y]:[screen_pixel_y] to [screen_start_x+columns-1]:[screen_pixel_x],[screen_start_y+rows-1]:[screen_pixel_y]" + . += ui_continuous + // Then, left and right. + ui_left.screen_loc = "[screen_start_x]:[screen_pixel_x - 2],[screen_start_y]:[screen_pixel_y] to [screen_start_x]:[screen_pixel_x - 2],[screen_start_y+rows-1]:[screen_pixel_y]" + . += ui_left + ui_right.screen_loc = "[screen_start_x+columns-1]:[screen_pixel_x + 2],[screen_start_y]:[screen_pixel_y] to [screen_start_x+columns-1]:[screen_pixel_x + 2],[screen_start_y+rows-1]:[screen_pixel_y]" + . += ui_right + // Then, closer. + closer.screen_loc = "[screen_start_x + columns]:[screen_pixel_x],[screen_start_y]:[screen_pixel_y]" + . += ui_closer + // Generate ui_item_blocks for missing ones. + + + + + + + var/cx = screen_start_x + var/cy = screen_start_y + if(islist(numerical_display_contents)) + for(var/type in numerical_display_contents) + var/datum/numbered_display/ND = numerical_display_contents[type] + ND.sample_object.mouse_opacity = MOUSE_OPACITY_OPAQUE + ND.sample_object.screen_loc = "[cx]:[screen_pixel_x],[cy]:[screen_pixel_y]" + ND.sample_object.maptext = "[(ND.number > 1)? "[ND.number]" : ""]" + ND.sample_object.layer = ABOVE_HUD_LAYER + ND.sample_object.plane = ABOVE_HUD_PLANE + . += ND.sample_object + cx++ + if(cx - screen_start_x >= columns) + cx = screen_start_x + cy++ + if(cy - screen_start_y >= rows) + break + else + for(var/obj/O in accessible_items()) + if(QDELETED(O)) + continue + O.mouse_opacity = MOUSE_OPACITY_OPAQUE //This is here so storage items that spawn with contents correctly have the "click around item to equip" + O.screen_loc = "[cx]:[screen_pixel_x],[cy]:[screen_pixel_y]" + O.maptext = "" + O.layer = ABOVE_HUD_LAYER + O.plane = ABOVE_HUD_PLANE + . += O + cx++ + if(cx - screen_start_x >= columns) + cx = screen_start_x + cy++ + if(cy - screen_start_y >= rows) + break + +/** + * Shows our UI to a mob. + */ +/datum/component/storage/proc/ui_show(mob/M, set_screen_size = TRUE) + if(!M.client) + return FALSE + var/list/cview = getviewsize(M.client.view) + // in tiles + var/maxallowedscreensize = cview[1]-8 + if(set_screen_size) + current_maxscreensize = maxallowedscreensize + else if(current_maxscreensize) + maxallowedscreensize = current_maxscreensize + // we got screen size, register signal + RegisterSignal(M, COMSIG_MOB_CLIENT_LOGOUT, .proc/on_logout) + if(M.active_storage) + M.active_storage.ui_hide(M) + M.active_storage = src + LAZOR(is_using, M) + if(volumetric_ui()) + //new volumetric ui bay-style + M.client.screen |= orient2hud_volumetric(M, maxallowedscreensize) + else + //old ui + M.client.screen |= orient2hud_legacy(M, maxallowedscreensize) + return TRUE + +/** + * VV hooked to ensure no lingering screen objects. + */ +/datum/component/storage/vv_edit_var(var_name, var_value) + var/list/old + if(var_name == NAMEOF(storage_flags)) + old = is_using.Copy() + for(var/i in is_using) + ui_hide(i) + . = ..() + if(old) + for(var/i in old) + ui_show(i) + +/** + * Proc triggered by signal to ensure logging out clients don't linger. + */ +/datum/component/storage/proc/on_logout(datum/source, client/C) + ui_hide(source) + +/** + * Hides our UI from a mob + */ +/datum/component/storage/proc/ui_hide(mob/M) + if(!M.client) + return TRUE + M.client.screen -= list(ui_boxes, ui_closer, ui_left, ui_right, ui_continuous, get_ui_item_objects_hide()) + if(M.active_storage == src) + M.active_storage = null + LAZYREMOVE(is_using, M) + return TRUE + +/** + * Returns TRUE if we are using volumetric UI instead of box UI + */ +/datum/component/storage/proc/volumetric_ui() + var/atom/real_location = real_location() + return (storage_flags & STORAGE_LIMIT_VOLUME) && (length(real_location.contents) <= MAXIMUM_VOLUMETRIC_OBJECTS) + +/** + * Gets the ui item objects to ui_hide. + */ +/datum/component/storage/proc/get_ui_item_objects_hide() + if(!volumetric_ui()) + var/atom/real_location = real_location() + return real_location.contents + else + . = list() + for(var/i in ui_item_blocks) + . += ui_item_blocks[i] //get the block not the item + +/** + * Gets our ui_boxes, making it if it doesn't exist. + */ +/datum/component/storage/proc/get_ui_boxes() + if(!ui_boxes) + ui_boxes = new(null, src) + return ui_boxes + +/** + * Gets our ui_left, making it if it doesn't exist. + */ +/datum/component/storage/proc/get_ui_left() + if(!ui_left) + ui_left = new(null, src) + return ui_left + +/** + * Gets our ui_right, making it if it doesn't exist. + */ +/datum/component/storage/proc/get_ui_right() + if(!ui_right) + ui_right = new(null, src) + return ui_right + +/** + * Gets our ui_close, making it if it doesn't exist. + */ +/datum/component/storage/proc/get_ui_close() + if(!ui_close) + ui_close = new(null, src) + return ui_close + +/** + * Gets our ui_continuous, making it if it doesn't exist. + */ +/datum/component/storage/proc/get_ui_continuous() + if(!ui_continuous) + ui_continuous = new(null, src) + return ui_continuous diff --git a/code/modules/mob/logout.dm b/code/modules/mob/logout.dm index e5aaa016bd..536eacca7d 100644 --- a/code/modules/mob/logout.dm +++ b/code/modules/mob/logout.dm @@ -1,4 +1,5 @@ /mob/Logout() + SEND_SIGNAL(src, COMSIG_MOB_CLIENT_LOGOUT, client) log_message("[key_name(src)] is no longer owning mob [src]([src.type])", LOG_OWNERSHIP) SStgui.on_logout(src) unset_machine() diff --git a/icons/mob/screen_gen.dmi b/icons/mob/screen_gen.dmi index ea946f60d9c31139c6e5d3e8aed79794e0294ff0..ffbffcab0dd1b8c809830e4544b548ad075c5ae5 100644 GIT binary patch delta 7900 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 bQ*{fvrhuQ-ZehW|h5#dd6TMPh$0z> Date: Wed, 8 Apr 2020 00:57:09 -0700 Subject: [PATCH 035/113] cancel --- code/__DEFINES/storage.dm | 4 +- code/_onclick/hud/screen_objects/storage.dm | 10 ++ code/datums/components/storage/storage.dm | 2 + code/datums/components/storage/ui.dm | 135 ++++++++++++-------- 4 files changed, 95 insertions(+), 56 deletions(-) diff --git a/code/__DEFINES/storage.dm b/code/__DEFINES/storage.dm index 27bf502252..56fa599dc3 100644 --- a/code/__DEFINES/storage.dm +++ b/code/__DEFINES/storage.dm @@ -29,6 +29,8 @@ // UI defines /// Minimum pixels an item must have in volumetric scaled storage UI -#define MINIMUM_PIXELS_PER_ITEM 5 +#define MINIMUM_PIXELS_PER_ITEM 4 +/// The size of the volumetric scaled storage UI's volumetric boxes that's rendered behind items. +#define VOLUMETRIC_STORAGE_BOX_SIZE 8 /// Maximum number of objects that will be allowed to be displayed using the volumetric display system. Arbitrary number to prevent server lockups. #define MAXIMUM_VOLUMETRIC_ITEMS 256 diff --git a/code/_onclick/hud/screen_objects/storage.dm b/code/_onclick/hud/screen_objects/storage.dm index 5e78ba45e0..56d921472c 100644 --- a/code/_onclick/hud/screen_objects/storage.dm +++ b/code/_onclick/hud/screen_objects/storage.dm @@ -39,3 +39,13 @@ var/datum/component/storage/S = master S.hide_from(usr) return TRUE + +/obj/screen/storage/volumetric_box + var/obj/item/our_item + +/obj/screen/storage/volumetric_box/Initialize(mapload, new_master, our_item) + src.our_item = our_item + return ..() + +/obj/screen/storage/volumetric_box/Click(location, control, params) + return our_item.Click(location, control, params) diff --git a/code/datums/components/storage/storage.dm b/code/datums/components/storage/storage.dm index c3ac3c48a8..8f053961e5 100644 --- a/code/datums/components/storage/storage.dm +++ b/code/datums/components/storage/storage.dm @@ -360,6 +360,8 @@ /datum/component/storage/proc/_remove_and_refresh(datum/source, atom/movable/thing) _removal_reset(thing) + qdel(ui_item_blocks[thing]) + ui_item_blocks -= thing refresh_mob_views() //Call this proc to handle the removal of an item from the storage item. The item will be moved to the new_location target, if that is null it's being deleted diff --git a/code/datums/components/storage/ui.dm b/code/datums/components/storage/ui.dm index f73aff43ec..b014ef9dd1 100644 --- a/code/datums/components/storage/ui.dm +++ b/code/datums/components/storage/ui.dm @@ -72,73 +72,98 @@ break /** - * Orients all objects in .. volumetric mode. + * Orients all objects in .. volumetric mode. Does not support numerical display! */ /datum/component/storage/proc/orient2hud_volumetric(mob/user, maxcolumns) . = list() - var/list/accessible_contents = accessible_items() - var/adjusted_contents = length(accessible_contents) - //Numbered contents display - var/list/datum/numbered_display/numbered_contents - if(display_numerical_stacking) - numbered_contents = _process_numerical_display() - adjusted_contents = numbered_contents.len + // Generate ui_item_blocks for missing ones and render+orient. + var/list/atom/contents = accessible_items() - var/columns = CLAMP(max_items, 1, maxcolumns ? maxcolumns : screen_max_columns) - var/rows = CLAMP(CEILING(adjusted_contents / columns, 1), 1, screen_max_rows) + var/horizontal_pixels = maxcolumns * world.icon_size + // do the check for fallback for when someone has too much gamer gear + if((MINIMUM_PIXELS_PER_ITEMS * length(contents)) > horizontal_pixels) + to_chat(user, "[parent] was showed to you in legacy mode due to your items overrunning the three row limit! Consider not carrying too much or bugging a maintainer to raise this limit!") + return orient2hud_legacy(user, maxcolumns) + // after this point we are sure we can somehow fit all items with 8 pixels or more into our one row. - // First, continuous section. - ui_continuous.screen_loc = "[screen_start_x]:[screen_pixel_x],[screen_start_y]:[screen_pixel_y] to [screen_start_x+columns-1]:[screen_pixel_x],[screen_start_y+rows-1]:[screen_pixel_y]" + + // sigh. two loops. + var/total = max_volume + + var/used = 0 + + var/list/volume_by_item = list() + var/list/percentage_by_item = list() + var/list/percentages = list() + // define outside for less lag + var/obj/item/I + var/volume + for(var/obj/item/I in contents) + volume = I.get_volume() + used += volume_by_item[I] = volume + percentages += percentage_by_item[I] = volume + // ugh + var/min_percent = min(percentages) + + var/percentage_metric = max(min_percent, + + var/pixels_needed = (100 / min_percent) * MINIMUM_PIXELS_PER_ITEM + + var/overrunning = pixels_needed > maximum_horizontal_pixels + + var/row = 1 + var/pixel = 0 + + for(var/i in volume_by_item) + I = i + if(!ui_item_blocks[I]) + ui_item_blocks[I] = new /obj/screen/storage(null, src, I) + var/obj/screen/storage/volumetric_box/B = ui_item_blocks[I] + + . += B + var/pixels_to_use + if(!overrunning) + pixels_to_use = CEILING(min_percent / percentage_by_item[i], MINIMUM_PIXELS_PER_ITEM) + else + pixels_to_use = MINIMUM_PIXELS_PER_ITEM //not enough room to display everything ughh + + // now that we have pixels_to_use, place our thing and add it to the returned list. + + // uh oh, increment row or clamp. + if((horizontal_pixels - pixel) < pixels_to_use) + if(!pixels_to_use) + row++ + else + pixels_to_use = (horizontal_pixels - pixel) + // now, scale the thing + var/multiply = pixels_to_use / MINIMUM_PIXELS_PER_ITEM + B.transform = matrix(multiply, 0, 0, 0, 1, 0) + // unfortunately since scaling means expand-from-center.. ugh.. + var/px_add = 0 + if(multiply > 1) + px_add = (pixels_to_use - MINIMUM_PIXELS_PER_ITEM) * 0.5 + // not handling multiply < 1, that should never happen. + // now, screenloc the thing. + var/xshift = FLOOR(pixel / icon_size, 1) + var/px = pixel % world.icon_Size + B.screen_loc = "[screen_start_x + xshift]:[px],[screen_start_y+rows-1]:[screen_pixel_y]" + pixels += px + if(pixels >= horizontal_pixels) + row++ + . += B + + // Then, continuous section. + ui_continuous.screen_loc = "[screen_start_x]:[screen_pixel_x],[screen_start_y]:[screen_pixel_y] to [screen_start_x+maxcolumns-1]:[screen_pixel_x],[screen_start_y+rows-1]:[screen_pixel_y]" . += ui_continuous // Then, left and right. ui_left.screen_loc = "[screen_start_x]:[screen_pixel_x - 2],[screen_start_y]:[screen_pixel_y] to [screen_start_x]:[screen_pixel_x - 2],[screen_start_y+rows-1]:[screen_pixel_y]" . += ui_left - ui_right.screen_loc = "[screen_start_x+columns-1]:[screen_pixel_x + 2],[screen_start_y]:[screen_pixel_y] to [screen_start_x+columns-1]:[screen_pixel_x + 2],[screen_start_y+rows-1]:[screen_pixel_y]" + ui_right.screen_loc = "[screen_start_x+maxcolumns-1]:[screen_pixel_x + 2],[screen_start_y]:[screen_pixel_y] to [screen_start_x+maxcolumns-1]:[screen_pixel_x + 2],[screen_start_y+rows-1]:[screen_pixel_y]" . += ui_right // Then, closer. - closer.screen_loc = "[screen_start_x + columns]:[screen_pixel_x],[screen_start_y]:[screen_pixel_y]" + closer.screen_loc = "[screen_start_x + maxcolumns]:[screen_pixel_x],[screen_start_y]:[screen_pixel_y]" . += ui_closer - // Generate ui_item_blocks for missing ones. - - - - - - - var/cx = screen_start_x - var/cy = screen_start_y - if(islist(numerical_display_contents)) - for(var/type in numerical_display_contents) - var/datum/numbered_display/ND = numerical_display_contents[type] - ND.sample_object.mouse_opacity = MOUSE_OPACITY_OPAQUE - ND.sample_object.screen_loc = "[cx]:[screen_pixel_x],[cy]:[screen_pixel_y]" - ND.sample_object.maptext = "[(ND.number > 1)? "[ND.number]" : ""]" - ND.sample_object.layer = ABOVE_HUD_LAYER - ND.sample_object.plane = ABOVE_HUD_PLANE - . += ND.sample_object - cx++ - if(cx - screen_start_x >= columns) - cx = screen_start_x - cy++ - if(cy - screen_start_y >= rows) - break - else - for(var/obj/O in accessible_items()) - if(QDELETED(O)) - continue - O.mouse_opacity = MOUSE_OPACITY_OPAQUE //This is here so storage items that spawn with contents correctly have the "click around item to equip" - O.screen_loc = "[cx]:[screen_pixel_x],[cy]:[screen_pixel_y]" - O.maptext = "" - O.layer = ABOVE_HUD_LAYER - O.plane = ABOVE_HUD_PLANE - . += O - cx++ - if(cx - screen_start_x >= columns) - cx = screen_start_x - cy++ - if(cy - screen_start_y >= rows) - break /** * Shows our UI to a mob. @@ -204,7 +229,7 @@ */ /datum/component/storage/proc/volumetric_ui() var/atom/real_location = real_location() - return (storage_flags & STORAGE_LIMIT_VOLUME) && (length(real_location.contents) <= MAXIMUM_VOLUMETRIC_OBJECTS) + return (storage_flags & STORAGE_LIMIT_VOLUME) && (length(real_location.contents) <= MAXIMUM_VOLUMETRIC_OBJECTS) && !display_numeric_stacking /** * Gets the ui item objects to ui_hide. From 33aa16bfcf9fac832df86a43c66efa587f23d0ec Mon Sep 17 00:00:00 2001 From: kevinz000 <2003111+kevinz000@users.noreply.github.com> Date: Wed, 8 Apr 2020 01:04:56 -0700 Subject: [PATCH 036/113] ok --- code/datums/components/storage/ui.dm | 62 +++++++++++----------------- tgstation.dme | 2 + 2 files changed, 26 insertions(+), 38 deletions(-) diff --git a/code/datums/components/storage/ui.dm b/code/datums/components/storage/ui.dm index b014ef9dd1..65f3811e92 100644 --- a/code/datums/components/storage/ui.dm +++ b/code/datums/components/storage/ui.dm @@ -84,49 +84,35 @@ // do the check for fallback for when someone has too much gamer gear if((MINIMUM_PIXELS_PER_ITEMS * length(contents)) > horizontal_pixels) to_chat(user, "[parent] was showed to you in legacy mode due to your items overrunning the three row limit! Consider not carrying too much or bugging a maintainer to raise this limit!") - return orient2hud_legacy(user, maxcolumns) + return orient2hud_legacy(user, maxcolumns)VO // after this point we are sure we can somehow fit all items with 8 pixels or more into our one row. - - // sigh. two loops. - var/total = max_volume - + // sigh loopmania time var/used = 0 - + // define outside for performance + var/volume var/list/volume_by_item = list() var/list/percentage_by_item = list() - var/list/percentages = list() - // define outside for less lag - var/obj/item/I - var/volume for(var/obj/item/I in contents) - volume = I.get_volume() - used += volume_by_item[I] = volume - percentages += percentage_by_item[I] = volume - // ugh - var/min_percent = min(percentages) + volume = I.get_volume + used += volume + volume_by_item[I] = volume + percentage_by_item[I] = volume / max_volume + var/overrun = FALSE + if(used >= (horizontal_pixels + 4)) //2-4 pixel grace zone + // congratulations we are now in overrun mode. everything will be crammed to minimum storage pixels. + to_chat(user, "[parent] rendered in overrun mode due to more items inside than the maximum volume supports.") + overrun = TRUE - var/percentage_metric = max(min_percent, - - var/pixels_needed = (100 / min_percent) * MINIMUM_PIXELS_PER_ITEM - - var/overrunning = pixels_needed > maximum_horizontal_pixels - - var/row = 1 - var/pixel = 0 - - for(var/i in volume_by_item) + // define outside for marginal performance boost + var/obj/item/I + for(var/i in percentage_by_item) I = i + var/percent = percentage_by_item[I] if(!ui_item_blocks[I]) ui_item_blocks[I] = new /obj/screen/storage(null, src, I) var/obj/screen/storage/volumetric_box/B = ui_item_blocks[I] - - . += B - var/pixels_to_use - if(!overrunning) - pixels_to_use = CEILING(min_percent / percentage_by_item[i], MINIMUM_PIXELS_PER_ITEM) - else - pixels_to_use = MINIMUM_PIXELS_PER_ITEM //not enough room to display everything ughh + var/pixels_to_use = overrun? MINIMUM_PIXELS_PER_ITEM : max(MINIMUM_PIXELS_PER_ITEM, FLOOR(horizontal_pixels * percent, MINIMUM_PIXELS_PER_ITEM)) // now that we have pixels_to_use, place our thing and add it to the returned list. @@ -137,21 +123,21 @@ else pixels_to_use = (horizontal_pixels - pixel) // now, scale the thing - var/multiply = pixels_to_use / MINIMUM_PIXELS_PER_ITEM + var/multiply = pixels_to_use / VOLUMETRIC_STORAGE_BOX_SIZE B.transform = matrix(multiply, 0, 0, 0, 1, 0) // unfortunately since scaling means expand-from-center.. ugh.. - var/px_add = 0 - if(multiply > 1) - px_add = (pixels_to_use - MINIMUM_PIXELS_PER_ITEM) * 0.5 - // not handling multiply < 1, that should never happen. + var/px_add = (pixels_to_use - VOLUMETRIC_STORAGE_BOX_SIZE) * 0.5 // now, screenloc the thing. var/xshift = FLOOR(pixel / icon_size, 1) var/px = pixel % world.icon_Size - B.screen_loc = "[screen_start_x + xshift]:[px],[screen_start_y+rows-1]:[screen_pixel_y]" + B.screen_loc = I.screen_loc = "[screen_start_x + xshift]:[px + px_add],[screen_start_y+rows-1]:[screen_pixel_y]" pixels += px if(pixels >= horizontal_pixels) row++ + + // finally add our things. . += B + . += I // Then, continuous section. ui_continuous.screen_loc = "[screen_start_x]:[screen_pixel_x],[screen_start_y]:[screen_pixel_y] to [screen_start_x+maxcolumns-1]:[screen_pixel_x],[screen_start_y+rows-1]:[screen_pixel_y]" diff --git a/tgstation.dme b/tgstation.dme index fff2248a54..89a48a0344 100644 --- a/tgstation.dme +++ b/tgstation.dme @@ -225,6 +225,7 @@ #include "code\_onclick\hud\robot.dm" #include "code\_onclick\hud\screen_objects.dm" #include "code\_onclick\hud\swarmer.dm" +#include "code\_onclick\hud\screen_objects\storage.dm" #include "code\controllers\admin.dm" #include "code\controllers\configuration_citadel.dm" #include "code\controllers\controller.dm" @@ -433,6 +434,7 @@ #include "code\datums\components\fantasy\prefixes.dm" #include "code\datums\components\fantasy\suffixes.dm" #include "code\datums\components\storage\storage.dm" +#include "code\datums\components\storage\ui.dm" #include "code\datums\components\storage\concrete\_concrete.dm" #include "code\datums\components\storage\concrete\bag_of_holding.dm" #include "code\datums\components\storage\concrete\bluespace.dm" From a071a5f2f646c66bdd98a2916be1f4fe18b888ba Mon Sep 17 00:00:00 2001 From: kevinz000 <2003111+kevinz000@users.noreply.github.com> Date: Wed, 8 Apr 2020 01:05:09 -0700 Subject: [PATCH 037/113] ok --- code/datums/components/storage/ui.dm | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/code/datums/components/storage/ui.dm b/code/datums/components/storage/ui.dm index 65f3811e92..7b7f39e1e7 100644 --- a/code/datums/components/storage/ui.dm +++ b/code/datums/components/storage/ui.dm @@ -84,7 +84,7 @@ // do the check for fallback for when someone has too much gamer gear if((MINIMUM_PIXELS_PER_ITEMS * length(contents)) > horizontal_pixels) to_chat(user, "[parent] was showed to you in legacy mode due to your items overrunning the three row limit! Consider not carrying too much or bugging a maintainer to raise this limit!") - return orient2hud_legacy(user, maxcolumns)VO + return orient2hud_legacy(user, maxcolumns) // after this point we are sure we can somehow fit all items with 8 pixels or more into our one row. // sigh loopmania time @@ -183,7 +183,7 @@ */ /datum/component/storage/vv_edit_var(var_name, var_value) var/list/old - if(var_name == NAMEOF(storage_flags)) + if(var_name == NAMEOF(src, storage_flags)) old = is_using.Copy() for(var/i in is_using) ui_hide(i) From a888c7c29afbf12349c088de757e8165a4b4b7ea Mon Sep 17 00:00:00 2001 From: kevinz000 <2003111+kevinz000@users.noreply.github.com> Date: Thu, 9 Apr 2020 02:52:32 -0700 Subject: [PATCH 038/113] continue --- code/_onclick/hud/screen_objects/storage.dm | 10 ++++++++++ code/datums/components/storage/storage.dm | 13 ++++++------- code/datums/components/storage/ui.dm | 9 +++------ code/game/objects/items.dm | 6 +++--- 4 files changed, 22 insertions(+), 16 deletions(-) diff --git a/code/_onclick/hud/screen_objects/storage.dm b/code/_onclick/hud/screen_objects/storage.dm index 56d921472c..04436a3b5a 100644 --- a/code/_onclick/hud/screen_objects/storage.dm +++ b/code/_onclick/hud/screen_objects/storage.dm @@ -40,7 +40,17 @@ S.hide_from(usr) return TRUE +/obj/screen/storage/left + icon_state = "storage_start" + +/obj/screen/storage/right + icon_state = "storage_end" + +/obj/screen/storage/continuous + icon_state = "storage_continue" + /obj/screen/storage/volumetric_box + icon_state = "stored_8px" var/obj/item/our_item /obj/screen/storage/volumetric_box/Initialize(mapload, new_master, our_item) diff --git a/code/datums/components/storage/storage.dm b/code/datums/components/storage/storage.dm index 8f053961e5..5fe5543f38 100644 --- a/code/datums/components/storage/storage.dm +++ b/code/datums/components/storage/storage.dm @@ -55,7 +55,7 @@ /// New volumetric storage display mode's center 'blocks' var/obj/screen/storage/continuous/ui_continuous /// The close button, used in all modes. - var/obj/screen/storage/close/ui_closer + var/obj/screen/storage/close/ui_close /// Associative list of list(item = screen object) for volumetric storage item screen blocks var/list/ui_item_blocks @@ -132,7 +132,7 @@ /datum/component/storage/Destroy() close_all() QDEL_NULL(ui_boxes) - QDEL_NULL(ui_closer) + QDEL_NULL(ui_close) QDEL_NULL(ui_continuous) QDEL_NULL(ui_left) QDEL_NULL(ui_right) @@ -327,8 +327,7 @@ if(check_locked()) close_all() - -/datum/component/storage/proc/close(mob/M) +/datui_um/component/storage/proc/close(mob/M) hide_from(M) /datum/component/storage/proc/close_all() @@ -376,7 +375,7 @@ /datum/component/storage/proc/refresh_mob_views() var/list/seeing = can_see_contents() for(var/i in seeing) - show_to(i) + ui_show_to(i) return TRUE /datum/component/storage/proc/can_see_contents() @@ -473,7 +472,7 @@ A.add_fingerprint(M) if(!force && (check_locked(null, M) || !M.CanReach(parent, view_only = TRUE))) return FALSE - show_to(M, !ghost) + ui_show_to(M, !ghost) /datum/component/storage/proc/mousedrop_receive(datum/source, atom/movable/O, mob/M) if(isitem(O)) @@ -656,7 +655,7 @@ if(A.loc == user) . = COMPONENT_NO_ATTACK_HAND if(!check_locked(source, user, TRUE)) - show_to(user) + ui_show_to(user) A.do_jiggle() /datum/component/storage/proc/signal_on_pickup(datum/source, mob/user) diff --git a/code/datums/components/storage/ui.dm b/code/datums/components/storage/ui.dm index 7b7f39e1e7..c062922700 100644 --- a/code/datums/components/storage/ui.dm +++ b/code/datums/components/storage/ui.dm @@ -131,21 +131,18 @@ var/xshift = FLOOR(pixel / icon_size, 1) var/px = pixel % world.icon_Size B.screen_loc = I.screen_loc = "[screen_start_x + xshift]:[px + px_add],[screen_start_y+rows-1]:[screen_pixel_y]" - pixels += px - if(pixels >= horizontal_pixels) - row++ // finally add our things. . += B . += I // Then, continuous section. - ui_continuous.screen_loc = "[screen_start_x]:[screen_pixel_x],[screen_start_y]:[screen_pixel_y] to [screen_start_x+maxcolumns-1]:[screen_pixel_x],[screen_start_y+rows-1]:[screen_pixel_y]" + ui_continuous.screen_loc = "[screen_start_x]:[screen_pixel_x],[screen_start_y]:[screen_pixel_y] to [screen_start_x+maxcolumns-1]:[screen_pixel_x],[screen_start_y]:[screen_pixel_y]" . += ui_continuous // Then, left and right. - ui_left.screen_loc = "[screen_start_x]:[screen_pixel_x - 2],[screen_start_y]:[screen_pixel_y] to [screen_start_x]:[screen_pixel_x - 2],[screen_start_y+rows-1]:[screen_pixel_y]" + ui_left.screen_loc = "[screen_start_x]:[screen_pixel_x - 2],[screen_start_y]:[screen_pixel_y] to [screen_start_x]:[screen_pixel_x - 2],[screen_start_y]:[screen_pixel_y]" . += ui_left - ui_right.screen_loc = "[screen_start_x+maxcolumns-1]:[screen_pixel_x + 2],[screen_start_y]:[screen_pixel_y] to [screen_start_x+maxcolumns-1]:[screen_pixel_x + 2],[screen_start_y+rows-1]:[screen_pixel_y]" + ui_right.screen_loc = "[screen_start_x+maxcolumns-1]:[screen_pixel_x + 2],[screen_start_y]:[screen_pixel_y] to [screen_start_x+maxcolumns-1]:[screen_pixel_x + 2],[screen_start_y]:[screen_pixel_y]" . += ui_right // Then, closer. closer.screen_loc = "[screen_start_x + maxcolumns]:[screen_pixel_x],[screen_start_y]:[screen_pixel_y]" diff --git a/code/game/objects/items.dm b/code/game/objects/items.dm index 6c16cb4060..112595cf19 100644 --- a/code/game/objects/items.dm +++ b/code/game/objects/items.dm @@ -38,7 +38,7 @@ GLOBAL_VAR_INIT(rpg_loot_items, FALSE) /// Weight class for how much storage capacity it uses and how big it physically is meaning storages can't hold it if their maximum weight class isn't as high as it. var/w_class = WEIGHT_CLASS_NORMAL /// Volume override for the item, otherwise automatically calculated from w_class. - var/volume + var/w_volume /// The amount of stamina it takes to swing an item in a normal melee attack do not lie to me and say it's for realism because it ain't. If null it will autocalculate from w_class. var/total_mass //Total mass in arbitrary pound-like values. If there's no balance reasons for an item to have otherwise, this var should be the item's weight in pounds. @@ -862,8 +862,8 @@ GLOBAL_VAR_INIT(rpg_loot_items, FALSE) return ..() /// Get an item's volume that it uses when being stored. -/obj/item/proc/get_volume() - return isnull(volume)? AUTOSCALE_VOLUME(w_class) : volume +/obj/item/proc/get_w_volume() + return isnull(volume)? AUTOSCALE_VOLUME(w_class) : w_volume /obj/item/proc/embedded(mob/living/carbon/human/embedded_mob) return From e3c6ebb81e295e08a1eac58a68733ea2ea151143 Mon Sep 17 00:00:00 2001 From: kevinz000 <2003111+kevinz000@users.noreply.github.com> Date: Thu, 9 Apr 2020 02:54:29 -0700 Subject: [PATCH 039/113] compile --- code/datums/components/storage/storage.dm | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/code/datums/components/storage/storage.dm b/code/datums/components/storage/storage.dm index 5fe5543f38..81a52770bc 100644 --- a/code/datums/components/storage/storage.dm +++ b/code/datums/components/storage/storage.dm @@ -313,7 +313,7 @@ if(!_target) _target = get_turf(parent) if(usr) - hide_from(usr) + ui_hide(usr) var/list/contents = contents() var/atom/real_location = real_location() for(var/obj/item/I in contents) @@ -328,7 +328,7 @@ close_all() /datui_um/component/storage/proc/close(mob/M) - hide_from(M) + ui_hide(M) /datum/component/storage/proc/close_all() . = FALSE @@ -375,7 +375,7 @@ /datum/component/storage/proc/refresh_mob_views() var/list/seeing = can_see_contents() for(var/i in seeing) - ui_show_to(i) + ui_show(i) return TRUE /datum/component/storage/proc/can_see_contents() @@ -472,7 +472,7 @@ A.add_fingerprint(M) if(!force && (check_locked(null, M) || !M.CanReach(parent, view_only = TRUE))) return FALSE - ui_show_to(M, !ghost) + ui_show(M, !ghost) /datum/component/storage/proc/mousedrop_receive(datum/source, atom/movable/O, mob/M) if(isitem(O)) @@ -655,7 +655,7 @@ if(A.loc == user) . = COMPONENT_NO_ATTACK_HAND if(!check_locked(source, user, TRUE)) - ui_show_to(user) + ui_show(user) A.do_jiggle() /datum/component/storage/proc/signal_on_pickup(datum/source, mob/user) @@ -674,7 +674,7 @@ return do_quick_empty(loctarget) /datum/component/storage/proc/signal_hide_attempt(datum/source, mob/target) - return hide_from(target) + return ui_hide(target) /datum/component/storage/proc/on_alt_click(datum/source, mob/user) if(!isliving(user) || !user.CanReach(parent)) From e6f98fa270b91c43a48b5f5b0e032073fb25f2be Mon Sep 17 00:00:00 2001 From: kevinz000 <2003111+kevinz000@users.noreply.github.com> Date: Thu, 9 Apr 2020 09:16:46 -0700 Subject: [PATCH 040/113] compile --- code/datums/components/storage/storage.dm | 2 +- code/datums/components/storage/ui.dm | 3 +++ code/game/atoms.dm | 5 +---- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/code/datums/components/storage/storage.dm b/code/datums/components/storage/storage.dm index 81a52770bc..fd5451e65a 100644 --- a/code/datums/components/storage/storage.dm +++ b/code/datums/components/storage/storage.dm @@ -327,7 +327,7 @@ if(check_locked()) close_all() -/datui_um/component/storage/proc/close(mob/M) +/datum/component/storage/proc/close(mob/M) ui_hide(M) /datum/component/storage/proc/close_all() diff --git a/code/datums/components/storage/ui.dm b/code/datums/components/storage/ui.dm index c062922700..a5c2a787f5 100644 --- a/code/datums/components/storage/ui.dm +++ b/code/datums/components/storage/ui.dm @@ -106,6 +106,7 @@ // define outside for marginal performance boost var/obj/item/I + var/pixel = 0 for(var/i in percentage_by_item) I = i var/percent = percentage_by_item[I] @@ -131,6 +132,8 @@ var/xshift = FLOOR(pixel / icon_size, 1) var/px = pixel % world.icon_Size B.screen_loc = I.screen_loc = "[screen_start_x + xshift]:[px + px_add],[screen_start_y+rows-1]:[screen_pixel_y]" + // add the used pixels to pixel after we place the object + pixel += pixels_to_use // finally add our things. . += B diff --git a/code/game/atoms.dm b/code/game/atoms.dm index 266d5b5bb5..44a891e24a 100644 --- a/code/game/atoms.dm +++ b/code/game/atoms.dm @@ -584,11 +584,8 @@ stoplag(1) qdel(progress) to_chat(user, "You dump as much of [src_object.parent]'s contents into [STR.insert_preposition]to [src] as you can.") - STR.orient2hud(user) - src_object.orient2hud(user) if(user.active_storage) //refresh the HUD to show the transfered contents - user.active_storage.close(user) - user.active_storage.show_to(user) + user.active_storage.ui_show(user) return TRUE /atom/proc/get_dumping_location(obj/item/storage/source,mob/user) From 857716c473da6b0156f1aa27d6268b6d87086613 Mon Sep 17 00:00:00 2001 From: kevinz000 <2003111+kevinz000@users.noreply.github.com> Date: Thu, 9 Apr 2020 09:30:28 -0700 Subject: [PATCH 041/113] k --- code/_onclick/hud/screen_objects/storage.dm | 2 +- .../components/storage/concrete/_concrete.dm | 2 +- .../components/storage/concrete/emergency.dm | 2 +- code/datums/components/storage/storage.dm | 3 --- code/datums/components/storage/ui.dm | 22 +++++++------------ code/game/objects/items.dm | 2 +- 6 files changed, 12 insertions(+), 21 deletions(-) diff --git a/code/_onclick/hud/screen_objects/storage.dm b/code/_onclick/hud/screen_objects/storage.dm index 04436a3b5a..a50554787a 100644 --- a/code/_onclick/hud/screen_objects/storage.dm +++ b/code/_onclick/hud/screen_objects/storage.dm @@ -37,7 +37,7 @@ /obj/screen/storage/close/Click() var/datum/component/storage/S = master - S.hide_from(usr) + S.ui_hide(usr) return TRUE /obj/screen/storage/left diff --git a/code/datums/components/storage/concrete/_concrete.dm b/code/datums/components/storage/concrete/_concrete.dm index 4c8f1b4c97..e044a59668 100644 --- a/code/datums/components/storage/concrete/_concrete.dm +++ b/code/datums/components/storage/concrete/_concrete.dm @@ -60,7 +60,7 @@ _contents_limbo = null if(_user_limbo) for(var/i in _user_limbo) - show_to(i) + ui_show(i) _user_limbo = null /datum/component/storage/concrete/_insert_physical_item(obj/item/I, override = FALSE) diff --git a/code/datums/components/storage/concrete/emergency.dm b/code/datums/components/storage/concrete/emergency.dm index 348821a913..faaeada13d 100644 --- a/code/datums/components/storage/concrete/emergency.dm +++ b/code/datums/components/storage/concrete/emergency.dm @@ -18,7 +18,7 @@ return . = COMPONENT_NO_ATTACK_HAND if(!check_locked(source, user, TRUE)) - show_to(user) + ui_show(user) A.do_jiggle() if(rustle_sound) playsound(A, "rustle", 50, 1, -5) diff --git a/code/datums/components/storage/storage.dm b/code/datums/components/storage/storage.dm index fd5451e65a..581798c904 100644 --- a/code/datums/components/storage/storage.dm +++ b/code/datums/components/storage/storage.dm @@ -88,9 +88,6 @@ max_volume = AUTO_SCALE_STORAGE_VOLUME(max_w_class, max_items) if(master) change_master(master) - boxes = new(null, src) - closer = new(null, src) - orient2hud() RegisterSignal(parent, COMSIG_CONTAINS_STORAGE, .proc/on_check) RegisterSignal(parent, COMSIG_IS_STORAGE_LOCKED, .proc/check_locked) diff --git a/code/datums/components/storage/ui.dm b/code/datums/components/storage/ui.dm index a5c2a787f5..a2c9e31386 100644 --- a/code/datums/components/storage/ui.dm +++ b/code/datums/components/storage/ui.dm @@ -39,9 +39,9 @@ // Then orient the actual items. var/cx = screen_start_x var/cy = screen_start_y - if(islist(numerical_display_contents)) - for(var/type in numerical_display_contents) - var/datum/numbered_display/ND = numerical_display_contents[type] + if(islist(numbered_contents)) + for(var/type in numbered_contents) + var/datum/numbered_display/ND = numbered_contents[type] ND.sample_object.mouse_opacity = MOUSE_OPACITY_OPAQUE ND.sample_object.screen_loc = "[cx]:[screen_pixel_x],[cy]:[screen_pixel_y]" ND.sample_object.maptext = "[(ND.number > 1)? "[ND.number]" : ""]" @@ -82,7 +82,7 @@ var/horizontal_pixels = maxcolumns * world.icon_size // do the check for fallback for when someone has too much gamer gear - if((MINIMUM_PIXELS_PER_ITEMS * length(contents)) > horizontal_pixels) + if((MINIMUM_PIXELS_PER_ITEM * length(contents)) > horizontal_pixels) to_chat(user, "[parent] was showed to you in legacy mode due to your items overrunning the three row limit! Consider not carrying too much or bugging a maintainer to raise this limit!") return orient2hud_legacy(user, maxcolumns) // after this point we are sure we can somehow fit all items with 8 pixels or more into our one row. @@ -94,7 +94,7 @@ var/list/volume_by_item = list() var/list/percentage_by_item = list() for(var/obj/item/I in contents) - volume = I.get_volume + volume = I.get_w_volume() used += volume volume_by_item[I] = volume percentage_by_item[I] = volume / max_volume @@ -117,20 +117,14 @@ // now that we have pixels_to_use, place our thing and add it to the returned list. - // uh oh, increment row or clamp. - if((horizontal_pixels - pixel) < pixels_to_use) - if(!pixels_to_use) - row++ - else - pixels_to_use = (horizontal_pixels - pixel) // now, scale the thing var/multiply = pixels_to_use / VOLUMETRIC_STORAGE_BOX_SIZE B.transform = matrix(multiply, 0, 0, 0, 1, 0) // unfortunately since scaling means expand-from-center.. ugh.. var/px_add = (pixels_to_use - VOLUMETRIC_STORAGE_BOX_SIZE) * 0.5 // now, screenloc the thing. - var/xshift = FLOOR(pixel / icon_size, 1) - var/px = pixel % world.icon_Size + var/xshift = FLOOR(pixel / world.icon_size, 1) + var/px = pixel % world.icon_size B.screen_loc = I.screen_loc = "[screen_start_x + xshift]:[px + px_add],[screen_start_y+rows-1]:[screen_pixel_y]" // add the used pixels to pixel after we place the object pixel += pixels_to_use @@ -215,7 +209,7 @@ */ /datum/component/storage/proc/volumetric_ui() var/atom/real_location = real_location() - return (storage_flags & STORAGE_LIMIT_VOLUME) && (length(real_location.contents) <= MAXIMUM_VOLUMETRIC_OBJECTS) && !display_numeric_stacking + return (storage_flags & STORAGE_LIMIT_VOLUME) && (length(real_location.contents) <= MAXIMUM_VOLUMETRIC_ITEMS) && !display_numerical_stacking /** * Gets the ui item objects to ui_hide. diff --git a/code/game/objects/items.dm b/code/game/objects/items.dm index 112595cf19..19ffb78e52 100644 --- a/code/game/objects/items.dm +++ b/code/game/objects/items.dm @@ -863,7 +863,7 @@ GLOBAL_VAR_INIT(rpg_loot_items, FALSE) /// Get an item's volume that it uses when being stored. /obj/item/proc/get_w_volume() - return isnull(volume)? AUTOSCALE_VOLUME(w_class) : w_volume + return isnull(volume)? AUTO_SCALE_VOLUME(w_class) : w_volume /obj/item/proc/embedded(mob/living/carbon/human/embedded_mob) return From 2e9e38cd89ba02e4a600218f0c9dfa67f27a16ae Mon Sep 17 00:00:00 2001 From: kevinz000 <2003111+kevinz000@users.noreply.github.com> Date: Thu, 9 Apr 2020 09:30:34 -0700 Subject: [PATCH 042/113] close --- code/_onclick/hud/screen_objects/storage.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/_onclick/hud/screen_objects/storage.dm b/code/_onclick/hud/screen_objects/storage.dm index a50554787a..84f8408cb0 100644 --- a/code/_onclick/hud/screen_objects/storage.dm +++ b/code/_onclick/hud/screen_objects/storage.dm @@ -37,7 +37,7 @@ /obj/screen/storage/close/Click() var/datum/component/storage/S = master - S.ui_hide(usr) + S.close(usr) return TRUE /obj/screen/storage/left From 0a67f5c6ea39b20680f9f2ff376e1911743f1fdc Mon Sep 17 00:00:00 2001 From: kevinz000 <2003111+kevinz000@users.noreply.github.com> Date: Thu, 9 Apr 2020 21:30:42 -0700 Subject: [PATCH 043/113] compile --- code/datums/components/storage/ui.dm | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/code/datums/components/storage/ui.dm b/code/datums/components/storage/ui.dm index a2c9e31386..18e9fed595 100644 --- a/code/datums/components/storage/ui.dm +++ b/code/datums/components/storage/ui.dm @@ -34,8 +34,8 @@ ui_boxes.screen_loc = "[screen_start_x]:[screen_pixel_x],[screen_start_y]:[screen_pixel_y] to [screen_start_x+columns-1]:[screen_pixel_x],[screen_start_y+rows-1]:[screen_pixel_y]" . += ui_boxes // Then, closer. - closer.screen_loc = "[screen_start_x + columns]:[screen_pixel_x],[screen_start_y]:[screen_pixel_y]" - . += ui_closer + ui_close.screen_loc = "[screen_start_x + columns]:[screen_pixel_x],[screen_start_y]:[screen_pixel_y]" + . += ui_close // Then orient the actual items. var/cx = screen_start_x var/cy = screen_start_y @@ -125,7 +125,7 @@ // now, screenloc the thing. var/xshift = FLOOR(pixel / world.icon_size, 1) var/px = pixel % world.icon_size - B.screen_loc = I.screen_loc = "[screen_start_x + xshift]:[px + px_add],[screen_start_y+rows-1]:[screen_pixel_y]" + B.screen_loc = I.screen_loc = "[screen_start_x + xshift]:[px + px_add],[screen_start_y]:[screen_pixel_y]" // add the used pixels to pixel after we place the object pixel += pixels_to_use @@ -142,8 +142,8 @@ ui_right.screen_loc = "[screen_start_x+maxcolumns-1]:[screen_pixel_x + 2],[screen_start_y]:[screen_pixel_y] to [screen_start_x+maxcolumns-1]:[screen_pixel_x + 2],[screen_start_y]:[screen_pixel_y]" . += ui_right // Then, closer. - closer.screen_loc = "[screen_start_x + maxcolumns]:[screen_pixel_x],[screen_start_y]:[screen_pixel_y]" - . += ui_closer + ui_close.screen_loc = "[screen_start_x + maxcolumns]:[screen_pixel_x],[screen_start_y]:[screen_pixel_y]" + . += ui_close /** * Shows our UI to a mob. @@ -163,7 +163,7 @@ if(M.active_storage) M.active_storage.ui_hide(M) M.active_storage = src - LAZOR(is_using, M) + LAZYOR(is_using, M) if(volumetric_ui()) //new volumetric ui bay-style M.client.screen |= orient2hud_volumetric(M, maxallowedscreensize) @@ -198,7 +198,7 @@ /datum/component/storage/proc/ui_hide(mob/M) if(!M.client) return TRUE - M.client.screen -= list(ui_boxes, ui_closer, ui_left, ui_right, ui_continuous, get_ui_item_objects_hide()) + M.client.screen -= list(ui_boxes, ui_close, ui_left, ui_right, ui_continuous, get_ui_item_objects_hide()) if(M.active_storage == src) M.active_storage = null LAZYREMOVE(is_using, M) From d149ce47a618f07d4ce54efdd4baaa324964d363 Mon Sep 17 00:00:00 2001 From: kevinz000 <2003111+kevinz000@users.noreply.github.com> Date: Thu, 9 Apr 2020 21:31:35 -0700 Subject: [PATCH 044/113] ok --- code/game/objects/items.dm | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/code/game/objects/items.dm b/code/game/objects/items.dm index 19ffb78e52..e6b9618ba3 100644 --- a/code/game/objects/items.dm +++ b/code/game/objects/items.dm @@ -863,7 +863,8 @@ GLOBAL_VAR_INIT(rpg_loot_items, FALSE) /// Get an item's volume that it uses when being stored. /obj/item/proc/get_w_volume() - return isnull(volume)? AUTO_SCALE_VOLUME(w_class) : w_volume + // if w_volume is 0 you fucked up anyways lol + return w_volume || AUTO_SCALE_VOLUME(w_class) /obj/item/proc/embedded(mob/living/carbon/human/embedded_mob) return From a559fef230784c63563e4248e6d04d207dcf99b2 Mon Sep 17 00:00:00 2001 From: kevinz000 <2003111+kevinz000@users.noreply.github.com> Date: Thu, 9 Apr 2020 22:12:39 -0700 Subject: [PATCH 045/113] runtime --- code/datums/components/storage/storage.dm | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/code/datums/components/storage/storage.dm b/code/datums/components/storage/storage.dm index 581798c904..1ee0a5f15c 100644 --- a/code/datums/components/storage/storage.dm +++ b/code/datums/components/storage/storage.dm @@ -136,7 +136,6 @@ // DO NOT USE QDEL_LIST_ASSOC. for(var/i in ui_item_blocks) qdel(ui_item_blocks[i]) //qdel the screen object not the item - ui_item_blocks.Cut() LAZYCLEARLIST(is_using) return ..() @@ -344,7 +343,6 @@ var/datum/component/storage/concrete/master = master() master.emp_act(source, severity) - //Resets something that is being removed from storage. /datum/component/storage/proc/_removal_reset(atom/movable/thing) if(!istype(thing)) @@ -356,8 +354,9 @@ /datum/component/storage/proc/_remove_and_refresh(datum/source, atom/movable/thing) _removal_reset(thing) - qdel(ui_item_blocks[thing]) - ui_item_blocks -= thing + if(LAZYACCESS(ui_item_blocks, thing)) + qdel(ui_item_blocks[thing]) + ui_item_blocks -= thing refresh_mob_views() //Call this proc to handle the removal of an item from the storage item. The item will be moved to the new_location target, if that is null it's being deleted From 00ebd842b87c22c80e0bac8ce5a64c5835e5c108 Mon Sep 17 00:00:00 2001 From: kevinz000 <2003111+kevinz000@users.noreply.github.com> Date: Thu, 9 Apr 2020 22:17:42 -0700 Subject: [PATCH 046/113] k --- code/datums/components/storage/storage.dm | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/code/datums/components/storage/storage.dm b/code/datums/components/storage/storage.dm index 1ee0a5f15c..0f98ab26cb 100644 --- a/code/datums/components/storage/storage.dm +++ b/code/datums/components/storage/storage.dm @@ -134,8 +134,10 @@ QDEL_NULL(ui_left) QDEL_NULL(ui_right) // DO NOT USE QDEL_LIST_ASSOC. - for(var/i in ui_item_blocks) - qdel(ui_item_blocks[i]) //qdel the screen object not the item + if(ui_item_blocks) + for(var/i in ui_item_blocks) + qdel(ui_item_blocks[i]) //qdel the screen object not the item + ui_item_blocks.Cut() LAZYCLEARLIST(is_using) return ..() From ffe206f3e18a725661233632da23374f14fb09ec Mon Sep 17 00:00:00 2001 From: kevinz000 <2003111+kevinz000@users.noreply.github.com> Date: Thu, 9 Apr 2020 22:33:54 -0700 Subject: [PATCH 047/113] k --- code/datums/components/storage/ui.dm | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/code/datums/components/storage/ui.dm b/code/datums/components/storage/ui.dm index 18e9fed595..f4472508b7 100644 --- a/code/datums/components/storage/ui.dm +++ b/code/datums/components/storage/ui.dm @@ -31,9 +31,11 @@ var/rows = CLAMP(CEILING(adjusted_contents / columns, 1), 1, screen_max_rows) // First, boxes. + ui_boxes = get_ui_boxes() ui_boxes.screen_loc = "[screen_start_x]:[screen_pixel_x],[screen_start_y]:[screen_pixel_y] to [screen_start_x+columns-1]:[screen_pixel_x],[screen_start_y+rows-1]:[screen_pixel_y]" . += ui_boxes // Then, closer. + ui_close = get_ui_close() ui_close.screen_loc = "[screen_start_x + columns]:[screen_pixel_x],[screen_start_y]:[screen_pixel_y]" . += ui_close // Then orient the actual items. @@ -107,6 +109,8 @@ // define outside for marginal performance boost var/obj/item/I var/pixel = 0 + + LAZYINITLIST(ui_item_blocks) for(var/i in percentage_by_item) I = i var/percent = percentage_by_item[I] @@ -134,14 +138,18 @@ . += I // Then, continuous section. + ui_continuous = get_ui_continuous() ui_continuous.screen_loc = "[screen_start_x]:[screen_pixel_x],[screen_start_y]:[screen_pixel_y] to [screen_start_x+maxcolumns-1]:[screen_pixel_x],[screen_start_y]:[screen_pixel_y]" . += ui_continuous // Then, left and right. + ui_left = get_ui_left() ui_left.screen_loc = "[screen_start_x]:[screen_pixel_x - 2],[screen_start_y]:[screen_pixel_y] to [screen_start_x]:[screen_pixel_x - 2],[screen_start_y]:[screen_pixel_y]" . += ui_left + ui_right = get_ui_right() ui_right.screen_loc = "[screen_start_x+maxcolumns-1]:[screen_pixel_x + 2],[screen_start_y]:[screen_pixel_y] to [screen_start_x+maxcolumns-1]:[screen_pixel_x + 2],[screen_start_y]:[screen_pixel_y]" . += ui_right // Then, closer. + ui_close = get_ui_close() ui_close.screen_loc = "[screen_start_x + maxcolumns]:[screen_pixel_x],[screen_start_y]:[screen_pixel_y]" . += ui_close From 9b13f009fe9c10292f331b70c08cb75feca7aea6 Mon Sep 17 00:00:00 2001 From: kevinz000 <2003111+kevinz000@users.noreply.github.com> Date: Thu, 9 Apr 2020 23:12:37 -0700 Subject: [PATCH 048/113] k --- code/__DEFINES/{layers.dm => layers_planes.dm} | 17 +++++++++++++---- code/datums/components/storage/ui.dm | 14 +++++++++++++- tgstation.dme | 2 +- 3 files changed, 27 insertions(+), 6 deletions(-) rename code/__DEFINES/{layers.dm => layers_planes.dm} (90%) diff --git a/code/__DEFINES/layers.dm b/code/__DEFINES/layers_planes.dm similarity index 90% rename from code/__DEFINES/layers.dm rename to code/__DEFINES/layers_planes.dm index 35947b320e..d0f9f8bc28 100644 --- a/code/__DEFINES/layers.dm +++ b/code/__DEFINES/layers_planes.dm @@ -129,11 +129,20 @@ #define HUD_PLANE 21 #define HUD_LAYER 21 #define HUD_RENDER_TARGET "HUD_PLANE" -#define ABOVE_HUD_PLANE 22 -#define ABOVE_HUD_LAYER 22 + +#define VOLUMETRIC_STORAGE_BOX_PLANE 23 +#define VOLUMETRIC_STORAGE_BOX_LAYER 23 +#define VOLUMETRIC_STORAGE_BOX_RENDER_TARGET "VOLUME_STORAGE_BOX_PLANE" + +#define VOLUMETRIC_STORAGE_ITEM_PLANE 24 +#define VOLUMETRIC_STORAGE_ITEM_LAYER 24 +#define VOLUMETRIC_STORAGE_ITEM_RENDER_TARGET "VOLUME_STORAGE_ITEM_PLANE" + +#define ABOVE_HUD_PLANE 25 +#define ABOVE_HUD_LAYER 25 #define ABOVE_HUD_RENDER_TARGET "ABOVE_HUD_PLANE" -#define SPLASHSCREEN_LAYER 23 -#define SPLASHSCREEN_PLANE 23 +#define SPLASHSCREEN_LAYER 30 +#define SPLASHSCREEN_PLANE 30 #define SPLASHSCREEN_RENDER_TARGET "SPLASHSCREEN_PLANE" diff --git a/code/datums/components/storage/ui.dm b/code/datums/components/storage/ui.dm index f4472508b7..89084f70e8 100644 --- a/code/datums/components/storage/ui.dm +++ b/code/datums/components/storage/ui.dm @@ -115,7 +115,7 @@ I = i var/percent = percentage_by_item[I] if(!ui_item_blocks[I]) - ui_item_blocks[I] = new /obj/screen/storage(null, src, I) + ui_item_blocks[I] = new /obj/screen/storage/volumetric_box(null, src, I) var/obj/screen/storage/volumetric_box/B = ui_item_blocks[I] var/pixels_to_use = overrun? MINIMUM_PIXELS_PER_ITEM : max(MINIMUM_PIXELS_PER_ITEM, FLOOR(horizontal_pixels * percent, MINIMUM_PIXELS_PER_ITEM)) @@ -133,6 +133,17 @@ // add the used pixels to pixel after we place the object pixel += pixels_to_use + // set various things + B.layer = VOLUMETRIC_STORAGE_BOX_LAYER + B.plane = VOLUMETRIC_STORAGE_BOX_PLANE + B.name = I.name + + + I.mouse_opacity = MOUSE_OPACITY_ICON + I.maptext = "" + I.layer = VOLUMETRIC_STORAGE_ITEM_LAYER + I.plane = VOLUMETRIC_STORAGE_ITEM_PLANE + // finally add our things. . += B . += I @@ -230,6 +241,7 @@ . = list() for(var/i in ui_item_blocks) . += ui_item_blocks[i] //get the block not the item + . += i /** * Gets our ui_boxes, making it if it doesn't exist. diff --git a/tgstation.dme b/tgstation.dme index 89a48a0344..8ba903dd86 100644 --- a/tgstation.dme +++ b/tgstation.dme @@ -57,7 +57,7 @@ #include "code\__DEFINES\is_helpers.dm" #include "code\__DEFINES\jobs.dm" #include "code\__DEFINES\language.dm" -#include "code\__DEFINES\layers.dm" +#include "code\__DEFINES\layers_planes.dm" #include "code\__DEFINES\lighting.dm" #include "code\__DEFINES\logging.dm" #include "code\__DEFINES\machines.dm" From a9e738b8b1602e728a5c621f9bcd214fde2dbc33 Mon Sep 17 00:00:00 2001 From: kevinz000 <2003111+kevinz000@users.noreply.github.com> Date: Thu, 9 Apr 2020 23:14:07 -0700 Subject: [PATCH 049/113] k --- code/datums/components/storage/ui.dm | 1 + 1 file changed, 1 insertion(+) diff --git a/code/datums/components/storage/ui.dm b/code/datums/components/storage/ui.dm index 89084f70e8..68bb12b303 100644 --- a/code/datums/components/storage/ui.dm +++ b/code/datums/components/storage/ui.dm @@ -220,6 +220,7 @@ M.client.screen -= list(ui_boxes, ui_close, ui_left, ui_right, ui_continuous, get_ui_item_objects_hide()) if(M.active_storage == src) M.active_storage = null + UnregisterSignal(M, COMSIG_MOB_CLIENT_LOGOUT) LAZYREMOVE(is_using, M) return TRUE From be398004b792fc669f4f675dec08d852d716bb3f Mon Sep 17 00:00:00 2001 From: kevinz000 <2003111+kevinz000@users.noreply.github.com> Date: Fri, 10 Apr 2020 00:16:43 -0700 Subject: [PATCH 050/113] groan --- code/datums/components/storage/ui.dm | 16 ++++++++++------ icons/mob/screen_gen.dmi | Bin 118971 -> 119011 bytes 2 files changed, 10 insertions(+), 6 deletions(-) diff --git a/code/datums/components/storage/ui.dm b/code/datums/components/storage/ui.dm index 68bb12b303..b904d44392 100644 --- a/code/datums/components/storage/ui.dm +++ b/code/datums/components/storage/ui.dm @@ -100,6 +100,7 @@ used += volume volume_by_item[I] = volume percentage_by_item[I] = volume / max_volume + to_chat(world, "DEBUG: [I] volume [volume] percent [percentage_by_item[I]]") var/overrun = FALSE if(used >= (horizontal_pixels + 4)) //2-4 pixel grace zone // congratulations we are now in overrun mode. everything will be crammed to minimum storage pixels. @@ -108,7 +109,8 @@ // define outside for marginal performance boost var/obj/item/I - var/pixel = 0 + // start at this pixel from screen_start_x. + var/pixel = -((world.icon_size - VOLUMETRIC_BOX_SIZE) * 0.5) LAZYINITLIST(ui_item_blocks) for(var/i in percentage_by_item) @@ -118,12 +120,14 @@ ui_item_blocks[I] = new /obj/screen/storage/volumetric_box(null, src, I) var/obj/screen/storage/volumetric_box/B = ui_item_blocks[I] var/pixels_to_use = overrun? MINIMUM_PIXELS_PER_ITEM : max(MINIMUM_PIXELS_PER_ITEM, FLOOR(horizontal_pixels * percent, MINIMUM_PIXELS_PER_ITEM)) + to_chat(world, "DEBUG: [I] using [pixels_to_use] pixels out of [horizontal_pixels]") // now that we have pixels_to_use, place our thing and add it to the returned list. // now, scale the thing var/multiply = pixels_to_use / VOLUMETRIC_STORAGE_BOX_SIZE B.transform = matrix(multiply, 0, 0, 0, 1, 0) + // unfortunately since scaling means expand-from-center.. ugh.. var/px_add = (pixels_to_use - VOLUMETRIC_STORAGE_BOX_SIZE) * 0.5 // now, screenloc the thing. @@ -138,7 +142,6 @@ B.plane = VOLUMETRIC_STORAGE_BOX_PLANE B.name = I.name - I.mouse_opacity = MOUSE_OPACITY_ICON I.maptext = "" I.layer = VOLUMETRIC_STORAGE_ITEM_LAYER @@ -178,7 +181,7 @@ else if(current_maxscreensize) maxallowedscreensize = current_maxscreensize // we got screen size, register signal - RegisterSignal(M, COMSIG_MOB_CLIENT_LOGOUT, .proc/on_logout) + RegisterSignal(M, COMSIG_MOB_CLIENT_LOGOUT, .proc/on_logout, override = TRUE) if(M.active_storage) M.active_storage.ui_hide(M) M.active_storage = src @@ -217,10 +220,10 @@ /datum/component/storage/proc/ui_hide(mob/M) if(!M.client) return TRUE - M.client.screen -= list(ui_boxes, ui_close, ui_left, ui_right, ui_continuous, get_ui_item_objects_hide()) + UnregisterSignal(M, COMSIG_MOB_CLIENT_LOGOUT) + M.client.screen -= list(ui_boxes, ui_close, ui_left, ui_right, ui_continuous) + get_ui_item_objects_hide() if(M.active_storage == src) M.active_storage = null - UnregisterSignal(M, COMSIG_MOB_CLIENT_LOGOUT) LAZYREMOVE(is_using, M) return TRUE @@ -241,7 +244,8 @@ else . = list() for(var/i in ui_item_blocks) - . += ui_item_blocks[i] //get the block not the item + // get both the box and the item + . += ui_item_blocks[i] . += i /** diff --git a/icons/mob/screen_gen.dmi b/icons/mob/screen_gen.dmi index ffbffcab0dd1b8c809830e4544b548ad075c5ae5..d00d0b079c8b1ea8d1409111656a000ad6aca300 100644 GIT binary patch delta 6784 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 delta 6743 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 Date: Fri, 10 Apr 2020 00:21:40 -0700 Subject: [PATCH 051/113] k --- code/datums/components/storage/ui.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/datums/components/storage/ui.dm b/code/datums/components/storage/ui.dm index b904d44392..ce1db703c5 100644 --- a/code/datums/components/storage/ui.dm +++ b/code/datums/components/storage/ui.dm @@ -110,7 +110,7 @@ // define outside for marginal performance boost var/obj/item/I // start at this pixel from screen_start_x. - var/pixel = -((world.icon_size - VOLUMETRIC_BOX_SIZE) * 0.5) + var/pixel = -((world.icon_size - VOLUMETRIC_STORAGE_BOX_SIZE) * 0.5) LAZYINITLIST(ui_item_blocks) for(var/i in percentage_by_item) From e2440034f58be3c48ccf2f6d66351983456deaf1 Mon Sep 17 00:00:00 2001 From: kevinz000 <2003111+kevinz000@users.noreply.github.com> Date: Fri, 10 Apr 2020 01:07:53 -0700 Subject: [PATCH 052/113] matrices.. --- code/__DEFINES/storage.dm | 10 +++--- code/_onclick/hud/screen_objects/storage.dm | 34 ++++++++++++++++++++- code/datums/components/storage/storage.dm | 8 +++-- code/datums/components/storage/ui.dm | 20 ++++-------- 4 files changed, 49 insertions(+), 23 deletions(-) diff --git a/code/__DEFINES/storage.dm b/code/__DEFINES/storage.dm index 56fa599dc3..3ec3e06961 100644 --- a/code/__DEFINES/storage.dm +++ b/code/__DEFINES/storage.dm @@ -23,14 +23,12 @@ #define WEIGHT_CLASS_GIGANTIC 6 /// Macro for automatically getting the volume of an item from its w_class. -#define AUTO_SCALE_VOLUME(w_class) (w_class ** 2) -/// Macro for automatically getting the volume of a storage item from its max_w_class and max_items. -#define AUTO_SCALE_STORAGE_VOLUME(w_class, max_items) (AUTO_SCALE_VOLUME(w_class) * max_items) +#define AUTO_SCALE_VOLUME(w_class) (2 ** w_class) +/// Macro for automatically getting the volume of a storage item from its max_w_class and max_combined_w_class. +#define AUTO_SCALE_STORAGE_VOLUME(w_class, max_combined_w_class) (AUTO_SCALE_VOLUME(w_class) * (max_combined_w_class / w_class)) // UI defines /// Minimum pixels an item must have in volumetric scaled storage UI -#define MINIMUM_PIXELS_PER_ITEM 4 -/// The size of the volumetric scaled storage UI's volumetric boxes that's rendered behind items. -#define VOLUMETRIC_STORAGE_BOX_SIZE 8 +#define MINIMUM_PIXELS_PER_ITEM 2 /// Maximum number of objects that will be allowed to be displayed using the volumetric display system. Arbitrary number to prevent server lockups. #define MAXIMUM_VOLUMETRIC_ITEMS 256 diff --git a/code/_onclick/hud/screen_objects/storage.dm b/code/_onclick/hud/screen_objects/storage.dm index 84f8408cb0..627893df1f 100644 --- a/code/_onclick/hud/screen_objects/storage.dm +++ b/code/_onclick/hud/screen_objects/storage.dm @@ -42,20 +42,52 @@ /obj/screen/storage/left icon_state = "storage_start" + insertion_click = TRUE /obj/screen/storage/right icon_state = "storage_end" + insertion_click = TRUE /obj/screen/storage/continuous icon_state = "storage_continue" + insertion_click = TRUE /obj/screen/storage/volumetric_box - icon_state = "stored_8px" + icon_state = "stored_continue" var/obj/item/our_item + var/obj/screen/storage/stored_left/left + var/obj/screen/storage/stored_right/right + +/obj/screen/storage/volumetric_box/Destroy() + QDEL_NULL(left) + QDEL_NULL(right) + our_item = null + return ..() /obj/screen/storage/volumetric_box/Initialize(mapload, new_master, our_item) src.our_item = our_item + left = new(null, src, our_item) + right = new(null, src, our_item) return ..() /obj/screen/storage/volumetric_box/Click(location, control, params) return our_item.Click(location, control, params) + +/obj/screen/storage/volumetric_box/proc/on_screen_objects() + return list(src, left, right) + +/obj/screen/storage/volumetric_box/proc/set_pixel_size(pixels) + cut_overlays() + //our icon size is 32 pixels. + transform = matrix(32 / pixels, 0, 0, 0, 1, 0) + left.pixel_x = -(pixels * 0.5) - 4 + right.pixel_x = (pixels * 0.5) + 4 + add_overlay(left) + add_overlay(right) + pixel_x = (pixels - 32) * 0.5 + +/obj/screen/storage/stored_left + icon_state = "stored_start" + +/obj/screen/storage/stored_right + icon_state = "stored_end" diff --git a/code/datums/components/storage/storage.dm b/code/datums/components/storage/storage.dm index 0f98ab26cb..25646598d3 100644 --- a/code/datums/components/storage/storage.dm +++ b/code/datums/components/storage/storage.dm @@ -84,8 +84,6 @@ /datum/component/storage/Initialize(datum/component/storage/concrete/master) if(!isatom(parent)) return COMPONENT_INCOMPATIBLE - if(isnull(max_volume)) - max_volume = AUTO_SCALE_STORAGE_VOLUME(max_w_class, max_items) if(master) change_master(master) @@ -714,3 +712,9 @@ to_chat(user, "[parent] now picks up all items in a tile at once.") if(COLLECT_ONE) to_chat(user, "[parent] now picks up one item at a time.") + +/** + * Gets our max volume + */ +/datum/component/storage/proc/get_max_volume() + return max_volume || AUTO_SCALE_STORAGE_VOLUME(max_w_class, max_combined_w_class) diff --git a/code/datums/components/storage/ui.dm b/code/datums/components/storage/ui.dm index ce1db703c5..da3094a2c9 100644 --- a/code/datums/components/storage/ui.dm +++ b/code/datums/components/storage/ui.dm @@ -99,7 +99,7 @@ volume = I.get_w_volume() used += volume volume_by_item[I] = volume - percentage_by_item[I] = volume / max_volume + percentage_by_item[I] = volume / get_max_volume() to_chat(world, "DEBUG: [I] volume [volume] percent [percentage_by_item[I]]") var/overrun = FALSE if(used >= (horizontal_pixels + 4)) //2-4 pixel grace zone @@ -110,7 +110,7 @@ // define outside for marginal performance boost var/obj/item/I // start at this pixel from screen_start_x. - var/pixel = -((world.icon_size - VOLUMETRIC_STORAGE_BOX_SIZE) * 0.5) + var/current_pixel = 0 LAZYINITLIST(ui_item_blocks) for(var/i in percentage_by_item) @@ -124,20 +124,12 @@ // now that we have pixels_to_use, place our thing and add it to the returned list. - // now, scale the thing - var/multiply = pixels_to_use / VOLUMETRIC_STORAGE_BOX_SIZE - B.transform = matrix(multiply, 0, 0, 0, 1, 0) - - // unfortunately since scaling means expand-from-center.. ugh.. - var/px_add = (pixels_to_use - VOLUMETRIC_STORAGE_BOX_SIZE) * 0.5 - // now, screenloc the thing. - var/xshift = FLOOR(pixel / world.icon_size, 1) - var/px = pixel % world.icon_size - B.screen_loc = I.screen_loc = "[screen_start_x + xshift]:[px + px_add],[screen_start_y]:[screen_pixel_y]" + B.screen_loc = I.screen_loc = "[screen_start_x]:[current_pixel],[screen_start_y]:[screen_pixel_y]" // add the used pixels to pixel after we place the object - pixel += pixels_to_use + current_pixel += pixels_to_use // set various things + B.set_pixel_size(pixels_to_use) B.layer = VOLUMETRIC_STORAGE_BOX_LAYER B.plane = VOLUMETRIC_STORAGE_BOX_PLANE B.name = I.name @@ -148,7 +140,7 @@ I.plane = VOLUMETRIC_STORAGE_ITEM_PLANE // finally add our things. - . += B + . += B.on_screen_objects() . += I // Then, continuous section. From 36cd3b4c3540ea7692dc5c7afc45028374b21630 Mon Sep 17 00:00:00 2001 From: kevinz000 <2003111+kevinz000@users.noreply.github.com> Date: Fri, 10 Apr 2020 01:23:36 -0700 Subject: [PATCH 053/113] i should have just ported from baystation instead of reinventing the fricking wheel --- code/_onclick/hud/screen_objects/storage.dm | 9 +++++---- code/datums/components/storage/ui.dm | 8 ++++---- 2 files changed, 9 insertions(+), 8 deletions(-) diff --git a/code/_onclick/hud/screen_objects/storage.dm b/code/_onclick/hud/screen_objects/storage.dm index 627893df1f..bf560841bb 100644 --- a/code/_onclick/hud/screen_objects/storage.dm +++ b/code/_onclick/hud/screen_objects/storage.dm @@ -76,15 +76,16 @@ /obj/screen/storage/volumetric_box/proc/on_screen_objects() return list(src, left, right) +#define BOX_ICON_PIXELS 32 /obj/screen/storage/volumetric_box/proc/set_pixel_size(pixels) cut_overlays() //our icon size is 32 pixels. - transform = matrix(32 / pixels, 0, 0, 0, 1, 0) - left.pixel_x = -(pixels * 0.5) - 4 - right.pixel_x = (pixels * 0.5) + 4 + transform = matrix(pixels / BOX_ICON_PIXELS, 0, 0, 0, 1, 0) + left.pixel_x = -((BOX_ICON_PIXELS - pixels) * 0.5) - 4 + right.pixel_x = ((BOX_ICON_PIXELS - pixels) * 0.5) + 4 add_overlay(left) add_overlay(right) - pixel_x = (pixels - 32) * 0.5 +#undef BOX_ICON_PIXELS /obj/screen/storage/stored_left icon_state = "stored_start" diff --git a/code/datums/components/storage/ui.dm b/code/datums/components/storage/ui.dm index da3094a2c9..0d606a2f84 100644 --- a/code/datums/components/storage/ui.dm +++ b/code/datums/components/storage/ui.dm @@ -124,7 +124,7 @@ // now that we have pixels_to_use, place our thing and add it to the returned list. - B.screen_loc = I.screen_loc = "[screen_start_x]:[current_pixel],[screen_start_y]:[screen_pixel_y]" + B.screen_loc = I.screen_loc = "[screen_start_x]:[current_pixel + (pixels_to_use * 0.5)],[screen_start_y]:[screen_pixel_y]" // add the used pixels to pixel after we place the object current_pixel += pixels_to_use @@ -149,14 +149,14 @@ . += ui_continuous // Then, left and right. ui_left = get_ui_left() - ui_left.screen_loc = "[screen_start_x]:[screen_pixel_x - 2],[screen_start_y]:[screen_pixel_y] to [screen_start_x]:[screen_pixel_x - 2],[screen_start_y]:[screen_pixel_y]" + ui_left.screen_loc = "[screen_start_x]:[screen_pixel_x - 2],[screen_start_y]:[screen_pixel_y]" . += ui_left ui_right = get_ui_right() - ui_right.screen_loc = "[screen_start_x+maxcolumns-1]:[screen_pixel_x + 2],[screen_start_y]:[screen_pixel_y] to [screen_start_x+maxcolumns-1]:[screen_pixel_x + 2],[screen_start_y]:[screen_pixel_y]" + ui_right.screen_loc = "[screen_start_x + maxcolumns]:[screen_pixel_x],[screen_start_y]:[screen_pixel_y]" . += ui_right // Then, closer. ui_close = get_ui_close() - ui_close.screen_loc = "[screen_start_x + maxcolumns]:[screen_pixel_x],[screen_start_y]:[screen_pixel_y]" + ui_close.screen_loc = "[screen_start_x + maxcolumns]:[screen_pixel_x + 2],[screen_start_y]:[screen_pixel_y]" . += ui_close /** From 165379c0b8062a010d3eb4981c74155f7dc73d0e Mon Sep 17 00:00:00 2001 From: kevinz000 <2003111+kevinz000@users.noreply.github.com> Date: Fri, 10 Apr 2020 02:19:19 -0700 Subject: [PATCH 054/113] storage --- code/__DEFINES/storage.dm | 17 ++++++-- code/_onclick/hud/screen_objects/storage.dm | 46 ++++++++++++-------- code/datums/components/storage/storage.dm | 45 ++++++++++++------- icons/mob/screen_gen.dmi | Bin 119011 -> 119019 bytes 4 files changed, 71 insertions(+), 37 deletions(-) diff --git a/code/__DEFINES/storage.dm b/code/__DEFINES/storage.dm index 3ec3e06961..bdcb638666 100644 --- a/code/__DEFINES/storage.dm +++ b/code/__DEFINES/storage.dm @@ -1,12 +1,17 @@ // storage_flags variable on /datum/component/storage -// Storage limits. These can be combined I guess but you really, really shouldn't (don't do it really) +// Storage limits. These can be combined (and usually are combined). /// Check max_items and contents.len when trying to insert #define STORAGE_LIMIT_MAX_ITEMS (1<<0) -/// Check w_class and max_combined_w_class, aka legacy behavior if you combine it with [STORAGE_LIMIT_MAX_ITEMS]. +/// Check max_combined_w_class. #define STORAGE_LIMIT_COMBINED_W_CLASS (1<<1) -/// Use max_w_class for maximum w_class but use the new volume system. Will automatically force rendering to use the new volume/baystation scaling UI so this is kind of incompatible with stuff like stack storage etc etc. +/// Use the new volume system. Will automatically force rendering to use the new volume/baystation scaling UI so this is kind of incompatible with stuff like stack storage etc etc. #define STORAGE_LIMIT_VOLUME (1<<2) +/// Use max_w_class +#define STORAGE_LIMIT_MAX_W_CLASS (1<<3) + +#define STORAGE_FLAGS_LEGACY_DEFAULT (STORAGE_LIMIT_MAX_ITEMS | STORAGE_LIMIT_COMBINED_W_CLASS | STORAGE_LIMIT_MAX_W_CLASS) +#define STORAGE_FLAGS_VOLUME_DEFAULT (STORAGE_LIMIT_MAX_ITEMS | STORAGE_LIMIT_VOLUME | STORAGE_LIMIT_MAX_W_CLASS) //ITEM INVENTORY WEIGHT, FOR w_class /// Usually items smaller then a human hand, ex: Playing Cards, Lighter, Scalpel, Coins/Money @@ -28,7 +33,11 @@ #define AUTO_SCALE_STORAGE_VOLUME(w_class, max_combined_w_class) (AUTO_SCALE_VOLUME(w_class) * (max_combined_w_class / w_class)) // UI defines +/// Size of volumetric box icon +#define VOLUMETRIC_STORAGE_BOX_ICON_SIZE 32 +/// Size of EACH left/right border icon for volumetric boxes +#define VOLUMETRIC_STORAGE_BOX_BORDER_SIZE 1 /// Minimum pixels an item must have in volumetric scaled storage UI -#define MINIMUM_PIXELS_PER_ITEM 2 +#define MINIMUM_PIXELS_PER_ITEM 6 /// Maximum number of objects that will be allowed to be displayed using the volumetric display system. Arbitrary number to prevent server lockups. #define MAXIMUM_VOLUMETRIC_ITEMS 256 diff --git a/code/_onclick/hud/screen_objects/storage.dm b/code/_onclick/hud/screen_objects/storage.dm index bf560841bb..5b73d8721a 100644 --- a/code/_onclick/hud/screen_objects/storage.dm +++ b/code/_onclick/hud/screen_objects/storage.dm @@ -55,40 +55,52 @@ /obj/screen/storage/volumetric_box icon_state = "stored_continue" var/obj/item/our_item - var/obj/screen/storage/stored_left/left - var/obj/screen/storage/stored_right/right - -/obj/screen/storage/volumetric_box/Destroy() - QDEL_NULL(left) - QDEL_NULL(right) - our_item = null - return ..() /obj/screen/storage/volumetric_box/Initialize(mapload, new_master, our_item) src.our_item = our_item - left = new(null, src, our_item) - right = new(null, src, our_item) + return ..() + +/obj/screen/storage/volumetric_box/Destroy() + our_item = null return ..() /obj/screen/storage/volumetric_box/Click(location, control, params) return our_item.Click(location, control, params) -/obj/screen/storage/volumetric_box/proc/on_screen_objects() +/obj/screen/storage/volumetric_box/center + icon_state = "stored_continue" + var/obj/screen/storage/stored_left/left + var/obj/screen/storage/stored_right/right + +/obj/screen/storage/volumetric_box/center/Initialize(mapload, new_master, our_item) + left = new(null, src, our_item) + right = new(null, src, our_item) + return ..() + +/obj/screen/storage/volumetric_box/center/Destroy() + QDEL_NULL(lefT) + QDEL_NULL(right) + return ..() + +/obj/screen/storage/volumetric_box/center/proc/on_screen_objects() return list(src, left, right) -#define BOX_ICON_PIXELS 32 -/obj/screen/storage/volumetric_box/proc/set_pixel_size(pixels) +/** + * Sets the size of this box screen object and regenerates its left/right borders. This includes the actual border's size! + */ +/obj/screen/storage/volumetric_box/center/proc/set_pixel_size(pixels) cut_overlays() //our icon size is 32 pixels. - transform = matrix(pixels / BOX_ICON_PIXELS, 0, 0, 0, 1, 0) - left.pixel_x = -((BOX_ICON_PIXELS - pixels) * 0.5) - 4 - right.pixel_x = ((BOX_ICON_PIXELS - pixels) * 0.5) + 4 + transform = matrix((pixels - (VOLUMETRIC_STORAGE_BOX_BORDER_SIZE * 2)) / VOLUMETRIC_STORAGE_BOX_ICON_SIZE, 0, 0, 0, 1, 0) + left.pixel_x = -((pixels - VOLUMETRIC_STORAGE_BOX_ICON_SIZE) * 0.5) - VOLUMETRIC_STORAGE_BOX_BORDER_SIZE + right.pixel_x = ((pixels - VOLUMETRIC_STORAGE_BOX_ICON_SIZE) * 0.5) + VOLUMETRIC_STORAGE_BOX_BORDER_SIZE add_overlay(left) add_overlay(right) -#undef BOX_ICON_PIXELS /obj/screen/storage/stored_left icon_state = "stored_start" + appearance_flags = APPEARANCE_UI | KEEP_APART | RESET_TRANSFORM // Yes I know RESET_TRANSFORM is in APPEARANCE_UI but we're hard-asserting this incase someone changes it. /obj/screen/storage/stored_right icon_state = "stored_end" + appearance_flags = APPEARANCE_UI | KEEP_APART | RESET_TRANSFORM diff --git a/code/datums/components/storage/storage.dm b/code/datums/components/storage/storage.dm index 25646598d3..7cf820239c 100644 --- a/code/datums/components/storage/storage.dm +++ b/code/datums/components/storage/storage.dm @@ -22,7 +22,7 @@ var/locked = FALSE //when locked nothing can see inside or use it. /// Storage flags, including what kinds of limiters we use for how many items we can hold - var/storage_flags = STORAGE_LIMIT_VOLUME + var/storage_flags = STORAGE_FLAGS_VOLUME_DEFAULT /// Max w_class we can hold. Applies to [STORAGE_LIMIT_COMBINED_W_CLASS] and [STORAGE_LIMIT_VOLUME] var/max_w_class = WEIGHT_CLASS_SMALL /// Max combined w_class. Applies to [STORAGE_LIMIT_COMBINED_W_CLASS] @@ -496,10 +496,6 @@ if(M && !stop_messages) host.add_fingerprint(M) return FALSE - if(real_location.contents.len >= max_items) - if(!stop_messages) - to_chat(M, "[host] is full, make some space!") - return FALSE //Storage item is full if(length(can_hold)) if(!is_type_in_typecache(I, can_hold)) if(!stop_messages) @@ -509,17 +505,34 @@ if(!stop_messages) to_chat(M, "[host] cannot hold [I]!") return FALSE - if(I.w_class > max_w_class) - if(!stop_messages) - to_chat(M, "[I] is too big for [host]!") - return FALSE - var/sum_w_class = I.w_class - for(var/obj/item/_I in real_location) - sum_w_class += _I.w_class //Adds up the combined w_classes which will be in the storage item if the item is added to it. - if(sum_w_class > max_combined_w_class) - if(!stop_messages) - to_chat(M, "[I] won't fit in [host], make some space!") - return FALSE + // STORAGE LIMITS + if(storage_flags & STORAGE_LIMIT_MAX_ITEMS) + if(real_location.contents.len >= max_items) + if(!stop_messages) + to_chat(M, "[host] has too many things in it, make some space!") + return FALSE //Storage item is full + if(storage_flags & STORAGE_LIMIT_MAX_W_CLASS) + if(I.w_class > max_w_class) + if(!stop_messages) + to_chat(M, "[I] is too long for [host]!") + return FALSE + if(storage_flags & STORAGE_LIMIT_COMBINED_W_CLASS) + var/sum_w_class = I.w_class + for(var/obj/item/_I in real_location) + sum_w_class += _I.w_class //Adds up the combined w_classes which will be in the storage item if the item is added to it. + if(sum_w_class > max_combined_w_class) + if(!stop_messages) + to_chat(M, "[I] won't fit in [host], make some space!") + return FALSE + if(storage_flags & STORAGE_LIMIT_VOLUME) + var/sum_volume = I.get_w_volume() + for(var/obj/item/_I in real_location) + sum_volume += _I.get_w_volume() + if(sum_volume > get_max_volume()) + if(!stop_messages) + to_chat(M, "[I] is too spacious to fit in [host], make some space!") + return FALSE + ///////////////// if(isitem(host)) var/obj/item/IP = host var/datum/component/storage/STR_I = I.GetComponent(/datum/component/storage) diff --git a/icons/mob/screen_gen.dmi b/icons/mob/screen_gen.dmi index d00d0b079c8b1ea8d1409111656a000ad6aca300..60c413c372a7e495568a68b51cdbab64048acd42 100644 GIT binary patch delta 6455 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 N)p0wE(xaX?{txxuil+bo delta 6447 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

Body

" - dat += "Gender:[gender == MALE ? "Male" : (gender == FEMALE ? "Female" : (gender == PLURAL ? "Non-binary" : "Object"))]
" + dat += "Gender:[gender == MALE ? "Male" : (gender == FEMALE ? "Female" : (gender == PLURAL ? "Non-binary" : "Object"))]
" if(gender != NEUTER && pref_species.sexes) dat += "Body Model:[features["body_model"] == MALE ? "Masculine" : "Feminine"]
" dat += "Species:[pref_species.name]
" @@ -381,7 +381,7 @@ GLOBAL_LIST_EMPTY(preferences_datums) mutant_colors = TRUE if (CONFIG_GET(number/body_size_min) != CONFIG_GET(number/body_size_max)) - dat += "Sprite Size: [features["body_size"]]%
" + dat += "Sprite Size: [features["body_size"]]%
" if((EYECOLOR in pref_species.species_traits) && !(NOEYES in pref_species.species_traits)) @@ -2123,6 +2123,38 @@ GLOBAL_LIST_EMPTY(preferences_datums) if(new_toggle_color) hud_toggle_color = new_toggle_color + if("gender") + var/chosengender = input(user, "Select your character's gender.", "Gender Selection", gender) as null|anything in list(MALE,FEMALE,"nonbinary","object") + if(!chosengender) + return + switch(chosengender) + if("nonbinary") + chosengender = PLURAL + features["body_model"] = pick(MALE, FEMALE) + if("object") + chosengender = NEUTER + features["body_model"] = MALE + else + features["body_model"] = chosengender + gender = chosengender + facial_hair_style = random_facial_hair_style(gender) + hair_style = random_hair_style(gender) + + if("body_size") + var/min = CONFIG_GET(number/body_size_min) + var/max = CONFIG_GET(number/body_size_max) + var/danger = CONFIG_GET(number/threshold_body_size_slowdown) + var/new_body_size = input(user, "Choose your desired sprite size:\n([min*100]%-[max*100]%), Warning: May make your character look distorted[danger > min ? ", and an exponential slowdown will occur for those smaller than [danger*100]%!" : "!"]", "Character Preference", features["body_size"]*100) as num|null + if (new_body_size) + new_body_size = CLAMP(new_body_size * 0.01, min, max) + var/dorfy + if(danger > new_body_size) + dorfy = alert(user, "The chosen size appears to be smaller than the threshold of [danger*100]%, which will lead to an added exponential slowdown. Are you sure about that?", "Dwarfism Alert", "Yes", "Move it to the threshold", "No") + if(!dorfy || dorfy == "Move it above the threshold") + new_body_size = danger + if(dorfy != "No") + features["body_size"] = new_body_size + else switch(href_list["preference"]) //CITADEL PREFERENCES EDIT - I can't figure out how to modularize these, so they have to go here. :c -Pooj @@ -2175,41 +2207,10 @@ GLOBAL_LIST_EMPTY(preferences_datums) if("publicity") if(unlock_content) toggles ^= MEMBER_PUBLIC - if("gender") - var/chosengender = input(user, "Select your character's gender.", "Gender Selection", gender) as null|anything in list(MALE,FEMALE,"nonbinary","object") - if(!chosengender) - return - switch(chosengender) - if("nonbinary") - chosengender = PLURAL - features["body_model"] = pick(MALE, FEMALE) - if("object") - chosengender = NEUTER - features["body_model"] = MALE - else - features["body_model"] = chosengender - gender = chosengender - facial_hair_style = random_facial_hair_style(gender) - hair_style = random_hair_style(gender) if("body_model") features["body_model"] = features["body_model"] == MALE ? FEMALE : MALE - if("bodysize") - var/min = CONFIG_GET(number/body_size_min) - var/max = CONFIG_GET(number/body_size_max) - var/danger = CONFIG_GET(number/threshold_body_size_slowdown) - var/new_bodysize = input(user, "Choose your desired sprite size:\n([min*100]%-[max*100]%), Warning: May make your character look distorted[danger > min ? ", and an exponential slowdown will occur for those smaller than [danger*100]%!" : "!"]", "Character Preference", features["body_size"]*100) as num|null - if (new_bodysize) - new_bodysize = CLAMP(new_bodysize * 0.01, min, max) - var/dorfy - if(danger > new_bodysize) - dorfy = alert(user, "The chosen size appears to be smaller than the threshold of [danger*100]%, which will lead to an added exponential slowdown. Are you sure about that?", "Dwarfism Alert", "Yes", "Move it to the threshold", "No") - if(!dorfy || dorfy == "Move it above the threshold") - new_bodysize = danger - if(dorfy != "No") - features["body_size"] = new_bodysize - if("hotkeys") hotkeys = !hotkeys if(hotkeys) From 6f8992e71234568f10cdeefd3b18b922cf1f7054 Mon Sep 17 00:00:00 2001 From: kiwedespars <47008095+kiwedespars@users.noreply.github.com> Date: Sat, 11 Apr 2020 21:34:06 -0700 Subject: [PATCH 070/113] Update haste.dm --- code/modules/antagonists/bloodsucker/powers/haste.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/antagonists/bloodsucker/powers/haste.dm b/code/modules/antagonists/bloodsucker/powers/haste.dm index 143950b32f..05e2cd0330 100644 --- a/code/modules/antagonists/bloodsucker/powers/haste.dm +++ b/code/modules/antagonists/bloodsucker/powers/haste.dm @@ -8,7 +8,7 @@ desc = "Dash somewhere with supernatural speed. Those nearby may be knocked away, stunned, or left empty-handed." button_icon_state = "power_speed" bloodcost = 6 - cooldown = 50 + cooldown = 120 target_range = 15 power_activates_immediately = TRUE message_Trigger = ""//"Whom will you subvert to your will?" From 501b4f0e3e2dbd5ece6eca9fc60c68b725c49728 Mon Sep 17 00:00:00 2001 From: Ghom <42542238+Ghommie@users.noreply.github.com> Date: Sun, 12 Apr 2020 06:42:08 +0200 Subject: [PATCH 071/113] Update watercloset.dm --- code/game/objects/structures/watercloset.dm | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/code/game/objects/structures/watercloset.dm b/code/game/objects/structures/watercloset.dm index 892d85cd6e..0ffbb9f3ea 100644 --- a/code/game/objects/structures/watercloset.dm +++ b/code/game/objects/structures/watercloset.dm @@ -64,7 +64,7 @@ else I.forceMove(drop_location()) to_chat(user, "You find [I] in the cistern.") - w_items -= I.w_class + w_items = max(w_items - I.w_class, 0) else open = !open update_icon() @@ -115,6 +115,12 @@ secret.desc += "" //In case you want to add something to the item that spawns contents += secret +/obj/structure/toilet/secret/LateInitialize() + . = ..() + w_items = 0 //recalculate total weight thanks to the secret. + for(var/item/I in contents) + w_items += I.w_class + /obj/structure/toilet/secret/low_loot secret_type = /obj/effect/spawner/lootdrop/low_loot_toilet From 23b45c9cf3bbee22d00bb6681ba044bec543cfca Mon Sep 17 00:00:00 2001 From: Ghom <42542238+Ghommie@users.noreply.github.com> Date: Sun, 12 Apr 2020 06:54:40 +0200 Subject: [PATCH 072/113] Update lootdrop.dm --- .../game/objects/effects/spawners/lootdrop.dm | 61 +++++++++++++------ 1 file changed, 43 insertions(+), 18 deletions(-) diff --git a/code/game/objects/effects/spawners/lootdrop.dm b/code/game/objects/effects/spawners/lootdrop.dm index d79fba7172..cef0b86c34 100644 --- a/code/game/objects/effects/spawners/lootdrop.dm +++ b/code/game/objects/effects/spawners/lootdrop.dm @@ -2,6 +2,7 @@ icon = 'icons/effects/landmarks_static.dmi' icon_state = "random_loot" layer = OBJ_LAYER + var/spawn_on_turf = TRUE var/lootcount = 1 //how many items will be spawned var/lootdoubles = TRUE //if the same item can be spawned twice var/list/loot //a list of possible items to spawn e.g. list(/obj/item, /obj/structure, /obj/effect) @@ -10,7 +11,7 @@ /obj/effect/spawner/lootdrop/Initialize(mapload) ..() if(loot && loot.len) - var/turf/T = get_turf(src) + var/atom/A = spawn_on_turf ? get_turf(src) : loc var/loot_spawned = 0 while((lootcount-loot_spawned) && loot.len) var/lootspawn = pickweight(loot) @@ -18,7 +19,7 @@ loot.Remove(lootspawn) if(lootspawn) - var/atom/movable/spawned_loot = new lootspawn(T) + var/atom/movable/spawned_loot = new lootspawn(A) if (!fan_out_items) if (pixel_x != 0) spawned_loot.pixel_x = pixel_x @@ -449,6 +450,7 @@ /obj/effect/spawner/lootdrop/low_loot_toilet name = "random low toilet spawner" lootcount = 1 + spawn_on_turf = FALSE //Note this is out of a 100 - Meaning the number you see is also the percent its going to pick that //This is ment for "low" loot that anyone could fine in a toilet, for better gear use high loot toilet loot = list("" = 30, @@ -458,41 +460,42 @@ /obj/item/clothing/glasses/sunglasses/blindfold = 4, /obj/item/clothing/glasses/sunglasses = 1, /obj/item/toy/plush/random = 5, - /obj/effect/spawner/lootdrop/gloves = 5, - /obj/effect/spawner/lootdrop/glowstick = 5, - /obj/effect/spawner/lootdrop/coin = 3, - /obj/effect/spawner/lootdrop/cig_packs = 10, - /obj/effect/spawner/lootdrop/cigars_cases = 2, - /obj/effect/spawner/lootdrop/space_cash = 5, + /obj/effect/spawner/lootdrop/gloves/no_turf = 5, + /obj/effect/spawner/lootdrop/glowstick/no_turf = 5, + /obj/effect/spawner/lootdrop/coin/no_turf = 3, + /obj/effect/spawner/lootdrop/cig_packs/no_turf = 10, + /obj/effect/spawner/lootdrop/cigars_cases/no_turf = 2, + /obj/effect/spawner/lootdrop/space_cash/no_turf = 5, /obj/item/reagent_containers/food/snacks/grown/cannabis = 5, /obj/item/storage/pill_bottle/dice = 5, /obj/item/toy/cards/deck = 5, - /obj/effect/spawner/lootdrop/druggie_pill = 5 + /obj/effect/spawner/lootdrop/druggie_pill/no_turf = 5 ) /obj/effect/spawner/lootdrop/prison_loot_toilet name = "random prison toilet spawner" lootcount = 1 + spawn_on_turf = FALSE //Note this is out of a 100 - Meaning the number you see is also the percent its going to pick that //This is ment for "prison" loot that is rather rare and ment for "prisoners if they get a crowbar to fine, or sec. loot = list("" = 10, /obj/item/lighter = 5, /obj/item/poster/random_contraband = 5, /obj/item/clothing/glasses/sunglasses = 5, - /obj/effect/spawner/lootdrop/coin = 5, - /obj/effect/spawner/lootdrop/cig_packs = 10, - /obj/effect/spawner/lootdrop/cigars_cases = 5, + /obj/effect/spawner/lootdrop/coin/no_turf = 5, + /obj/effect/spawner/lootdrop/cig_packs/no_turf = 10, + /obj/effect/spawner/lootdrop/cigars_cases/no_turf = 5, /obj/item/reagent_containers/food/snacks/grown/cannabis = 5, /obj/item/storage/pill_bottle/dice = 5, /obj/item/toy/cards/deck = 5, - /obj/effect/spawner/lootdrop/druggie_pill = 5, + /obj/effect/spawner/lootdrop/druggie_pill/no_turf = 5, /obj/item/kitchen/knife = 5, /obj/item/screwdriver = 5, - /obj/item/crowbar/red = 0.5, //Dont you need a crowbar to open this? + /obj/item/crowbar/red = 1, //Dont you need a crowbar to open this? /obj/item/stack/medical/bruise_pack = 3, /obj/item/reagent_containers/food/drinks/bottle/vodka = 2, /obj/item/radio = 5, - /obj/item/flashlight = 4.5, + /obj/item/flashlight = 4, /obj/item/clothing/mask/breath = 2, /obj/item/tank/internals/emergency_oxygen = 3, /obj/item/storage/box/mre/menu4/safe = 3, @@ -502,13 +505,14 @@ /obj/effect/spawner/lootdrop/high_loot_toilet name = "random high toilet spawner" lootcount = 1 + spawn_on_turf = FALSE //Note this is out of a 100 - Meaning the number you see is also the percent its going to pick that //The items inside are always going to be something usefull, illegal and likely traitorous. loot = list( /obj/item/clothing/glasses/sunglasses = 5, - /obj/effect/spawner/lootdrop/coin = 5, - /obj/effect/spawner/lootdrop/space_cash = 5, - /obj/effect/spawner/lootdrop/druggie_pill = 5, + /obj/effect/spawner/lootdrop/coin/no_turf = 5, + /obj/effect/spawner/lootdrop/space_cash/no_turf = 5, + /obj/effect/spawner/lootdrop/druggie_pill/no_turf = 5, /obj/item/storage/fancy/cigarettes/cigpack_syndicate = 5, /obj/item/suppressor = 5, /obj/item/toy/cards/deck/syndicate = 5, @@ -521,3 +525,24 @@ /obj/item/clothing/gloves/combat = 10, /obj/item/clothing/shoes/sneakers/noslip = 10 ) + +/obj/effect/spawner/lootdrop/coin/no_turf + spawn_on_turf = FALSE + +/obj/effect/spawner/lootdrop/space_cash/no_turf + spawn_on_turf = FALSE + +/obj/effect/spawner/lootdrop/druggie_pill/no_turf + spawn_on_turf = FALSE + +/obj/effect/spawner/lootdrop/gloves/no_turf + spawn_on_turf = FALSE + +/obj/effect/spawner/lootdrop/cig_packs/no_turf + spawn_on_turf = FALSE + +/obj/effect/spawner/lootdrop/cigars_cases/no_turf + spawn_on_turf = FALSE + +/obj/effect/spawner/lootdrop/glowstick/no_turf + spawn_on_turf = FALSE From ab2d45894790926ad0c8ff0263fd392768eeb7d0 Mon Sep 17 00:00:00 2001 From: Ghom <42542238+Ghommie@users.noreply.github.com> Date: Sun, 12 Apr 2020 07:12:54 +0200 Subject: [PATCH 073/113] Update lighting.dm --- code/modules/power/lighting.dm | 1 + 1 file changed, 1 insertion(+) diff --git a/code/modules/power/lighting.dm b/code/modules/power/lighting.dm index 835055ea48..36005232f3 100644 --- a/code/modules/power/lighting.dm +++ b/code/modules/power/lighting.dm @@ -257,6 +257,7 @@ /obj/machinery/light/small/built icon_state = "bulb-empty" + start_with_cell = FALSE /obj/machinery/light/small/built/Initialize() . = ..() From 863ecf6627b90fae05ec0b999343c9aec4949f66 Mon Sep 17 00:00:00 2001 From: Ghom <42542238+Ghommie@users.noreply.github.com> Date: Sun, 12 Apr 2020 07:17:50 +0200 Subject: [PATCH 074/113] Update watercloset.dm --- 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 0ffbb9f3ea..95edd15951 100644 --- a/code/game/objects/structures/watercloset.dm +++ b/code/game/objects/structures/watercloset.dm @@ -118,7 +118,7 @@ /obj/structure/toilet/secret/LateInitialize() . = ..() w_items = 0 //recalculate total weight thanks to the secret. - for(var/item/I in contents) + for(var/obj/item/I in contents) w_items += I.w_class /obj/structure/toilet/secret/low_loot From acb5c39b598e176fed23cf9b4a10c86152161128 Mon Sep 17 00:00:00 2001 From: Ghommie <42542238+Ghommie@users.noreply.github.com> Date: Sun, 12 Apr 2020 07:47:28 +0200 Subject: [PATCH 075/113] Fixes the phantom thief component for the Xth time. --- code/datums/components/phantomthief.dm | 8 ++++---- code/modules/clothing/glasses/phantomthief.dm | 4 ++-- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/code/datums/components/phantomthief.dm b/code/datums/components/phantomthief.dm index ede222d001..57ab75f7a3 100644 --- a/code/datums/components/phantomthief.dm +++ b/code/datums/components/phantomthief.dm @@ -1,8 +1,8 @@ //This component applies a customizable drop_shadow filter to its wearer when they toggle combat mode on or off. This can stack. /datum/component/wearertargeting/phantomthief - dupe_mode = COMPONENT_DUPE_UNIQUE_PASSARGS - signals = list(COMSIG_LIVING_COMBAT_ENABLED) + dupe_mode = COMPONENT_DUPE_ALLOWED + signals = list(COMSIG_LIVING_COMBAT_ENABLED, COMSIG_LIVING_COMBAT_DISABLED) proctype = .proc/handlefilterstuff var/filter_x var/filter_y @@ -19,8 +19,8 @@ filter_color = _color valid_slots = _valid_slots -/datum/component/wearertargeting/phantomthief/proc/handlefilterstuff(datum/source, mob/user, combatmodestate) - if(!combatmodestate) +/datum/component/wearertargeting/phantomthief/proc/handlefilterstuff(mob/living/user, was_forced = FALSE) + if(!(user.combat_flags & COMBAT_FLAG_COMBAT_ACTIVE)) user.remove_filter("phantomthief") else user.add_filter("phantomthief", 4, list(type = "drop_shadow", x = filter_x, y = filter_y, size = filter_size, color = filter_color)) diff --git a/code/modules/clothing/glasses/phantomthief.dm b/code/modules/clothing/glasses/phantomthief.dm index 1c9afcfd6f..f02984e8e8 100644 --- a/code/modules/clothing/glasses/phantomthief.dm +++ b/code/modules/clothing/glasses/phantomthief.dm @@ -23,8 +23,8 @@ else . += "[DisplayTimeText(nextadrenalinepop - world.time)] left before the adrenaline injector can be used again." -/obj/item/clothing/glasses/phantomthief/syndicate/proc/injectadrenaline(mob/user, combatmodestate) - if(istype(user) && combatmodestate && world.time >= nextadrenalinepop) +/obj/item/clothing/glasses/phantomthief/syndicate/proc/injectadrenaline(mob/living/user, was_forced = FALSE) + if(combatmodestate && world.time >= nextadrenalinepop) nextadrenalinepop = world.time + 5 MINUTES user.reagents.add_reagent(/datum/reagent/syndicateadrenals, 5) user.playsound_local(user, 'sound/misc/adrenalinject.ogg', 100, 0, pressure_affected = FALSE) From 13f9c3c235e4d46bf97678b3912392dc0fa2fd77 Mon Sep 17 00:00:00 2001 From: Ghom <42542238+Ghommie@users.noreply.github.com> Date: Sun, 12 Apr 2020 08:03:30 +0200 Subject: [PATCH 076/113] Update phantomthief.dm --- code/modules/clothing/glasses/phantomthief.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/clothing/glasses/phantomthief.dm b/code/modules/clothing/glasses/phantomthief.dm index f02984e8e8..fa0eea3ca3 100644 --- a/code/modules/clothing/glasses/phantomthief.dm +++ b/code/modules/clothing/glasses/phantomthief.dm @@ -24,7 +24,7 @@ . += "[DisplayTimeText(nextadrenalinepop - world.time)] left before the adrenaline injector can be used again." /obj/item/clothing/glasses/phantomthief/syndicate/proc/injectadrenaline(mob/living/user, was_forced = FALSE) - if(combatmodestate && world.time >= nextadrenalinepop) + if(user.combat_flags & COMBAT_FLAG_COMBAT_TOGGLED && world.time >= nextadrenalinepop) nextadrenalinepop = world.time + 5 MINUTES user.reagents.add_reagent(/datum/reagent/syndicateadrenals, 5) user.playsound_local(user, 'sound/misc/adrenalinject.ogg', 100, 0, pressure_affected = FALSE) From 2e2b9cfe1b6f5f2282bdb23620370dfb4da66db2 Mon Sep 17 00:00:00 2001 From: Ghommie <42542238+Ghommie@users.noreply.github.com> Date: Sun, 12 Apr 2020 09:13:44 +0200 Subject: [PATCH 077/113] Fixing some sprite accessories offsets, shifted the icon states 2 px down. --- .../arousal/genitals_sprite_accessories.dm | 6 +++--- .../icons/obj/genitals/taur_penis_onmob.dmi | Bin 1672 -> 1671 bytes 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/modular_citadel/code/modules/arousal/genitals_sprite_accessories.dm b/modular_citadel/code/modules/arousal/genitals_sprite_accessories.dm index 6bbe947f54..1cea2dd916 100644 --- a/modular_citadel/code/modules/arousal/genitals_sprite_accessories.dm +++ b/modular_citadel/code/modules/arousal/genitals_sprite_accessories.dm @@ -23,13 +23,13 @@ icon_state = "knotted" name = "Knotted" taur_icon = 'modular_citadel/icons/obj/genitals/taur_penis_onmob.dmi' - taur_dimension_y = 64 + taur_dimension_x = 64 /datum/sprite_accessory/penis/flared icon_state = "flared" name = "Flared" taur_icon = 'modular_citadel/icons/obj/genitals/taur_penis_onmob.dmi' - taur_dimension_y = 64 + taur_dimension_x = 64 /datum/sprite_accessory/penis/barbknot icon_state = "barbknot" @@ -39,7 +39,7 @@ icon_state = "tapered" name = "Tapered" taur_icon = 'modular_citadel/icons/obj/genitals/taur_penis_onmob.dmi' - taur_dimension_y = 64 + taur_dimension_x = 64 /datum/sprite_accessory/penis/tentacle icon_state = "tentacle" diff --git a/modular_citadel/icons/obj/genitals/taur_penis_onmob.dmi b/modular_citadel/icons/obj/genitals/taur_penis_onmob.dmi index e8efbec21664496ce1b1c9b3be94166cff7f994d..9dbed5e9f05d58d4a2d71ddf568c3716318b7da8 100644 GIT binary patch delta 1277 zcmXYvdr%Ws6vh`(=u~5@(@HhfrPXP*wyg9)XnBPCY)3_>wg?I?*!o5iqCg~JSBZ)p z5KvmwrUOOBSHT2PAQHlYGz11DwG4z9L&76j1W5|ZBZ>Ryj_n_J?wNbeneRKlb1!gm zI8|aFAE4-jPY`-?z9==kP^Mb^^+&GNedp5Cgm(P3~Tf-a4uhY~P>R zx?3o@x(}_;Z-br7nC|W?ll8B;Ka&!S!L7L$wG^h_iu^cVwI*eC?PTqXljg_sRv_OM zhcyPVZ$kGTjeTh9x@Yb}=ofpwbuaIAek{#%*QBEzP{$B>wC+v#$h04HoSqv^7qRl9 zjz}svr19k(3%`%t%4nya4&x5La`%bJ4E=M1V01#I(3M`o6#GEtnl|p#!{zV}msSV0 zS(hIYE}2j7%R&lJZ3dGx(*}<|*VauLvq_6gzDbP7GMsI~BRIFB;2-nwE|^BcvzV6I zZetgp$+k~-m+kk)f*%@2?s<ynQX%c##9Q95u@_3Hqg%+MK1z?(NO+fSkYMJ3^r$yB0|Op-P-0Sl)i`8358&N| zMvu-B;7_$U0-#qpU{zjZKa__#InFXBRKa|Tg-Yq)JvtNNf4>v*V}YH0V!3Y#P>*x+ zonQziY4^z4>1ZMskC}mHOX2XkTJ(ztX_-N0O!kOm9RZ6s-!jJRuqKQ-_>wf7d%gzU zTW$d3cb8m=5Uev}?*tXTy2)Ku!Z&OR5=s%$#4T%fnVJ|r|Y_5p#*OY*2 zokyNv;C9}eJ&M+{f{GGzlvHk_?aQmaVw+|vrP7q%EMb+N9K1sl1)5Uu>Rm8igxGp1 z{aU>APuxF!T#!HJKg3$0T1?*Ns_>w_j8TiMGYcyJCm*d!gADAKO$lZs$+Rnvb8w8Q zrt|~kU=6Y5vIiUX`N>2MWTW(eNN)11G_l*GinkXWAW#$Md^Nn23Iu?r1fC_roOQn40OZwowIJOS>W>fS=<@&_ze*v=0z(W84 delta 1278 zcmXw%e^8Ql9LFE^lI=WYw^q36q${_1Hx1W1pfbt*sJ1q(U3a?5z*<^I4xK+zP`;^G z)+}?m(k_+jkA7^VQl?^{kK_@VfpeyUiW(La$b$+f4?GXg9=F?H-_L!&pI_hi`&Aiw zE>!kQKtMokUcg3B6mmQ_p{Atu-QBT{82y>TLIITmK{H_q;;CX~Xy)ueRwR(Z{>|s# zywB}^ks-vJqdqU~;$tZ(+^4qnGsAOQf-~!Q9C)n6o$7hO?zttup?^AYe>j^(EAs67 z5%D}E@02h2_N$kMtIVs}%KcZji3Qm)lRQ)~Gd2$5;Mhyxj`4?*n> zy>UL5M(;sF@~3%D2A=n(y?;;}x^uzNKmFlt4sk~V|Gbu{#*8knXK+sYbinQr3LSCc zBtOCywWZB3Tb&}zHi=gnHh@2FFHil=4Ou+p3|-sbcob*Fci(K}+)aEWs7)zFfzyRk zr&G8h7^TIwO2XC*YrK1lcU~Id4#Zs1?ys$eAZR|y;7VJzcG{+9%CTv+jWT8?%w2V+ zHsNz>%fR$1L#xGV)mR>TKe@S2iy8SJp#|)cdjFB@Xx{;A)>Z6;CiQSki{#HikNa7z zbYu95+ZJ=g)~;$BasM)im`w7=dx94$$w98o4@Dimz|L;f5Z;$t!US~}sW#g1s{*%2 zZSTs(kEBJ>euA5*Yt&W!{@J7Uv!?dKCF$sZ@X%0`A_+gj+&;FQ2+!ORltjp|4Wx?M z5$R2|7GR7}?!b9+RkN?MYVg}7Myep~AV*%{kB=P$2mg)cU;dV5qbSVO*$9(Y)r0oU zpJjtF7Lcm~4Oj*<3W82cZzZ&zpyGXT8y11owCg1?IzkP5LNrV1k&Q%^jk3!^Jo2iB zP`C(3P>#ET{LiWEe80f`BL6z0<|1qjtwuO4Q#|oKRBfhpCYD0ZssIQ;$T*@2a)>Lm zuuIEe!tB>{CR`M-@&>KTa4m>4umV9271tOr392?YDO!fEiBo?}{24hQ`U28q@9E7J z|89w~Ea4_}-UnR-X6kCk2W~VE=NbI3R-0E8u8H5;-68ZM2UxI5x(&qN z1;!6b{WA|2m2+qrnUz!a-zo7n(e*b#@q{zz)LwAh{}x&Mwt_Pymng{v}%0=d1ftF-W&^gCR)HPff==`U4Ffqd;as%dR(Y^lq#- zPDh^;ih0cLRM2K8o46)}$0MFCF&w8uN%&=1#)-T(L{zceOiOV~z$A|Kp2TO$ok5)l z=kOLHI*}ve6S;>t;p8fIx^9$u_EoOI3nT6dgFoYc<%P|n;we(PDpYgS2^@M}ho3P4 zB6WKi$iwZxeb0m(U&s5A0ne5*#NQT> zqaz$x?!zvJJg0tap)I%48$O-2QDT!#zA>uq$^w_)`JS^%VIh(eyU$IpxJ&{_8kF2> z7bnaktfB?4>ZB4?^Jle;sjVP<6P)IM2ZC}=v&=NsHEzQN7R>&Y1?w?WNREFU$!@yB zYVG`f?UTnO8)jOTiBO0N(}U}|N^u4M8aH7aVXc_ba4#CLM$0i{T8NGw8Jh@lWFAa4 e^t(p2g$OjnDF0e-&}Wi)&^KQvf7S8@ulygzV$Eg% From 1afa07dad5670dd37ad6c7f527c5063280c30b63 Mon Sep 17 00:00:00 2001 From: Ghommie <42542238+Ghommie@users.noreply.github.com> Date: Sun, 12 Apr 2020 09:40:38 +0200 Subject: [PATCH 078/113] Improved readability. --- code/controllers/configuration/entries/game_options.dm | 7 ++++--- config/game_options.txt | 5 +++-- 2 files changed, 7 insertions(+), 5 deletions(-) diff --git a/code/controllers/configuration/entries/game_options.dm b/code/controllers/configuration/entries/game_options.dm index c3d0d2e3e7..8fe47e72ce 100644 --- a/code/controllers/configuration/entries/game_options.dm +++ b/code/controllers/configuration/entries/game_options.dm @@ -460,8 +460,9 @@ config_entry_value = RESIZE_DEFAULT_SIZE min_val = RESIZE_DEFAULT_SIZE -//pun pun slowdown for characters smaller than this thanks shorter strides. -//Set to a value below 'body_size_min' to disable it. +//Pun-Pun movement slowdown for characters with a body size smaller than this value, +//Which kinda makes sense considering their strides should be shorters. +//To disable, just make sure the value is lower than 'body_size_min' /datum/config_entry/number/threshold_body_size_slowdown config_entry_value = RESIZE_DEFAULT_SIZE * 0.85 min_val = 0 @@ -471,4 +472,4 @@ //doesn't apply to floating or crawling mobs /datum/config_entry/number/body_size_slowdown_multiplier config_entry_value = 0.25 - min_val = 1.1 //otherwise it'd be a waste of time. + min_val = 0.1 //To encourage folks to disable the slowdown through the above config instead. diff --git a/config/game_options.txt b/config/game_options.txt index dd49446ecc..241afa7aa0 100644 --- a/config/game_options.txt +++ b/config/game_options.txt @@ -625,8 +625,9 @@ PENIS_MAX_INCHES_PREFS 20 BODY_SIZE_MIN 1 BODY_SIZE_MAX 1 -## Pun-Pun slowdown for characters smaller than this thanks shorter strides. -## Set to a value below BODY_SIZE_MIN to disable it. +## Pun-Pun movement slowdown for characters with a body size smaller than this value, +## Which kinda makes sense considering their strides should be shorters. +## To disable, just make sure the value is lower than 'body_size_min' THRESHOLD_BODY_SIZE_SLOWDOWN 0.85 ## Multiplier used in the smaller strides slowdown calculation. From 4e3845da5ecc2b9864e7e30aa580961fdcbed741 Mon Sep 17 00:00:00 2001 From: Ghommie <42542238+Ghommie@users.noreply.github.com> Date: Sun, 12 Apr 2020 09:53:41 +0200 Subject: [PATCH 079/113] Clarifies the scope of the slowdown. --- code/controllers/configuration/entries/game_options.dm | 4 ++-- config/game_options.txt | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/code/controllers/configuration/entries/game_options.dm b/code/controllers/configuration/entries/game_options.dm index 8fe47e72ce..f11093cba7 100644 --- a/code/controllers/configuration/entries/game_options.dm +++ b/code/controllers/configuration/entries/game_options.dm @@ -460,8 +460,8 @@ config_entry_value = RESIZE_DEFAULT_SIZE min_val = RESIZE_DEFAULT_SIZE -//Pun-Pun movement slowdown for characters with a body size smaller than this value, -//Which kinda makes sense considering their strides should be shorters. +//Pun-Pun movement slowdown given to characters with a body size smaller than this value, +//to compensate for their smaller hitbox. //To disable, just make sure the value is lower than 'body_size_min' /datum/config_entry/number/threshold_body_size_slowdown config_entry_value = RESIZE_DEFAULT_SIZE * 0.85 diff --git a/config/game_options.txt b/config/game_options.txt index 241afa7aa0..8c48ac6ede 100644 --- a/config/game_options.txt +++ b/config/game_options.txt @@ -625,8 +625,8 @@ PENIS_MAX_INCHES_PREFS 20 BODY_SIZE_MIN 1 BODY_SIZE_MAX 1 -## Pun-Pun movement slowdown for characters with a body size smaller than this value, -## Which kinda makes sense considering their strides should be shorters. +## Pun-Pun movement slowdown given to characters with a body size smaller than this value, +## to compensate for their smaller hitbox. ## To disable, just make sure the value is lower than 'body_size_min' THRESHOLD_BODY_SIZE_SLOWDOWN 0.85 From 53d893a67e05d7611668ac5737590e98f6d55f2c Mon Sep 17 00:00:00 2001 From: deathride58 Date: Sun, 12 Apr 2020 16:21:51 -0400 Subject: [PATCH 080/113] adds rudimentary linux iptables support for fail2topic --- code/controllers/subsystem/fail2topic.dm | 13 ++++++++----- config/config.txt | 5 ++++- 2 files changed, 12 insertions(+), 6 deletions(-) diff --git a/code/controllers/subsystem/fail2topic.dm b/code/controllers/subsystem/fail2topic.dm index 02e7bc7aab..78c4807c3f 100644 --- a/code/controllers/subsystem/fail2topic.dm +++ b/code/controllers/subsystem/fail2topic.dm @@ -21,9 +21,6 @@ SUBSYSTEM_DEF(fail2topic) DropFirewallRule() // Clear the old bans if any still remain - if (world.system_type == UNIX && enabled) - enabled = FALSE - subsystem_log("DISABLED - UNIX systems are not supported.") if(!enabled) flags |= SS_NO_FIRE can_fire = FALSE @@ -90,7 +87,10 @@ SUBSYSTEM_DEF(fail2topic) fail_counts -= ip rate_limiting -= ip - . = shell("netsh advfirewall firewall add rule name=\"[rule_name]\" dir=in interface=any action=block remoteip=[ip]") + if (world.system_type == UNIX) + . = shell("iptables -A [rule_name] -s [ip] -j DROP") + else + . = shell("netsh advfirewall firewall add rule name=\"[rule_name]\" dir=in interface=any action=block remoteip=[ip]") if (.) subsystem_log("Failed to ban [ip]. Exit code: [.].") @@ -105,7 +105,10 @@ SUBSYSTEM_DEF(fail2topic) active_bans = list() - . = shell("netsh advfirewall firewall delete rule name=\"[rule_name]\"") + if (world.system_type == UNIX) + . = shell("iptables -F [rule_name]") //Let's just assume that folks running linux are smart enough to have a dedicated chain configured for this. + else + . = shell("netsh advfirewall firewall delete rule name=\"[rule_name]\"") if (.) subsystem_log("Failed to drop firewall rule. Exit code: [.].") diff --git a/config/config.txt b/config/config.txt index fd5dc968fb..35af0e848b 100644 --- a/config/config.txt +++ b/config/config.txt @@ -510,13 +510,16 @@ DEFAULT_VIEW 21x15 ### FAIL2TOPIC: ### Automated IP bans for world/Topic() spammers +### NOTE FOR WINDOWS HOSTS: This requires you to be running dreamdaemon as an administrator for it to work at all. TGS3 handles this automatically, and honestly there's no reason not to be using TGS3 if you're hosting on Windows. +### NOTE FOR LINUX HOSTS: This requires manual setup of iptables. Beware that improper configuration of this can and will irreversibly fuck up a server, so please don't tinker with it if you don't know what you're doing. ## Enabled -FAIL2TOPIC_ENABLED +#FAIL2TOPIC_ENABLED ## Minimum wait time in deciseconds between valid requests FAIL2TOPIC_RATE_LIMIT 10 ## Number of requests after breaching rate limit that triggers a ban FAIL2TOPIC_MAX_FAILS 5 ## Firewall rule name used on physical server +## FOR LINUX HOSTS: This is used as the chain name. The iptables chain doesn't get created or hooked up to INPUT automatically, so you'll have to get that set up yourself. Recommended name: BYOND FAIL2TOPIC_RULE_NAME _dd_fail2topic ## Enable automatic profiling - Byond 513.1506 and newer only. From 2d96c7eb6e89d75f2cf20f0d4867fa8b5c44eddd Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Sun, 12 Apr 2020 19:02:39 -0500 Subject: [PATCH 081/113] Automatic changelog generation for PR #11819 [ci skip] --- html/changelogs/AutoChangeLog-pr-11819.yml | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-11819.yml diff --git a/html/changelogs/AutoChangeLog-pr-11819.yml b/html/changelogs/AutoChangeLog-pr-11819.yml new file mode 100644 index 0000000000..6619f26aba --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-11819.yml @@ -0,0 +1,5 @@ +author: "Ghommie" +delete-after: True +changes: + - bugfix: "Wizard robes & co work again now." + - bugfix: "Fixed some spell casting message spam." From deacf274547460bcb4368a49a97591bd9c681f8b Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Sun, 12 Apr 2020 19:02:54 -0500 Subject: [PATCH 082/113] Automatic changelog generation for PR #11824 [ci skip] --- html/changelogs/AutoChangeLog-pr-11824.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-11824.yml diff --git a/html/changelogs/AutoChangeLog-pr-11824.yml b/html/changelogs/AutoChangeLog-pr-11824.yml new file mode 100644 index 0000000000..2b91fc5564 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-11824.yml @@ -0,0 +1,4 @@ +author: "Ghommie" +delete-after: True +changes: + - bugfix: "fixed yet another few airless issues with the space hermit ruin." From 609eb190e0f62d3ef580d959f52b1428bd5e2830 Mon Sep 17 00:00:00 2001 From: Ghom <42542238+Ghommie@users.noreply.github.com> Date: Mon, 13 Apr 2020 03:29:07 +0200 Subject: [PATCH 083/113] Update area_copy.dm --- code/modules/holodeck/area_copy.dm | 12 ++++-------- 1 file changed, 4 insertions(+), 8 deletions(-) diff --git a/code/modules/holodeck/area_copy.dm b/code/modules/holodeck/area_copy.dm index 67f8cdddec..316bdb8289 100644 --- a/code/modules/holodeck/area_copy.dm +++ b/code/modules/holodeck/area_copy.dm @@ -67,14 +67,12 @@ GLOBAL_LIST_INIT(duplicate_forbidden_vars_by_type, typecacheof_assoc_list(list( var/src_max_y = 0 var/list/refined_src = new/list() - for (var/i in turfs_src) - var/turf/T = i + for (var/turf/T in turfs_src) src_min_x = min(src_min_x,T.x) src_min_y = min(src_min_y,T.y) src_max_x = max(src_max_x,T.y) src_max_y = max(src_max_y,T.y) - for (var/i in turfs_src) - var/turf/T = i + for (var/turf/T in turfs_src) refined_src[T] = "[T.x - src_min_x].[T.y - src_min_y]" var/trg_min_x = 99999 @@ -83,8 +81,7 @@ GLOBAL_LIST_INIT(duplicate_forbidden_vars_by_type, typecacheof_assoc_list(list( var/trg_max_y = 0 var/list/refined_trg = new/list() - for (var/i in turfs_trg) - var/turf/T = i + for (var/turf/T in turfs_trg) trg_min_x = min(trg_min_x,T.x) trg_min_y = min(trg_min_y,T.y) trg_max_x = max(trg_max_x,T.y) @@ -92,8 +89,7 @@ GLOBAL_LIST_INIT(duplicate_forbidden_vars_by_type, typecacheof_assoc_list(list( var/diff_x = round(((src_max_x - src_min_x) - (trg_max_x - trg_min_x))/2) var/diff_y = round(((src_max_y - src_min_y) - (trg_max_y - trg_min_y))/2) - for (var/i in turfs_trg) - var/turf/T = i + for (var/turf/T in turfs_trg) refined_trg["[T.x - trg_min_x + diff_x].[T.y - trg_min_y + diff_y]"] = T var/list/toupdate = new/list() From 0d0f14d3f842e40526e4da0a40f3349208a309b7 Mon Sep 17 00:00:00 2001 From: Ghommie <42542238+Ghommie@users.noreply.github.com> Date: Mon, 13 Apr 2020 03:34:58 +0200 Subject: [PATCH 084/113] Item color removal port fixes. --- code/modules/clothing/spacesuits/hardsuit.dm | 8 ++-- .../mob/living/carbon/human/update_icons.dm | 40 ++++++------------ .../modules/mob/living/carbon/update_icons.dm | 14 +++--- icons/mob/clothing/uniform_digi.dmi | Bin 344182 -> 344180 bytes 4 files changed, 24 insertions(+), 38 deletions(-) diff --git a/code/modules/clothing/spacesuits/hardsuit.dm b/code/modules/clothing/spacesuits/hardsuit.dm index da979cd516..a1deb8ad30 100644 --- a/code/modules/clothing/spacesuits/hardsuit.dm +++ b/code/modules/clothing/spacesuits/hardsuit.dm @@ -30,16 +30,14 @@ /obj/item/clothing/head/helmet/space/hardsuit/attack_self(mob/user) on = !on - icon_state = "[basestate][on]-[hardsuit_type]" user.update_inv_head() //so our mob-overlays update - if(on) set_light(brightness_on) else set_light(0) - for(var/X in actions) - var/datum/action/A = X - A.UpdateButtonIcon() + +/obj/item/clothing/head/helmet/space/hardsuit/update_icon_state() + icon_state = "[basestate][on]-[hardsuit_type]" /obj/item/clothing/head/helmet/space/hardsuit/dropped(mob/user) ..() diff --git a/code/modules/mob/living/carbon/human/update_icons.dm b/code/modules/mob/living/carbon/human/update_icons.dm index ae7009f5f6..8b4f282f76 100644 --- a/code/modules/mob/living/carbon/human/update_icons.dm +++ b/code/modules/mob/living/carbon/human/update_icons.dm @@ -321,12 +321,16 @@ There are several things that need to be remembered: if(!get_bodypart(BODY_ZONE_HEAD)) //Decapitated return - if(client && hud_used && hud_used.inv_slots[SLOT_BACK]) + if(client && hud_used) var/obj/screen/inventory/inv = hud_used.inv_slots[SLOT_HEAD] inv.update_icon() - update_mutant_bodyparts() if(head) + head.screen_loc = ui_head + if(client && hud_used && hud_used.hud_shown) + if(hud_used.inventory_shown) + client.screen += head + update_observer_view(head,1) remove_overlay(HEAD_LAYER) var/obj/item/clothing/head/H = head var/alt_icon = H.mob_overlay_icon || 'icons/mob/clothing/head.dmi' @@ -348,6 +352,7 @@ There are several things that need to be remembered: head_overlay.pixel_y += dna.species.offset_features[OFFSET_HEAD][2] overlays_standing[HEAD_LAYER] = head_overlay apply_overlay(HEAD_LAYER) + update_mutant_bodyparts() /mob/living/carbon/human/update_inv_belt() remove_overlay(BELT_LAYER) @@ -457,11 +462,16 @@ There are several things that need to be remembered: if(!get_bodypart(BODY_ZONE_HEAD)) //Decapitated return - if(client && hud_used && hud_used.inv_slots[SLOT_WEAR_MASK]) + if(client && hud_used) var/obj/screen/inventory/inv = hud_used.inv_slots[SLOT_WEAR_MASK] inv.update_icon() if(wear_mask) + wear_mask.screen_loc = ui_mask + if(client && hud_used && hud_used.hud_shown) + if(hud_used.inventory_shown) + client.screen += wear_mask + update_observer_view(wear_mask,1) var/obj/item/clothing/mask/M = wear_mask remove_overlay(FACEMASK_LAYER) var/alt_icon = M.mob_overlay_icon || 'icons/mob/clothing/mask.dmi' @@ -515,22 +525,6 @@ There are several things that need to be remembered: //human HUD updates for items in our inventory -//update whether our head item appears on our hud. -/mob/living/carbon/human/update_hud_head(obj/item/I) - I.screen_loc = ui_head - if(client && hud_used && hud_used.hud_shown) - if(hud_used.inventory_shown) - client.screen += I - update_observer_view(I,1) - -//update whether our mask item appears on our hud. -/mob/living/carbon/human/update_hud_wear_mask(obj/item/I) - I.screen_loc = ui_mask - if(client && hud_used && hud_used.hud_shown) - if(hud_used.inventory_shown) - client.screen += I - update_observer_view(I,1) - //update whether our neck item appears on our hud. /mob/living/carbon/human/update_hud_neck(obj/item/I) I.screen_loc = ui_neck @@ -579,13 +573,7 @@ use_mob_overlay_icon: if FALSE, it will always use the default_icon_file even if /obj/item/proc/build_worn_icon(default_layer = 0, default_icon_file = null, isinhands = FALSE, femaleuniform = NO_FEMALE_UNIFORM, override_state, style_flags = NONE, use_mob_overlay_icon = TRUE) var/t_state - if(override_state) - t_state = override_state - else - if(isinhands && item_state) - t_state = item_state - else - t_state = icon_state + t_state = override_state || item_state || icon_state //Find a valid icon file from variables+arguments var/file2use diff --git a/code/modules/mob/living/carbon/update_icons.dm b/code/modules/mob/living/carbon/update_icons.dm index 0cfca9f212..35350ccb45 100644 --- a/code/modules/mob/living/carbon/update_icons.dm +++ b/code/modules/mob/living/carbon/update_icons.dm @@ -90,9 +90,9 @@ if(!get_bodypart(BODY_ZONE_HEAD)) //Decapitated return - if(client && hud_used && hud_used.inv_slots[SLOT_WEAR_MASK]) + if(client && hud_used) var/obj/screen/inventory/inv = hud_used.inv_slots[SLOT_WEAR_MASK] - inv.update_icon() + inv?.update_icon() if(wear_mask) if(!(head && (head.flags_inv & HIDEMASK))) @@ -110,7 +110,7 @@ if(wear_neck) if(!(head && (head.flags_inv & HIDENECK))) - overlays_standing[NECK_LAYER] = wear_neck.build_worn_icon(default_layer = NECK_LAYER, default_icon_file = 'icons/mob/clothing/neck.dmi', override_state = wear_mask.icon_state) + overlays_standing[NECK_LAYER] = wear_neck.build_worn_icon(default_layer = NECK_LAYER, default_icon_file = 'icons/mob/clothing/neck.dmi', override_state = wear_neck.icon_state) update_hud_neck(wear_neck) apply_overlay(NECK_LAYER) @@ -118,9 +118,9 @@ /mob/living/carbon/update_inv_back() remove_overlay(BACK_LAYER) - if(client && hud_used && hud_used.inv_slots[SLOT_BACK]) + if(client && hud_used) var/obj/screen/inventory/inv = hud_used.inv_slots[SLOT_BACK] - inv.update_icon() + inv?.update_icon() if(back) overlays_standing[BACK_LAYER] = back.build_worn_icon(default_layer = BACK_LAYER, default_icon_file = 'icons/mob/clothing/back.dmi', override_state = back.icon_state) @@ -134,9 +134,9 @@ if(!get_bodypart(BODY_ZONE_HEAD)) //Decapitated return - if(client && hud_used && hud_used.inv_slots[SLOT_BACK]) + if(client && hud_used) var/obj/screen/inventory/inv = hud_used.inv_slots[SLOT_HEAD] - inv.update_icon() + inv?.update_icon() if(head) overlays_standing[HEAD_LAYER] = head.build_worn_icon(default_layer = HEAD_LAYER, default_icon_file = 'icons/mob/clothing/head.dmi', override_state = head.icon_state) diff --git a/icons/mob/clothing/uniform_digi.dmi b/icons/mob/clothing/uniform_digi.dmi index 80e8f80b94835907eaaf20102421a629f2e879bd..9deb214335569dc3f88987f0f768b6be48fff785 100644 GIT binary patch delta 1889 zcmV-n2cG!$fEDzB6_6x63*TW_C*r0#YC4}Ss)yfW~y#7kANF6{5SUw-}X zm*2b3zkPW;vt~)Ld+L7r;XjWL7qP{4Pu<5KA0Hgc=*sp_E>yUGd+NRmY{iiO?(xBj z=I*Kc>G9#D6gYQJ-G>`zLaH*eN=}irE{x_v6001?Q6g6{Dk0@6Rnm*ZI%XWr9+}+8 zk&75aA_vJu*D84yO+Jlva3Bp-pJMiXUZhkx%Y{vmbA79gPnY_4pD9X7bv^KOSy}tR zlbKLh+2V4S`ika%yc+ig_VeR|WlwAO)O~pO>hIO*p6ci2$xPWLEp>Gn{K6nQDsu!` zWs6H)L3Cbp_ULTChPon(vOzS*I03fZtya^VB4VYZGDpl@lr07pCeQ*0PiDf;* z0f$GX$SI||bDu@2)J-Kws6#oOh3l&@9E(YHjYy}H7~o2O$!oM?kX3B9IEmIL83eh_ zGz|&52reWAkaq(r76WJ$zpRkzU7QrgjL49V z^?=5Zj;V+5n|aZ>t}P^SNEg7#koRlf;21_vRtWK)+2}H4=z84HQJH~o!{{>P?M`U$ zc>Rg%eqiu_3-|N-Oo5=g4rX1-gJ0PAR2)Nip@`DE_iFjTK4kj{GT=gLIktRa8_}=~ zO;EJCM5~;Et2X)j6Mxgok(oeao(oCrXHv32x{$NvLb3Fxqyfl%T*|xbJ`kYVcRZrn z#*vzYMhcP6D;QHOIxf+Iv~g@E#zPwdgC&>hK5SL4Pyqwp$3GuK^Rlj>@YAg1VgpBz_G5wAUs8(gft1{{R0zqc{5DQtISZqX0lE zAtA@;5^{W7H3K=jy-a~D`Y2QY>`|%!(7hS}O+fgBY|$;RL)1tjBVRw_ctqqD-$EY` zh;kTz2QB=_{Qz{UYrF*_m5pouh9ulFCZ!!_JWs2E& z%2^Bqhb0$^BPJNDc|9}5yrw0Nr{pIfvU5^+rij&pFmUi>CJZeUK~Q0t&rCqoc5*by zThxO~CC{mJPu+))?|%IF?ymlAD5Qpc=nF-EAaPW-J)b#B9QzSWm@!8Rfi7hNGXD)j ztR}NrR0?3T2Z=~^K-FFybZP1qFrggc(L9NTs?AptmWmaouP7`ROug@6BvLdkB|nPR zGo>4fY}}1T>k9{;l;T)lXu8y=JgS^dNH41Ht@oNHo)aLOUsPtcJ(gJyeqpS%scbQS z@R>7Gw9F(vDLBp9Qx1gG6byxgDaWSN%`BGjVHB9v!Rg;WClB`D4eonbRDj|Mzsx=< zpg~*TOHM%TL3!#;3V|Y!C@D`p$1!s~iYv-fAJ}H|W-RfVjr>xYghzfUZBvi@Qkv$( zvAl2GoVGP^Y@5(ItxfXJX>Hr0b6T5!CS>!cwh!3+sc8i^e`=c0AN2|q>Ex0Jnjm{i z7V_;QOLhd@yGq5ly0cysYCoLCLoY1WEI>LnK-6|WVF?sQfps$oLQ9`uk^)pbNhc@@ zJwUMF3PDJDi-D`9FjO4GVgfW8u%r_v@k#>Byx_6}y1rXq8sqm~Bq)4;YYF1F_mSv; zqw$F0dodcG40w?`Tne@ond8f>7!9$!D}MK^tW6OHcBqEwtRA&;L(dq*0fq+zfN^y3p< za=%0iq_cDK@K0&3==)hE5b$%cyCIoPinei3VJ(7;S<^^8{#>I6m;B5WdzE;Te#qX)eG+R+BUX?<9|x(mhsg4iqPe^%)P>4CzFy@w*5@seB}Rq_v`PUyU)LUdHfS<{G2HykU{2y bR|khz2LXpy2Lgvz2Lp#!2L!iQ2L&HF+{22* delta 1891 zcmV-p2b}oyfED(D6_6x^d;+0FR*N+vS=u7iJ^J=JNd1a2=3jt~ISue*iH~AE**_ls`OCk) z{dV~J>$m3Pb+E(5^&J3c1 zF=vo9_PEpqM5o!Nh|czVYAd1`J4AC_5MbNG;!P*b;=sMcu8Xn9z{&*Pz&?^2F;q`% z6eC~-$yGV3wk`f7Mu62xlG;$wlW=<#j&pU|)(AZw#Q}bQrYzZuLsqfg#Zjz1$s~x2 zGwrn^Dt0ERfV>;<=?^RfqAH`rHk4;8n7G1k3+4b4NkkmfNgSY2{I)=P>f5r!!QhyybxkNi?g{ekb7Lw!I*(?!`a-I)hFz* zc-@iPcA$@cGk4SSN{Jv}2eUy-A7^$^YhVbklu>%KUVA>U4Ou^e3^ce06?lq zkz)*s9N%4u13AF^(gm{ohvEe=;Guj0@LPodnu_od*|uA*hp3ihM!tTD?Gce{%nN-y zfro&9Ec}uW0_a-ncn?IX9oL)^`Px<^M7G(VgQT(mV4bZ3KKLRL`uHjnQCp^5T%=OO zL2#N&r95DQu{zi*Q!b0nc{pkufoLyC<%u#@Bf`Kwk{dC!QU*bTWxg`yHZ=wst zXf2c0!^`2*=MO)9{%}_)ca(I;K6I5bkW3nX`;JeXB@f*ICefH7g}|VNfNH>sA-ATm zn@uWkXD=ioH2~#(3y>qVHHbnv#G*wK4^^PABrFvxR$ozAE|`wr!$|b#f@&PZ+S$_$ zMKNeaUKe{qqu53c8Ps)@5U03Z05JROL*qDx^L>4-|DV8ajqYC zZqB|naNakelPg%@a4;{3H`TSwIUmXMxZgWwP_*S zKCqNPfZsK$F0_sHY*0($BrziIM3y2zI@Lqe>YuO#3ZuYU8U&%`P%udWs-R>e6op;3<)s70NE%H$ax^)JeC1}B{Eec zAvRSgPm|of7L#P;Rzw*>1(T>d7P%XSQ~`R^GqUC=L#UX@8;aaIBe4H`>nJ!)J^g8E zM4D3qqEtu5&VUP3MvhzoePgTLoaLy793)*4T`dt_q;IAM;yKHilKu9|3E@ldFxnX{MMxeg>SDgLHzb|5*_f+ zjl{-mb!m7;%MR2tDmdr_l1UQ0w7bqFSby8Prx<6?JkIaJ1MD@m{_dFs zHsbLm1M2+ntF^}6xKl-M(=Db4jr=te-DTymyC)g8G z6`M;pXAk7KlScSAH&^uIWRl3*Nypug!cMc_IjFK#LB=dPP=~+a=)fhvGUd)>nt)u@ za~4#cT%f7_^)iapuAF%SB$`eYc=77g3h}95ynl-q?2&{o$_xemwm0+t Date: Sun, 12 Apr 2020 22:19:10 -0400 Subject: [PATCH 085/113] bye --- code/controllers/subsystem/processing/circuit.dm | 1 - code/modules/cargo/packs/science.dm | 5 ++--- 2 files changed, 2 insertions(+), 4 deletions(-) diff --git a/code/controllers/subsystem/processing/circuit.dm b/code/controllers/subsystem/processing/circuit.dm index 880e7a16a8..4fdc9ad806 100644 --- a/code/controllers/subsystem/processing/circuit.dm +++ b/code/controllers/subsystem/processing/circuit.dm @@ -86,7 +86,6 @@ PROCESSING_SUBSYSTEM_DEF(circuit) circuit_fabricator_recipe_list["Tools"] = list( /obj/item/integrated_electronics/wirer, /obj/item/integrated_electronics/debugger, - /obj/item/integrated_electronics/analyzer, /obj/item/integrated_electronics/detailer, /obj/item/card/data, /obj/item/card/data/full_color, diff --git a/code/modules/cargo/packs/science.dm b/code/modules/cargo/packs/science.dm index a3548a5eb6..6b4733aad8 100644 --- a/code/modules/cargo/packs/science.dm +++ b/code/modules/cargo/packs/science.dm @@ -74,10 +74,9 @@ /datum/supply_pack/science/circuitry name = "Circuitry Starter Pack Crate" - desc = "Journey into the mysterious world of Circuitry with this starter pack. Contains a circuit printer, analyzer, debugger and wirer. Power cells not included." + desc = "Journey into the mysterious world of Circuitry with this starter pack. Contains a circuit printer, debugger and wirer. Power cells not included." cost = 1000 - contains = list(/obj/item/integrated_electronics/analyzer, - /obj/item/integrated_circuit_printer, + contains = list(/obj/item/integrated_circuit_printer, /obj/item/integrated_electronics/debugger, /obj/item/integrated_electronics/wirer) crate_name = "circuitry starter pack crate" From 105f83e7ece3569c0e36c100d863cf2095685a16 Mon Sep 17 00:00:00 2001 From: Seris02 Date: Mon, 13 Apr 2020 11:08:26 +0800 Subject: [PATCH 086/113] merge fixes --- icons/mob/feet.dmi | Bin 22505 -> 23048 bytes icons/mob/feet_digi.dmi | Bin 28901 -> 29508 bytes icons/obj/clothing/shoes.dmi | Bin 16721 -> 17167 bytes 3 files changed, 0 insertions(+), 0 deletions(-) diff --git a/icons/mob/feet.dmi b/icons/mob/feet.dmi index 123525d49808aa7ae8dd3b06e89b65738532776f..1e09dce605f6f0bba3ca321b70324ea10162941b 100644 GIT binary patch delta 4304 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 I$?En00&sT;wg3PC delta 10122 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 z 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 WR>Y7jTmp;(iGP<7F8ikI_rC#*^|E>Z literal 16721 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 F{{eH_t6%^C From 950038f4a776387bf91aeb96abb4a29d224a8008 Mon Sep 17 00:00:00 2001 From: Seris02 Date: Mon, 13 Apr 2020 11:12:16 +0800 Subject: [PATCH 087/113] merge fixes? --- code/modules/clothing/shoes/miscellaneous.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/clothing/shoes/miscellaneous.dm b/code/modules/clothing/shoes/miscellaneous.dm index 7b6b73bec4..0635d52000 100644 --- a/code/modules/clothing/shoes/miscellaneous.dm +++ b/code/modules/clothing/shoes/miscellaneous.dm @@ -388,7 +388,7 @@ /obj/item/clothing/shoes/wallwalkers/equipped(mob/user,slot) ..() - if (slot == SLOT_SHOES) + if(slot == SLOT_SHOES) RegisterSignal(user, COMSIG_MOB_CLIENT_MOVE,.proc/intercept_user_move) else RegisterSignal(user, COMSIG_MOB_CLIENT_MOVE) From 468c59bf4936080bc47dbbc3e5de72083bfa2bb8 Mon Sep 17 00:00:00 2001 From: Seris02 Date: Mon, 13 Apr 2020 20:12:20 +0800 Subject: [PATCH 088/113] oops --- code/modules/clothing/shoes/miscellaneous.dm | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/code/modules/clothing/shoes/miscellaneous.dm b/code/modules/clothing/shoes/miscellaneous.dm index 0635d52000..1f410e148f 100644 --- a/code/modules/clothing/shoes/miscellaneous.dm +++ b/code/modules/clothing/shoes/miscellaneous.dm @@ -387,15 +387,15 @@ var/newlocobject = null /obj/item/clothing/shoes/wallwalkers/equipped(mob/user,slot) - ..() + . = ..() if(slot == SLOT_SHOES) RegisterSignal(user, COMSIG_MOB_CLIENT_MOVE,.proc/intercept_user_move) else - RegisterSignal(user, COMSIG_MOB_CLIENT_MOVE) + UnregisterSignal(user, COMSIG_MOB_CLIENT_MOVE) /obj/item/clothing/shoes/wallwalkers/dropped(mob/user) - ..() - RegisterSignal(user, COMSIG_MOB_CLIENT_MOVE) + . = ..() + UnregisterSignal(user, COMSIG_MOB_CLIENT_MOVE) /obj/item/clothing/shoes/wallwalkers/attackby(obj/item/W, mob/user, params) . = ..() @@ -414,7 +414,7 @@ . = ..() . += "It has [wallcharges] charges left." -/obj/item/clothing/shoes/wallwalkers/proc/intercept_user_move(mob/living/m, client,dir,newloc,oldloc) +/obj/item/clothing/shoes/wallwalkers/proc/intercept_user_move(mob/living/m, client/client, dir, newloc, oldloc) if (walkcool >= world.time || m.m_intent != MOVE_INTENT_WALK || wallcharges <= 0) return walkcool = world.time + m.movement_delay() From 6157500f2557a5e2d97aa73bd3e35416e68c797c Mon Sep 17 00:00:00 2001 From: Ghom <42542238+Ghommie@users.noreply.github.com> Date: Mon, 13 Apr 2020 14:16:48 +0200 Subject: [PATCH 089/113] FYI, Dropped() already handles it. --- code/modules/clothing/shoes/miscellaneous.dm | 2 -- 1 file changed, 2 deletions(-) diff --git a/code/modules/clothing/shoes/miscellaneous.dm b/code/modules/clothing/shoes/miscellaneous.dm index 1f410e148f..7a3ed902ea 100644 --- a/code/modules/clothing/shoes/miscellaneous.dm +++ b/code/modules/clothing/shoes/miscellaneous.dm @@ -390,8 +390,6 @@ . = ..() if(slot == SLOT_SHOES) RegisterSignal(user, COMSIG_MOB_CLIENT_MOVE,.proc/intercept_user_move) - else - UnregisterSignal(user, COMSIG_MOB_CLIENT_MOVE) /obj/item/clothing/shoes/wallwalkers/dropped(mob/user) . = ..() From 8145513ba76d55169a9cc8537554948be4468595 Mon Sep 17 00:00:00 2001 From: Ghom <42542238+Ghommie@users.noreply.github.com> Date: Mon, 13 Apr 2020 14:19:13 +0200 Subject: [PATCH 090/113] Actually fixed wizard garbs. --- code/datums/elements/spellcasting.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/datums/elements/spellcasting.dm b/code/datums/elements/spellcasting.dm index 69d628d9d2..877bcdbcd3 100644 --- a/code/datums/elements/spellcasting.dm +++ b/code/datums/elements/spellcasting.dm @@ -34,7 +34,7 @@ stacked_spellcasting_by_user -= target /datum/element/spellcasting/proc/on_equip(datum/source, mob/equipper, slot) - if(!(slot & cast_slots)) + if(!(cast_slots & slotdefine2slotbit(slot))) return users_by_item[source] = equipper if(!stacked_spellcasting_by_user[equipper]) From a1ade99b98686fc7693ecf6a09dcbd1433364fdc Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Mon, 13 Apr 2020 07:25:46 -0500 Subject: [PATCH 091/113] Automatic changelog generation for PR #10986 [ci skip] --- html/changelogs/AutoChangeLog-pr-10986.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-10986.yml diff --git a/html/changelogs/AutoChangeLog-pr-10986.yml b/html/changelogs/AutoChangeLog-pr-10986.yml new file mode 100644 index 0000000000..bac7b9692a --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-10986.yml @@ -0,0 +1,4 @@ +author: "Seris02" +delete-after: True +changes: + - rscadd: "wall walking boots" From affac4d907ba6c3e1f83958522dc7c908eb90dca Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Mon, 13 Apr 2020 07:50:27 -0500 Subject: [PATCH 092/113] Automatic changelog generation for PR #11275 [ci skip] --- html/changelogs/AutoChangeLog-pr-11275.yml | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-11275.yml diff --git a/html/changelogs/AutoChangeLog-pr-11275.yml b/html/changelogs/AutoChangeLog-pr-11275.yml new file mode 100644 index 0000000000..5a3ce31631 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-11275.yml @@ -0,0 +1,5 @@ +author: "Ghommie" +delete-after: True +changes: + - rscadd: "Reenabled the swarmers event. Also blacklisted another dozen other machineries and structures that may be critical to the shift or station integrity from swarmers' HUNGER for materials." + - bugfix: "Fixed find_safe_turfs() searching for turfs with concentration of oxygen lower than 16 rather higher." From 0816512150d221acf17caff365f2e6d8b9e3eeac Mon Sep 17 00:00:00 2001 From: Ghommie <42542238+Ghommie@users.noreply.github.com> Date: Mon, 13 Apr 2020 16:09:52 +0200 Subject: [PATCH 093/113] more work. --- code/__HELPERS/_lists.dm | 2 +- code/datums/elements/polychromic.dm | 38 +++++++++++--------------- code/modules/clothing/under/costume.dm | 8 +++--- 3 files changed, 21 insertions(+), 27 deletions(-) diff --git a/code/__HELPERS/_lists.dm b/code/__HELPERS/_lists.dm index 8887a2aa1d..a34b3ce67c 100644 --- a/code/__HELPERS/_lists.dm +++ b/code/__HELPERS/_lists.dm @@ -555,7 +555,7 @@ for(var/i in deep_list) var/key = i if(isnum(key)) - key = "[key]" + L += "[key]" continue if(islist(key)) key = deep_list2params(key) diff --git a/code/datums/elements/polychromic.dm b/code/datums/elements/polychromic.dm index d7057cfdf7..5e1a3e3c73 100644 --- a/code/datums/elements/polychromic.dm +++ b/code/datums/elements/polychromic.dm @@ -6,20 +6,20 @@ /datum/element/polychromic element_flags = ELEMENT_BESPOKE|ELEMENT_DETACH id_arg_index = 3 - var/overlays_states //A list or a number of states. In the latter case, the atom icon_state/item_state will be used followed by a number for the overlays. - var/list/colors_by_atom = list() //list of color strings or mutable appearance depending on the above variable. + var/overlays_states //A list or a number of states. In the latter case, the atom icon_state/item_state will be used followed by a number. + var/list/colors_by_atom = list() //list of color strings or mutable appearances, depending on the above variable. var/icon_file var/list/overlays_names //wrap numbers into text strings please. var/list/actions_by_atom = list() var/poly_flags - //item variables - var/worn_file //used for boths held and worn overlays if present. + var/worn_file //used in place of items' held or mob overlay icons if present. /datum/element/polychromic/Attach(datum/target, list/colors, states, _icon, _flags = POLYCHROMIC_ALTCLICK|POLYCHROMIC_NO_HELD, _worn, list/names = list("Primary", "Secondary", "Tertiary", "Quaternary", "Quinary", "Senary")) . = ..() - var/states_len = length(overlays_states) + var/make_appearances = islist(overlays_states) + var/states_len = make_appearances ? length(states) : states var/names_len = length(names) - if(!states_len || names_len || !isatom(target)) + if(!states_len || !names_len || !isatom(target)) return ELEMENT_INCOMPATIBLE var/atom/A = target @@ -30,14 +30,9 @@ var/mut_icon = icon_file || A.icon var/list/L = list() - if(islist(overlays_states)) - for(var/I in overlays_states) - var/col = popleft(colors) || "#FFFFFF" - L += mutable_appearance(mut_icon, I, color = col) - else - for(var/I in 1 to overlays_states) - var/col = LAZYACCESS(colors, I) || "#FFFFFF" - L += col + for(var/I in 1 to states_len) + var/col = LAZYACCESS(colors, I) || "#FFFFFF" + L += make_appearances ? mutable_appearance(mut_icon, overlays_states[I], color = col) : col colors_by_atom[A] = L RegisterSignal(A, COMSIG_ATOM_UPDATE_OVERLAYS, .proc/apply_overlays) @@ -46,12 +41,12 @@ RegisterSignal(A, COMSIG_PARENT_EXAMINE, .proc/on_examine) RegisterSignal(A, COMSIG_CLICK_ALT, .proc/set_color) - if(!overlays_names && names) + if(!overlays_names && names) //generate overlays_names = names var/diff = states_len - names_len - if(diff > 0) //It will be ugly, but still functional. + if(diff > 0) for(var/i in 1 to diff) - overlays_names += "[names_len + i]" + overlays_names += "[names_len + i]°" else if(diff < 0) overlays_names.len += diff @@ -61,13 +56,13 @@ RegisterSignal(src, COMSIG_ITEM_DROPPED, .proc/remove_user_action) AddElement(A, /datum/element/update_icon_updates_onmob) //Since we can change the overall aspect of the item. RegisterSignal(A, COMSIG_ITEM_WORN_OVERLAYS, .proc/apply_worn_overlays) - else if(_flags & POLYCHROMIC_ACTION && ismob(A)) //Not safe until mob icon updating procs are standarized and stop using cut_overlays() + else if(_flags & POLYCHROMIC_ACTION && ismob(A)) //in the event mob update icon procs are ever standarized. var/datum/action/polychromic/P = new(A) RegisterSignal(P, COMSIG_ACTION_TRIGGER, .proc/activate_action) actions_by_atom[A] = P P.Grant(A) - A.update_icon() + A.update_icon() //apply the overlays. /datum/element/polychromic/Detach(atom/A) . = ..() @@ -75,10 +70,9 @@ colors_by_atom -= A var/datum/action/polychromic/P = actions_by_atom[A] if(P) + actions_by_atom -= A qdel(P) - actions_by_atom -= A - if(poly_flags & POLYCHROMIC_ALTCLICK) - UnregisterSignal(A, list(COMSIG_PARENT_EXAMINE, COMSIG_CLICK_ALT, COMSIG_ATOM_UPDATE_OVERLAYS, COMSIG_ITEM_EQUIPPED, COMSIG_ITEM_DROPPED)) + UnregisterSignal(A, list(COMSIG_PARENT_EXAMINE, COMSIG_CLICK_ALT, COMSIG_ATOM_UPDATE_OVERLAYS, COMSIG_ITEM_EQUIPPED, COMSIG_ITEM_DROPPED, COMSIG_ITEM_WORN_OVERLAYS)) /datum/element/polychromic/proc/apply_overlays(atom/source, list/overlays) var/list/L = colors_by_atom[source] diff --git a/code/modules/clothing/under/costume.dm b/code/modules/clothing/under/costume.dm index 12988c26ae..7cbfe5abf5 100644 --- a/code/modules/clothing/under/costume.dm +++ b/code/modules/clothing/under/costume.dm @@ -91,13 +91,13 @@ name = "polychromic kilt" desc = "It's not a skirt!" icon_state = "polykilt" - hasprimary = TRUE - hassecondary = TRUE - primary_color = "#FFFFFF" - secondary_color = "#F08080" body_parts_covered = CHEST|GROIN|ARMS|LEGS mutantrace_variation = NONE +/obj/item/clothing/under/costume/kilt/polychromic/ComponentInitialize() + . = ..() + AddElement(/datum/element/polychromic, list("#FFFFFF", "#F08080"), list("polykilt-primary", "polykilt-secondary"), null, POLYCHROMIC_ALTCLICK|POLYCHROMIC_NO_HELD|POLYCHROMIC_ACTION) + /obj/item/clothing/under/costume/gladiator name = "gladiator uniform" desc = "Are you not entertained? Is that not why you are here?" From 1cd57c265b587bf40e93fe711417dcc89907f212 Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Mon, 13 Apr 2020 09:44:18 -0500 Subject: [PATCH 094/113] Automatic changelog generation for PR #11834 [ci skip] --- html/changelogs/AutoChangeLog-pr-11834.yml | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-11834.yml diff --git a/html/changelogs/AutoChangeLog-pr-11834.yml b/html/changelogs/AutoChangeLog-pr-11834.yml new file mode 100644 index 0000000000..05d1b245b1 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-11834.yml @@ -0,0 +1,5 @@ +author: "Bhijn" +delete-after: True +changes: + - server: "Fail2Topic now supports Linux. Do beware that this requires some sysop experience to properly set up!" + - config: "Fail2Topic is now disabled by default, and the out-of-the-box config files have been updated to be a little more detailed." From bfa006fac1300e3addba0b9fe706bc6a0c5c7b87 Mon Sep 17 00:00:00 2001 From: Ghommie <42542238+Ghommie@users.noreply.github.com> Date: Mon, 13 Apr 2020 17:25:13 +0200 Subject: [PATCH 095/113] Fixing runtime errors. --- code/datums/elements/polychromic.dm | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/code/datums/elements/polychromic.dm b/code/datums/elements/polychromic.dm index 5e1a3e3c73..109da4ac50 100644 --- a/code/datums/elements/polychromic.dm +++ b/code/datums/elements/polychromic.dm @@ -16,7 +16,7 @@ /datum/element/polychromic/Attach(datum/target, list/colors, states, _icon, _flags = POLYCHROMIC_ALTCLICK|POLYCHROMIC_NO_HELD, _worn, list/names = list("Primary", "Secondary", "Tertiary", "Quaternary", "Quinary", "Senary")) . = ..() - var/make_appearances = islist(overlays_states) + var/make_appearances = islist(states) var/states_len = make_appearances ? length(states) : states var/names_len = length(names) if(!states_len || !names_len || !isatom(target)) @@ -52,10 +52,11 @@ if(isitem(A)) if(_flags & POLYCHROMIC_ACTION) - RegisterSignal(src, COMSIG_ITEM_EQUIPPED, .proc/grant_user_action) - RegisterSignal(src, COMSIG_ITEM_DROPPED, .proc/remove_user_action) - AddElement(A, /datum/element/update_icon_updates_onmob) //Since we can change the overall aspect of the item. - RegisterSignal(A, COMSIG_ITEM_WORN_OVERLAYS, .proc/apply_worn_overlays) + RegisterSignal(A, COMSIG_ITEM_EQUIPPED, .proc/grant_user_action) + RegisterSignal(A, COMSIG_ITEM_DROPPED, .proc/remove_user_action) + if(!(_flags & (POLYCHROMIC_NO_HELD|POLYCHROMIC_NO_WORN))) + A.AddElement(/datum/element/update_icon_updates_onmob) + RegisterSignal(A, COMSIG_ITEM_WORN_OVERLAYS, .proc/apply_worn_overlays) else if(_flags & POLYCHROMIC_ACTION && ismob(A)) //in the event mob update icon procs are ever standarized. var/datum/action/polychromic/P = new(A) RegisterSignal(P, COMSIG_ACTION_TRIGGER, .proc/activate_action) From 8c995dbad983e585266eea0bc28f755f33d6d652 Mon Sep 17 00:00:00 2001 From: Ghommie <42542238+Ghommie@users.noreply.github.com> Date: Mon, 13 Apr 2020 19:16:55 +0200 Subject: [PATCH 096/113] Making things work. --- code/datums/action.dm | 50 ++++++++++++++--------------- code/datums/elements/polychromic.dm | 21 +++++++++--- 2 files changed, 41 insertions(+), 30 deletions(-) diff --git a/code/datums/action.dm b/code/datums/action.dm index e94e6a182d..f2f93ac40d 100644 --- a/code/datums/action.dm +++ b/code/datums/action.dm @@ -120,34 +120,34 @@ /datum/action/proc/UpdateButtonIcon(status_only = FALSE, force = FALSE) if(!button) return - if(button_icon && button_icon_state) - if(!status_only) - button.name = name - button.desc = desc - if(owner && owner.hud_used && background_icon_state == ACTION_BUTTON_DEFAULT_BACKGROUND) - var/list/settings = owner.hud_used.get_action_buttons_icons() - if(button.icon != settings["bg_icon"]) - button.icon = settings["bg_icon"] - if(button.icon_state != settings["bg_state"]) - button.icon_state = settings["bg_state"] - else - if(button.icon != button_icon) - button.icon = button_icon - if(button.icon_state != background_icon_state) - button.icon_state = background_icon_state + if(!status_only) + button.name = name + button.desc = desc + if(owner && owner.hud_used && background_icon_state == ACTION_BUTTON_DEFAULT_BACKGROUND) + var/list/settings = owner.hud_used.get_action_buttons_icons() + if(button.icon != settings["bg_icon"]) + button.icon = settings["bg_icon"] + if(button.icon_state != settings["bg_state"]) + button.icon_state = settings["bg_state"] + else + if(button.icon != button_icon) + button.icon = button_icon + if(button.icon_state != background_icon_state) + button.icon_state = background_icon_state + if(!use_target_appearance) ApplyIcon(button, force) - else if(use_target_appearance && target && button.appearance_cache != target.appearance) //replace with /ref comparison if this is not valid. - var/mutable_appearance/M = new(target) - M.layer = FLOAT_LAYER - M.plane = FLOAT_PLANE - if(target_appearance_matrix) - var/list/L = target_appearance_matrix - M.transform = matrix(L[1], L[2], L[3], L[4], L[5], L[6]) - button.cut_overlays() - button.add_overlay(M) - button.appearance_cache = target.appearance + else if(target && button.appearance_cache != target.appearance) //replace with /ref comparison if this is not valid. + var/mutable_appearance/M = new(target) + M.layer = FLOAT_LAYER + M.plane = FLOAT_PLANE + if(target_appearance_matrix) + var/list/L = target_appearance_matrix + M.transform = matrix(L[1], L[2], L[3], L[4], L[5], L[6]) + button.cut_overlays() + button.add_overlay(M) + button.appearance_cache = target.appearance if(!IsAvailable(TRUE)) button.color = transparent_when_unavailable ? rgb(128,0,0,128) : rgb(128,0,0) diff --git a/code/datums/elements/polychromic.dm b/code/datums/elements/polychromic.dm index 109da4ac50..70424507b7 100644 --- a/code/datums/elements/polychromic.dm +++ b/code/datums/elements/polychromic.dm @@ -11,6 +11,7 @@ var/icon_file var/list/overlays_names //wrap numbers into text strings please. var/list/actions_by_atom = list() + var/list/already_updates_onmob = list() var/poly_flags var/worn_file //used in place of items' held or mob overlay icons if present. @@ -54,8 +55,11 @@ if(_flags & POLYCHROMIC_ACTION) RegisterSignal(A, COMSIG_ITEM_EQUIPPED, .proc/grant_user_action) RegisterSignal(A, COMSIG_ITEM_DROPPED, .proc/remove_user_action) - if(!(_flags & (POLYCHROMIC_NO_HELD|POLYCHROMIC_NO_WORN))) - A.AddElement(/datum/element/update_icon_updates_onmob) + if(!(_flags & POLYCHROMIC_NO_HELD) && !(_flags & POLYCHROMIC_NO_WORN)) + if(!SSdcs.GetElement(/datum/element/update_icon_updates_onmob)) + A.AddElement(/datum/element/update_icon_updates_onmob) + else + already_updates_onmob[A]++ RegisterSignal(A, COMSIG_ITEM_WORN_OVERLAYS, .proc/apply_worn_overlays) else if(_flags & POLYCHROMIC_ACTION && ismob(A)) //in the event mob update icon procs are ever standarized. var/datum/action/polychromic/P = new(A) @@ -69,6 +73,13 @@ . = ..() A.cut_overlay(colors_by_atom[A]) colors_by_atom -= A + if(!(poly_flags & POLYCHROMIC_NO_HELD) && !(poly_flags & POLYCHROMIC_NO_WORN) && isitem(A)) + if(!already_updates_onmob[A]) + A.RemoveElement(/datum/element/update_icon_updates_onmob) + else + already_updates_onmob[A]-- + if(!already_updates_onmob[A]) + already_updates_onmob -= A var/datum/action/polychromic/P = actions_by_atom[A] if(P) actions_by_atom -= A @@ -99,10 +110,10 @@ /datum/element/polychromic/proc/set_color(atom/source, mob/user) var/choice = input(user,"Polychromic options", "Recolor [source]") as null|anything in overlays_names - if(!choice || QDELETED(source) || !user.canUseTopic(src, BE_CLOSE, NO_DEXTERY)) + if(!choice || QDELETED(source) || !user.canUseTopic(source, BE_CLOSE, NO_DEXTERY)) return var/ncolor = input(user, "Polychromic options", "Choose [choice] Color") as color|null - if(!ncolor || QDELETED(source) || !user.canUseTopic(src, BE_CLOSE, NO_DEXTERY)) + if(!ncolor || QDELETED(source) || !user.canUseTopic(source, BE_CLOSE, NO_DEXTERY)) return var/list/L = colors_by_atom[source] if(!L) // Ummmmmh. @@ -142,4 +153,4 @@ background_icon_state = "bg_polychromic" use_target_appearance = TRUE button_icon_state = null - target_appearance_matrix = list(0.7,0,0,0,0.7,0) + target_appearance_matrix = list(0.75,0,0,0,0.75,0) From 94bcc6a64b1878c7423324078b99cba183b3a28e Mon Sep 17 00:00:00 2001 From: kappa-sama Date: Mon, 13 Apr 2020 14:38:30 -0400 Subject: [PATCH 097/113] removes these --- _maps/map_files/BoxStation/BoxStation.dmm | 1 - _maps/map_files/Deltastation/DeltaStation2.dmm | 2 -- _maps/map_files/KiloStation/KiloStation.dmm | 1 - _maps/map_files/LambdaStation/lambda.dmm | 1 - _maps/map_files/MetaStation/MetaStation.dmm | 2 -- _maps/map_files/OmegaStation/OmegaStation.dmm | 1 - _maps/map_files/PubbyStation/PubbyStation.dmm | 2 -- 7 files changed, 10 deletions(-) diff --git a/_maps/map_files/BoxStation/BoxStation.dmm b/_maps/map_files/BoxStation/BoxStation.dmm index 3b2ee52e24..ab83534102 100644 --- a/_maps/map_files/BoxStation/BoxStation.dmm +++ b/_maps/map_files/BoxStation/BoxStation.dmm @@ -44066,7 +44066,6 @@ /area/science/misc_lab) "cbe" = ( /obj/structure/table/reinforced, -/obj/item/integrated_electronics/analyzer, /obj/item/integrated_electronics/debugger, /obj/item/integrated_electronics/wirer, /turf/open/floor/plasteel/white, diff --git a/_maps/map_files/Deltastation/DeltaStation2.dmm b/_maps/map_files/Deltastation/DeltaStation2.dmm index 61ed3edba7..9a738f12ee 100644 --- a/_maps/map_files/Deltastation/DeltaStation2.dmm +++ b/_maps/map_files/Deltastation/DeltaStation2.dmm @@ -126146,7 +126146,6 @@ /area/quartermaster/storage) "hic" = ( /obj/structure/table/reinforced, -/obj/item/integrated_electronics/analyzer, /obj/item/integrated_electronics/debugger, /obj/item/integrated_electronics/wirer, /turf/open/floor/plasteel/white/side{ @@ -127145,7 +127144,6 @@ /area/ai_monitored/turret_protected/aisat_interior) "qhc" = ( /obj/structure/table/reinforced, -/obj/item/integrated_electronics/analyzer, /obj/item/integrated_electronics/debugger, /obj/item/integrated_electronics/wirer, /turf/open/floor/plasteel/white/side{ diff --git a/_maps/map_files/KiloStation/KiloStation.dmm b/_maps/map_files/KiloStation/KiloStation.dmm index 3eaad62714..abdf574918 100644 --- a/_maps/map_files/KiloStation/KiloStation.dmm +++ b/_maps/map_files/KiloStation/KiloStation.dmm @@ -33907,7 +33907,6 @@ /obj/effect/turf_decal/tile/neutral{ dir = 4 }, -/obj/item/integrated_electronics/analyzer, /obj/machinery/computer/security/telescreen/circuitry{ pixel_y = 30 }, diff --git a/_maps/map_files/LambdaStation/lambda.dmm b/_maps/map_files/LambdaStation/lambda.dmm index 6d1469d483..a307026453 100644 --- a/_maps/map_files/LambdaStation/lambda.dmm +++ b/_maps/map_files/LambdaStation/lambda.dmm @@ -1556,7 +1556,6 @@ dir = 8 }, /obj/structure/table, -/obj/item/integrated_electronics/analyzer, /obj/item/integrated_circuit_printer, /turf/open/floor/plasteel/dark, /area/science/nanite) diff --git a/_maps/map_files/MetaStation/MetaStation.dmm b/_maps/map_files/MetaStation/MetaStation.dmm index e6eddb2777..9294516092 100644 --- a/_maps/map_files/MetaStation/MetaStation.dmm +++ b/_maps/map_files/MetaStation/MetaStation.dmm @@ -81886,7 +81886,6 @@ /area/maintenance/aft) "gRS" = ( /obj/structure/table/reinforced, -/obj/item/integrated_electronics/analyzer, /obj/item/integrated_circuit_printer, /turf/open/floor/plasteel/white, /area/science/circuit) @@ -82471,7 +82470,6 @@ /turf/open/floor/plasteel/white, /area/science/circuit) "ohj" = ( -/obj/item/integrated_electronics/analyzer, /obj/item/integrated_electronics/debugger, /obj/item/integrated_electronics/wirer, /obj/structure/table/reinforced, diff --git a/_maps/map_files/OmegaStation/OmegaStation.dmm b/_maps/map_files/OmegaStation/OmegaStation.dmm index 8a951881f9..9f79e3ecba 100644 --- a/_maps/map_files/OmegaStation/OmegaStation.dmm +++ b/_maps/map_files/OmegaStation/OmegaStation.dmm @@ -26358,7 +26358,6 @@ dir = 8 }, /obj/item/integrated_circuit_printer, -/obj/item/integrated_electronics/analyzer, /obj/item/integrated_electronics/debugger, /obj/item/integrated_electronics/wirer, /obj/effect/turf_decal/tile/neutral, diff --git a/_maps/map_files/PubbyStation/PubbyStation.dmm b/_maps/map_files/PubbyStation/PubbyStation.dmm index bdbce36c9c..0ccbf1623b 100644 --- a/_maps/map_files/PubbyStation/PubbyStation.dmm +++ b/_maps/map_files/PubbyStation/PubbyStation.dmm @@ -27443,7 +27443,6 @@ /area/science/explab) "bmZ" = ( /obj/structure/table/reinforced, -/obj/item/integrated_electronics/analyzer, /obj/machinery/magnetic_controller{ autolink = 1; pixel_x = -28; @@ -60715,7 +60714,6 @@ /area/maintenance/department/crew_quarters/dorms) "vmG" = ( /obj/structure/table/reinforced, -/obj/item/integrated_electronics/analyzer, /obj/effect/turf_decal/tile/neutral{ dir = 1 }, From 616d482cf6a44d2b426d152f502a9fdb2646fdc6 Mon Sep 17 00:00:00 2001 From: Ghommie <42542238+Ghommie@users.noreply.github.com> Date: Mon, 13 Apr 2020 22:51:46 +0200 Subject: [PATCH 098/113] Deleting poly clothes copypasta. --- code/__DEFINES/dcs/signals.dm | 1 + code/datums/elements/polychromic.dm | 64 ++++-- code/modules/clothing/clothing.dm | 194 ------------------ code/modules/clothing/neck/_neck.dm | 65 ++---- code/modules/clothing/suits/cloaks.dm | 11 + code/modules/clothing/suits/miscellaneous.dm | 67 +----- code/modules/clothing/suits/toggles.dm | 24 ++- code/modules/clothing/under/_under.dm | 132 ++++++++++-- code/modules/clothing/under/costume.dm | 2 +- code/modules/clothing/under/miscellaneous.dm | 52 +++-- code/modules/clothing/under/shorts.dm | 13 +- code/modules/clothing/under/skirt_dress.dm | 15 +- code/modules/clothing/under/suits.dm | 10 +- icons/mob/clothing/head.dmi | Bin 223286 -> 223289 bytes icons/mob/clothing/neck.dmi | Bin 45707 -> 47399 bytes icons/mob/clothing/suit.dmi | Bin 424980 -> 424968 bytes icons/mob/clothing/suit_digi.dmi | Bin 439805 -> 439792 bytes icons/mob/clothing/uniform.dmi | Bin 403435 -> 403416 bytes icons/mob/clothing/uniform_digi.dmi | Bin 344180 -> 344171 bytes icons/obj/clothing/hats.dmi | Bin 109697 -> 109696 bytes icons/obj/clothing/neck.dmi | Bin 2866 -> 3253 bytes icons/obj/clothing/suits.dmi | Bin 143821 -> 143808 bytes icons/obj/clothing/uniforms.dmi | Bin 112864 -> 113086 bytes .../clothing/suits/polychromic_cloaks.dm | 38 ---- .../modules/custom_loadout/custom_items.dm | 5 + .../icons/polyclothes/item/neck.dmi | Bin 633 -> 0 bytes .../icons/polyclothes/mob/neck.dmi | Bin 1418 -> 0 bytes tgstation.dme | 1 - 28 files changed, 264 insertions(+), 430 deletions(-) delete mode 100644 modular_citadel/code/modules/clothing/suits/polychromic_cloaks.dm delete mode 100644 modular_citadel/icons/polyclothes/item/neck.dmi delete mode 100644 modular_citadel/icons/polyclothes/mob/neck.dmi diff --git a/code/__DEFINES/dcs/signals.dm b/code/__DEFINES/dcs/signals.dm index b16002e35b..e0f7457a4a 100644 --- a/code/__DEFINES/dcs/signals.dm +++ b/code/__DEFINES/dcs/signals.dm @@ -249,6 +249,7 @@ // /obj/item/clothing signals #define COMSIG_SHOES_STEP_ACTION "shoes_step_action" //from base of obj/item/clothing/shoes/proc/step_action(): () +#define COMSIG_SUIT_MADE_HELMET "suit_made_helmet" //from base of obj/item/clothing/suit/MakeHelmet(): (helmet) // /obj/item/implant signals #define COMSIG_IMPLANT_ACTIVATED "implant_activated" //from base of /obj/item/implant/proc/activate(): () diff --git a/code/datums/elements/polychromic.dm b/code/datums/elements/polychromic.dm index 70424507b7..f664ed9063 100644 --- a/code/datums/elements/polychromic.dm +++ b/code/datums/elements/polychromic.dm @@ -14,13 +14,16 @@ var/list/already_updates_onmob = list() var/poly_flags var/worn_file //used in place of items' held or mob overlay icons if present. + var/static/list/suits_with_helmet_typecache = typecacheof(list(/obj/item/clothing/suit/hooded, /obj/item/clothing/suit/space/hardsuit)) + var/list/helmet_by_suit //because poly winter coats exist. + var/list/suit_by_helmet //Idem. -/datum/element/polychromic/Attach(datum/target, list/colors, states, _icon, _flags = POLYCHROMIC_ALTCLICK|POLYCHROMIC_NO_HELD, _worn, list/names = list("Primary", "Secondary", "Tertiary", "Quaternary", "Quinary", "Senary")) +/datum/element/polychromic/Attach(datum/target, list/colors, states, _flags = POLYCHROMIC_ACTION|POLYCHROMIC_NO_HELD, _icon, _worn, list/names = list("Primary", "Secondary", "Tertiary", "Quaternary", "Quinary", "Senary")) . = ..() var/make_appearances = islist(states) var/states_len = make_appearances ? length(states) : states var/names_len = length(names) - if(!states_len || !names_len || !isatom(target)) + if(!states_len || !names_len || colors_by_atom[target] || !isatom(target)) return ELEMENT_INCOMPATIBLE var/atom/A = target @@ -59,8 +62,10 @@ if(!SSdcs.GetElement(/datum/element/update_icon_updates_onmob)) A.AddElement(/datum/element/update_icon_updates_onmob) else - already_updates_onmob[A]++ + LAZYSET(already_updates_onmob, A, TRUE) RegisterSignal(A, COMSIG_ITEM_WORN_OVERLAYS, .proc/apply_worn_overlays) + if(suits_with_helmet_typecache[A.type]) + RegisterSignal(A, COMSIG_SUIT_MADE_HELMET, .proc/register_helmet) else if(_flags & POLYCHROMIC_ACTION && ismob(A)) //in the event mob update icon procs are ever standarized. var/datum/action/polychromic/P = new(A) RegisterSignal(P, COMSIG_ACTION_TRIGGER, .proc/activate_action) @@ -71,33 +76,48 @@ /datum/element/polychromic/Detach(atom/A) . = ..() - A.cut_overlay(colors_by_atom[A]) colors_by_atom -= A - if(!(poly_flags & POLYCHROMIC_NO_HELD) && !(poly_flags & POLYCHROMIC_NO_WORN) && isitem(A)) - if(!already_updates_onmob[A]) - A.RemoveElement(/datum/element/update_icon_updates_onmob) - else - already_updates_onmob[A]-- - if(!already_updates_onmob[A]) - already_updates_onmob -= A var/datum/action/polychromic/P = actions_by_atom[A] if(P) actions_by_atom -= A qdel(P) - UnregisterSignal(A, list(COMSIG_PARENT_EXAMINE, COMSIG_CLICK_ALT, COMSIG_ATOM_UPDATE_OVERLAYS, COMSIG_ITEM_EQUIPPED, COMSIG_ITEM_DROPPED, COMSIG_ITEM_WORN_OVERLAYS)) + UnregisterSignal(A, list(COMSIG_PARENT_EXAMINE, COMSIG_CLICK_ALT, COMSIG_ATOM_UPDATE_OVERLAYS, COMSIG_ITEM_EQUIPPED, COMSIG_ITEM_DROPPED, COMSIG_ITEM_WORN_OVERLAYS, COMSIG_SUIT_MADE_HELMET)) + if(isitem(A)) + if(!(poly_flags & POLYCHROMIC_NO_HELD) && !(poly_flags & POLYCHROMIC_NO_WORN)) + if(!already_updates_onmob[A]) + A.RemoveElement(/datum/element/update_icon_updates_onmob) + else + LAZYREMOVE(already_updates_onmob, A) + var/obj/item/clothing/head/H = helmet_by_suit[A] + if(H) + UnregisterSignal(H, list(COMSIG_ATOM_UPDATE_OVERLAYS, COMSIG_ITEM_WORN_OVERLAYS, COMSIG_PARENT_QDELETING)) + LAZYREMOVE(helmet_by_suit, A) + LAZYREMOVE(suit_by_helmet, H) + colors_by_atom -= H + if(!QDELETED(H)) + H.update_icon() //removing the overlays + if(!QDELETED(A) && ismob(A.loc)) + var/mob/M = A.loc + if(!(poly_flags & POLYCHROMIC_NO_HELD) && M.is_holding(A)) + M.update_inv_hands() + else if(!(poly_flags & POLYCHROMIC_NO_WORN)) + M.regenerate_icons() + if(!QDELETED(A)) + A.update_icon() //removing the overlays /datum/element/polychromic/proc/apply_overlays(atom/source, list/overlays) var/list/L = colors_by_atom[source] + var/f_icon = icon_file || source.icon if(isnum(overlays_states)) for(var/i in 1 to overlays_states) - overlays += mutable_appearance(source.icon, "[source.icon_state]-[i]", color = L[i]) + overlays += mutable_appearance(f_icon, "[source.icon_state]-[i]", color = L[i]) else overlays += colors_by_atom[source] -/datum/element/polychromic/proc/apply_worn_overlays(obj/item/source, isinhands, icon_file, used_state, style_flags, list/overlays) +/datum/element/polychromic/proc/apply_worn_overlays(obj/item/source, isinhands, icon, used_state, style_flags, list/overlays) if(poly_flags & (isinhands ? POLYCHROMIC_NO_HELD : POLYCHROMIC_NO_WORN)) return - var/f_icon = worn_file || icon_file + var/f_icon = worn_file || icon var/list/L = colors_by_atom[source] if(isnum(overlays_states)) @@ -148,6 +168,20 @@ /datum/element/polychromic/proc/on_examine(atom/source, mob/user, list/examine_list) examine_list += "Alt-click to recolor it." +/datum/element/polychromic/proc/register_helmet(atom/source, obj/item/clothing/head/H) + LAZYSET(suit_by_helmet, H, source) + LAZYSET(helmet_by_suit, source, H) + colors_by_atom[H] = colors_by_atom[source] + RegisterSignal(H, COMSIG_ATOM_UPDATE_OVERLAYS, .proc/apply_overlays) + RegisterSignal(H, COMSIG_ITEM_WORN_OVERLAYS, .proc/apply_worn_overlays) + RegisterSignal(H, COMSIG_PARENT_QDELETING, .proc/unregister_helmet) + +/datum/element/polychromic/proc/unregister_helmet(atom/source) + var/obj/item/clothing/suit/S = suit_by_helmet[source] + LAZYREMOVE(suit_by_helmet, source) + LAZYREMOVE(helmet_by_suit, S) + colors_by_atom -= source + /datum/action/polychromic name = "Modify Polychromic Colors" background_icon_state = "bg_polychromic" diff --git a/code/modules/clothing/clothing.dm b/code/modules/clothing/clothing.dm index 402d16e7ec..d484027ad5 100644 --- a/code/modules/clothing/clothing.dm +++ b/code/modules/clothing/clothing.dm @@ -47,25 +47,12 @@ //Add a "exclude" string to do the opposite, making it only only species listed that can't wear it. //You append this to clothing objects. - //Polychrome stuff: - var/hasprimary = FALSE //These vars allow you to choose which overlays a clothing has - var/hassecondary = FALSE - var/hastertiary = FALSE - var/primary_color = "#FFFFFF" //RGB in hexcode - var/secondary_color = "#FFFFFF" - var/tertiary_color = "#808080" - - //No idea what this is but eh -tori - var/force_alternate_icon = FALSE - /obj/item/clothing/Initialize() . = ..() if(CHECK_BITFIELD(clothing_flags, VOICEBOX_TOGGLABLE)) actions_types += /datum/action/item_action/toggle_voice_box if(ispath(pocket_storage_component_path)) LoadComponent(pocket_storage_component_path) - if(hasprimary | hassecondary | hastertiary) //Checks if polychrome is enabled - update_icon() //Applies the overlays and default colors onto the clothes on spawn. /obj/item/clothing/MouseDrop(atom/over_object) . = ..() @@ -150,8 +137,6 @@ how_cool_are_your_threads += "Adding or removing items from [src] makes no noise.\n" how_cool_are_your_threads += "" . += how_cool_are_your_threads.Join() - if(hasprimary | hassecondary | hastertiary) //Checks if polychrome is enabled - . += "Alt-click to recolor it." /obj/item/clothing/obj_break(damage_flag) if(!damaged_clothes) @@ -195,173 +180,6 @@ BLIND // can't see anything female_clothing_icon = fcopy_rsc(female_clothing_icon) GLOB.female_clothing_icons[index] = female_clothing_icon -/obj/item/clothing/under/verb/toggle() - set name = "Adjust Suit Sensors" - set category = "Object" - set src in usr - var/mob/M = usr - if (istype(M, /mob/dead/)) - return - if (!can_use(M)) - return - if(src.has_sensor == LOCKED_SENSORS) - to_chat(usr, "The controls are locked.") - return 0 - if(src.has_sensor == BROKEN_SENSORS) - to_chat(usr, "The sensors have shorted out!") - return 0 - if(src.has_sensor <= NO_SENSORS) - to_chat(usr, "This suit does not have any sensors.") - return 0 - - var/list/modes = list("Off", "Binary vitals", "Exact vitals", "Tracking beacon") - var/switchMode = input("Select a sensor mode:", "Suit Sensor Mode", modes[sensor_mode + 1]) in modes - if(get_dist(usr, src) > 1) - to_chat(usr, "You have moved too far away!") - return - sensor_mode = modes.Find(switchMode) - 1 - - if (src.loc == usr) - switch(sensor_mode) - if(0) - to_chat(usr, "You disable your suit's remote sensing equipment.") - if(1) - to_chat(usr, "Your suit will now only report whether you are alive or dead.") - if(2) - to_chat(usr, "Your suit will now only report your exact vital lifesigns.") - if(3) - to_chat(usr, "Your suit will now report your exact vital lifesigns as well as your coordinate position.") - - if(ishuman(loc)) - var/mob/living/carbon/human/H = loc - if(H.w_uniform == src) - H.update_suit_sensors() - - -/obj/item/clothing/under/CtrlClick(mob/user) - . = ..() - - if (!(item_flags & IN_INVENTORY)) - return - - if(!isliving(user) || !user.canUseTopic(src, BE_CLOSE, ismonkey(user))) - return - - if(has_sensor == LOCKED_SENSORS) - to_chat(user, "The controls are locked.") - return - if(has_sensor == BROKEN_SENSORS) - to_chat(user, "The sensors have shorted out!") - return - if(has_sensor <= NO_SENSORS) - to_chat(user, "This suit does not have any sensors.") - return - - sensor_mode = SENSOR_COORDS - - to_chat(user, "Your suit will now report your exact vital lifesigns as well as your coordinate position.") - - if(ishuman(user)) - var/mob/living/carbon/human/H = user - if(H.w_uniform == src) - H.update_suit_sensors() - -/obj/item/clothing/under/AltClick(mob/user) - . = ..() - if(!istype(user) || !user.canUseTopic(src, BE_CLOSE, ismonkey(user))) - return - if(attached_accessory) - remove_accessory(user) - else - rolldown() - // Polychrome stuff: - if(hasprimary | hassecondary | hastertiary) - var/choice = input(user,"polychromic thread options", "Clothing Recolor") as null|anything in list("[hasprimary ? "Primary Color" : ""]", "[hassecondary ? "Secondary Color" : ""]", "[hastertiary ? "Tertiary Color" : ""]") //generates a list depending on the enabled overlays - switch(choice) //Lets the list's options actually lead to something - if("Primary Color") - var/primary_color_input = input(usr,"","Choose Primary Color",primary_color) as color|null //color input menu, the "|null" adds a cancel button to it. - if(primary_color_input) //Checks if the color selected is NULL, rejects it if it is NULL. - primary_color = sanitize_hexcolor(primary_color_input, desired_format=6, include_crunch=1) //formats the selected color properly - update_icon() //updates the item icon - user.regenerate_icons() //updates the worn icon. Probably a bad idea, but it works. - if("Secondary Color") - var/secondary_color_input = input(usr,"","Choose Secondary Color",secondary_color) as color|null - if(secondary_color_input) - secondary_color = sanitize_hexcolor(secondary_color_input, desired_format=6, include_crunch=1) - update_icon() - user.regenerate_icons() - if("Tertiary Color") - var/tertiary_color_input = input(usr,"","Choose Tertiary Color",tertiary_color) as color|null - if(tertiary_color_input) - tertiary_color = sanitize_hexcolor(tertiary_color_input, desired_format=6, include_crunch=1) - update_icon() - user.regenerate_icons() - return TRUE - -/obj/item/clothing/neck/AltClick(mob/user) - . = ..() - if(!istype(user) || !user.canUseTopic(src, BE_CLOSE, ismonkey(user))) - return - // Polychrome stuff: - if(hasprimary | hassecondary | hastertiary) - var/choice = input(user,"polychromic thread options", "Clothing Recolor") as null|anything in list("[hasprimary ? "Primary Color" : ""]", "[hassecondary ? "Secondary Color" : ""]", "[hastertiary ? "Tertiary Color" : ""]") //generates a list depending on the enabled overlays - switch(choice) //Lets the list's options actually lead to something - if("Primary Color") - var/primary_color_input = input(usr,"","Choose Primary Color",primary_color) as color|null //color input menu, the "|null" adds a cancel button to it. - if(primary_color_input) //Checks if the color selected is NULL, rejects it if it is NULL. - primary_color = sanitize_hexcolor(primary_color_input, desired_format=6, include_crunch=1) //formats the selected color properly - update_icon() //updates the item icon - user.regenerate_icons() //updates the worn icon. Probably a bad idea, but it works. - if("Secondary Color") - var/secondary_color_input = input(usr,"","Choose Secondary Color",secondary_color) as color|null - if(secondary_color_input) - secondary_color = sanitize_hexcolor(secondary_color_input, desired_format=6, include_crunch=1) - update_icon() - user.regenerate_icons() - if("Tertiary Color") - var/tertiary_color_input = input(usr,"","Choose Tertiary Color",tertiary_color) as color|null - if(tertiary_color_input) - tertiary_color = sanitize_hexcolor(tertiary_color_input, desired_format=6, include_crunch=1) - update_icon() - user.regenerate_icons() - return TRUE - -/obj/item/clothing/under/verb/jumpsuit_adjust() - set name = "Adjust Jumpsuit Style" - set category = null - set src in usr - rolldown() - -/obj/item/clothing/under/proc/rolldown() - if(!can_use(usr)) - return - if(!can_adjust) - to_chat(usr, "You cannot wear this suit any differently!") - return - if(toggle_jumpsuit_adjust()) - to_chat(usr, "You adjust the suit to wear it more casually.") - else - to_chat(usr, "You adjust the suit back to normal.") - if(ishuman(usr)) - var/mob/living/carbon/human/H = usr - H.update_inv_w_uniform() - H.update_body() - -/obj/item/clothing/under/proc/toggle_jumpsuit_adjust() - adjusted = !adjusted - - if(adjusted) - if(fitted != FEMALE_UNIFORM_TOP) - fitted = NO_FEMALE_UNIFORM - if(!alt_covers_chest) // for the special snowflake suits that expose the chest when adjusted - body_parts_covered &= ~CHEST - else - fitted = initial(fitted) - if(!alt_covers_chest) - body_parts_covered |= CHEST - - return adjusted - /obj/item/clothing/proc/weldingvisortoggle(mob/user) //proc to toggle welding visors on helmets, masks, goggles, etc. if(!can_use(user)) return FALSE @@ -441,15 +259,3 @@ BLIND // can't see anything return FALSE return TRUE - -/obj/item/clothing/update_overlays() // Polychrome stuff - . = ..() - if(hasprimary) //Checks if the overlay is enabled - var/mutable_appearance/primary_overlay = mutable_appearance(icon, "[item_state]-primary", color = primary_color) //Automagically picks overlays - . += primary_overlay //Applies the coloured overlay onto the item sprite. but NOT the mob sprite. - if(hassecondary) - var/mutable_appearance/secondary_overlay = mutable_appearance(icon, "[item_state]-secondary", color = secondary_color) - . += secondary_overlay - if(hastertiary) - var/mutable_appearance/tertiary_overlay = mutable_appearance(icon, "[item_state]-tertiary", color = tertiary_color) - . += tertiary_overlay diff --git a/code/modules/clothing/neck/_neck.dm b/code/modules/clothing/neck/_neck.dm index f775fca203..33666d2b00 100644 --- a/code/modules/clothing/neck/_neck.dm +++ b/code/modules/clothing/neck/_neck.dm @@ -169,54 +169,44 @@ name = "pet collar" desc = "It's for pets. Though you probably could wear it yourself, you'd doubtless be the subject of ridicule. It seems to be made out of a polychromic material." icon_state = "petcollar" - mob_overlay_icon = 'icons/mob/clothing/neck.dmi' //Because, as it appears, the item itself is normally not directly aware of its worn overlays, so this is about the easiest way, without adding a new var. - hasprimary = TRUE - primary_color = "#00BBBB" pocket_storage_component_path = /datum/component/storage/concrete/pockets/small/collar + var/poly_states = 1 + var/poly_colors = list("#00BBBB") var/tagname = null + var/treat_path = /obj/item/reagent_containers/food/snacks/cookie + +/obj/item/clothing/neck/petcollar/Initialize() + . = ..() + if(treat_path) + new treat_path(src) + +/obj/item/clothing/neck/petcollar/ComponentInitialize() + . = ..() + if(!poly_states) + return + AddElement(/datum/element/polychromic, poly_colors, poly_states) /obj/item/clothing/neck/petcollar/attack_self(mob/user) tagname = stripped_input(user, "Would you like to change the name on the tag?", "Name your new pet", "Spot", MAX_NAME_LEN) name = "[initial(name)] - [tagname]" -/obj/item/clothing/neck/petcollar/worn_overlays(isinhands, icon_file, used_state, style_flags = NONE) - . = ..() - if(hasprimary | hassecondary | hastertiary) - if(!isinhands) //prevents the worn sprites from showing up if you're just holding them - if(hasprimary) //checks if overlays are enabled - var/mutable_appearance/primary_worn = mutable_appearance(mob_overlay_icon, "[icon_state]-primary") //automagical sprite selection - primary_worn.color = primary_color //colors the overlay - . += primary_worn //adds the overlay onto the buffer list to draw on the mob sprite - if(hassecondary) - var/mutable_appearance/secondary_worn = mutable_appearance(mob_overlay_icon, "[icon_state]-secondary") - secondary_worn.color = secondary_color - . += secondary_worn - if(hastertiary) - var/mutable_appearance/tertiary_worn = mutable_appearance(mob_overlay_icon, "[icon_state]-tertiary") - tertiary_worn.color = tertiary_color - . += tertiary_worn - /obj/item/clothing/neck/petcollar/leather name = "leather pet collar" icon_state = "leathercollar" - - hasprimary = TRUE - hassecondary = TRUE - primary_color = "#222222" - secondary_color = "#888888" + poly_states = 2 + poly_colors = list("#222222", "#888888") /obj/item/clothing/neck/petcollar/choker desc = "Quite fashionable... if you're somebody who's just read their first BDSM-themed erotica novel." name = "choker" icon_state = "choker" - - hasprimary = TRUE - primary_color = "#222222" + poly_colors = list("#222222") /obj/item/clothing/neck/petcollar/locked name = "locked collar" desc = "A collar that has a small lock on it to keep it from being removed." pocket_storage_component_path = /datum/component/storage/concrete/pockets/small/collar/locked + treat_path = /obj/item/key/collar var/lock = FALSE /obj/item/clothing/neck/petcollar/locked/attackby(obj/item/K, mob/user, params) @@ -238,32 +228,19 @@ /obj/item/clothing/neck/petcollar/locked/leather name = "leather pet collar" icon_state = "leathercollar" - - hasprimary = TRUE - hassecondary = TRUE - primary_color = "#222222" - secondary_color = "#888888" + poly_states = 2 + poly_colors = list("#222222", "#888888") /obj/item/clothing/neck/petcollar/locked/choker name = "choker" desc = "Quite fashionable... if you're somebody who's just read their first BDSM-themed erotica novel." icon_state = "choker" - - hasprimary = TRUE - primary_color = "#222222" + poly_colors = list("#222222") /obj/item/key/collar name = "Collar Key" desc = "A key for a tiny lock on a collar or bag." -/obj/item/clothing/neck/petcollar/Initialize() - . = ..() - new /obj/item/reagent_containers/food/snacks/cookie(src) - -/obj/item/clothing/neck/petcollar/locked/Initialize() - . = ..() - new /obj/item/key/collar(src) - ////////////// //DOPE BLING// ////////////// diff --git a/code/modules/clothing/suits/cloaks.dm b/code/modules/clothing/suits/cloaks.dm index 7d56fbe6dd..ce3d2576f9 100644 --- a/code/modules/clothing/suits/cloaks.dm +++ b/code/modules/clothing/suits/cloaks.dm @@ -91,3 +91,14 @@ heat_protection = HEAD max_heat_protection_temperature = FIRE_IMMUNITY_MAX_TEMP_PROTECT resistance_flags = FIRE_PROOF | ACID_PROOF | GOLIATH_RESISTANCE + +/obj/item/clothing/neck/cloak/polychromic + name = "polychromic cloak" + desc = "For when you want to show off your horrible colour coordination skills." + icon_state = "polyce" + item_state = "qmcloak" + var/list/poly_colors = list("#FFFFFF", "#FFFFFF", "#808080") + +/obj/item/clothing/neck/cloak/polychromic/ComponentInitialize() + . = ..() + AddElement(/datum/element/polychromic, poly_colors, 3) diff --git a/code/modules/clothing/suits/miscellaneous.dm b/code/modules/clothing/suits/miscellaneous.dm index 71f04afc9c..c133ea7c88 100644 --- a/code/modules/clothing/suits/miscellaneous.dm +++ b/code/modules/clothing/suits/miscellaneous.dm @@ -974,70 +974,11 @@ icon_state = "coatpoly" item_state = "coatpoly" hoodtype = /obj/item/clothing/head/hooded/winterhood/polychromic - hasprimary = TRUE - hassecondary = TRUE - hastertiary = TRUE - primary_color = "#6A6964" - secondary_color = "#C4B8A6" - tertiary_color = "#0000FF" + +/obj/item/clothing/suit/hooded/wintercoat/ComponentInitialize() + . = ..() + AddElement(/datum/element/polychromic, list("#6A6964", "#C4B8A6", "#0000FF"), 3) /obj/item/clothing/head/hooded/winterhood/polychromic icon_state = "winterhood_poly" item_state = "winterhood_poly" - -/obj/item/clothing/head/hooded/winterhood/polychromic/worn_overlays(isinhands, icon_file, used_state, style_flags = NONE) //this is where the main magic happens. - . = ..() - if(suit.hasprimary | suit.hassecondary) - if(!isinhands) //prevents the worn sprites from showing up if you're just holding them - if(suit.hasprimary) //checks if overlays are enabled - var/mutable_appearance/primary_worn = mutable_appearance(icon_file, "[icon_state]-primary") //automagical sprite selection - primary_worn.color = suit.primary_color //colors the overlay - . += primary_worn //adds the overlay onto the buffer list to draw on the mob sprite. - if(suit.hassecondary) - var/mutable_appearance/secondary_worn = mutable_appearance(icon_file, "[icon_state]-secondary") - secondary_worn.color = suit.secondary_color - . += secondary_worn - -/obj/item/clothing/suit/hooded/wintercoat/polychromic/worn_overlays(isinhands, icon_file, used_state, style_flags = NONE) //this is where the main magic happens. - . = ..() - if(hasprimary | hassecondary | hastertiary) - if(!isinhands) //prevents the worn sprites from showing up if you're just holding them - if(hasprimary) //checks if overlays are enabled - var/mutable_appearance/primary_worn = mutable_appearance(icon_file, "[icon_state]-primary[suittoggled ? "_t" : ""]") //automagical sprite selection - primary_worn.color = primary_color //colors the overlay - . += primary_worn //adds the overlay onto the buffer list to draw on the mob sprite. - if(hassecondary) - var/mutable_appearance/secondary_worn = mutable_appearance(icon_file, "[icon_state]-secondary[suittoggled ? "_t" : ""]") - secondary_worn.color = secondary_color - . += secondary_worn - if(hastertiary) - var/mutable_appearance/tertiary_worn = mutable_appearance(icon_file, "[icon_state]-tertiary[suittoggled ? "_t" : ""]") - tertiary_worn.color = tertiary_color - . += tertiary_worn - -/obj/item/clothing/suit/hooded/wintercoat/AltClick(mob/user) - . = ..() - if(!istype(user) || !user.canUseTopic(src, BE_CLOSE, ismonkey(user))) - return - if(hasprimary | hassecondary | hastertiary) - var/choice = input(user,"polychromic thread options", "Clothing Recolor") as null|anything in list("[hasprimary ? "Primary Color" : ""]", "[hassecondary ? "Secondary Color" : ""]", "[hastertiary ? "Tertiary Color" : ""]") //generates a list depending on the enabled overlays - switch(choice) //Lets the list's options actually lead to something - if("Primary Color") - var/primary_color_input = input(usr,"","Choose Primary Color",primary_color) as color|null //color input menu, the "|null" adds a cancel button to it. - if(primary_color_input) //Checks if the color selected is NULL, rejects it if it is NULL. - primary_color = sanitize_hexcolor(primary_color_input, desired_format=6, include_crunch=1) //formats the selected color properly - update_icon() //updates the item icon - user.regenerate_icons() //updates the worn icon. Probably a bad idea, but it works. - if("Secondary Color") - var/secondary_color_input = input(usr,"","Choose Secondary Color",secondary_color) as color|null - if(secondary_color_input) - secondary_color = sanitize_hexcolor(secondary_color_input, desired_format=6, include_crunch=1) - update_icon() - user.regenerate_icons() - if("Tertiary Color") - var/tertiary_color_input = input(usr,"","Choose Tertiary Color",tertiary_color) as color|null - if(tertiary_color_input) - tertiary_color = sanitize_hexcolor(tertiary_color_input, desired_format=6, include_crunch=1) - update_icon() - user.regenerate_icons() - return TRUE diff --git a/code/modules/clothing/suits/toggles.dm b/code/modules/clothing/suits/toggles.dm index cbbd64ebcc..4f29eab6ab 100644 --- a/code/modules/clothing/suits/toggles.dm +++ b/code/modules/clothing/suits/toggles.dm @@ -6,7 +6,7 @@ var/hoodtype = /obj/item/clothing/head/hooded/winterhood //so the chaplain hoodie or other hoodies can override this /obj/item/clothing/suit/hooded/New() - MakeHood() + hood = MakeHelmet() ..() /obj/item/clothing/suit/hooded/Destroy() @@ -14,11 +14,15 @@ qdel(hood) hood = null -/obj/item/clothing/suit/hooded/proc/MakeHood() +/obj/item/clothing/suit/proc/MakeHelmet(obj/item/clothing/head/H) + SEND_SIGNAL(src, COMSIG_SUIT_MADE_HELMET, H) + return H + +/obj/item/clothing/suit/hooded/MakeHelmet(obj/item/clothing/head/hooded/H) if(!hood) - var/obj/item/clothing/head/hooded/W = new hoodtype(src) - W.suit = src - hood = W + H = new hoodtype(src) + H.suit = src + return ..() /obj/item/clothing/suit/hooded/ui_action_click() ToggleHood() @@ -125,7 +129,7 @@ //Hardsuit toggle code /obj/item/clothing/suit/space/hardsuit/Initialize() - MakeHelmet() + helmet = MakeHelmet() . = ..() /obj/item/clothing/suit/space/hardsuit/Destroy() @@ -140,13 +144,13 @@ suit.helmet = null return ..() -/obj/item/clothing/suit/space/hardsuit/proc/MakeHelmet() +/obj/item/clothing/suit/space/hardsuit/MakeHelmet(obj/item/clothing/head/helmet/space/hardsuit/H) if(!helmettype) return if(!helmet) - var/obj/item/clothing/head/helmet/space/hardsuit/W = new helmettype(src) - W.suit = src - helmet = W + H = new helmettype(src) + H.suit = src + return ..() /obj/item/clothing/suit/space/hardsuit/ui_action_click() ..() diff --git a/code/modules/clothing/under/_under.dm b/code/modules/clothing/under/_under.dm index 42783ab518..fe3aaf4bda 100644 --- a/code/modules/clothing/under/_under.dm +++ b/code/modules/clothing/under/_under.dm @@ -19,27 +19,13 @@ var/mutable_appearance/accessory_overlay /obj/item/clothing/under/worn_overlays(isinhands = FALSE, icon_file, used_state, style_flags = NONE) - . = list() + . = ..() if(isinhands) return if(damaged_clothes) . += mutable_appearance('icons/effects/item_damage.dmi', "damageduniform") if(blood_DNA) . += mutable_appearance('icons/effects/blood.dmi', "uniformblood", color = blood_DNA_to_color()) - if(accessory_overlay) - . += accessory_overlay - if(hasprimary) //checks if overlays are enabled - var/mutable_appearance/primary_worn = mutable_appearance(icon_file, "[icon_state]-primary") //automagical sprite selection - primary_worn.color = primary_color //colors the overlay - . += primary_worn //adds the overlay onto the buffer list to draw on the mob sprite. - if(hassecondary) - var/mutable_appearance/secondary_worn = mutable_appearance(icon_file, "[icon_state]-secondary") - secondary_worn.color = secondary_color - . += secondary_worn - if(hastertiary) - var/mutable_appearance/tertiary_worn = mutable_appearance(icon_file, "[icon_state]-tertiary") - tertiary_worn.color = tertiary_color - . += tertiary_worn /obj/item/clothing/under/attackby(obj/item/I, mob/user, params) if((has_sensor == BROKEN_SENSORS) && istype(I, /obj/item/stack/cable_coil)) @@ -167,5 +153,121 @@ if(attached_accessory) . += "\A [attached_accessory] is attached to it." +/obj/item/clothing/under/verb/toggle() + set name = "Adjust Suit Sensors" + set category = "Object" + set src in usr + var/mob/M = usr + if (istype(M, /mob/dead/)) + return + if (!can_use(M)) + return + if(src.has_sensor == LOCKED_SENSORS) + to_chat(usr, "The controls are locked.") + return 0 + if(src.has_sensor == BROKEN_SENSORS) + to_chat(usr, "The sensors have shorted out!") + return 0 + if(src.has_sensor <= NO_SENSORS) + to_chat(usr, "This suit does not have any sensors.") + return 0 + + var/list/modes = list("Off", "Binary vitals", "Exact vitals", "Tracking beacon") + var/switchMode = input("Select a sensor mode:", "Suit Sensor Mode", modes[sensor_mode + 1]) in modes + if(get_dist(usr, src) > 1) + to_chat(usr, "You have moved too far away!") + return + sensor_mode = modes.Find(switchMode) - 1 + + if (src.loc == usr) + switch(sensor_mode) + if(0) + to_chat(usr, "You disable your suit's remote sensing equipment.") + if(1) + to_chat(usr, "Your suit will now only report whether you are alive or dead.") + if(2) + to_chat(usr, "Your suit will now only report your exact vital lifesigns.") + if(3) + to_chat(usr, "Your suit will now report your exact vital lifesigns as well as your coordinate position.") + + if(ishuman(loc)) + var/mob/living/carbon/human/H = loc + if(H.w_uniform == src) + H.update_suit_sensors() + + +/obj/item/clothing/under/CtrlClick(mob/user) + . = ..() + + if (!(item_flags & IN_INVENTORY)) + return + + if(!isliving(user) || !user.canUseTopic(src, BE_CLOSE, ismonkey(user))) + return + + if(has_sensor == LOCKED_SENSORS) + to_chat(user, "The controls are locked.") + return + if(has_sensor == BROKEN_SENSORS) + to_chat(user, "The sensors have shorted out!") + return + if(has_sensor <= NO_SENSORS) + to_chat(user, "This suit does not have any sensors.") + return + + sensor_mode = SENSOR_COORDS + + to_chat(user, "Your suit will now report your exact vital lifesigns as well as your coordinate position.") + + if(ishuman(user)) + var/mob/living/carbon/human/H = user + if(H.w_uniform == src) + H.update_suit_sensors() + +/obj/item/clothing/under/AltClick(mob/user) + . = ..() + if(!istype(user) || !user.canUseTopic(src, BE_CLOSE, ismonkey(user))) + return + if(attached_accessory) + remove_accessory(user) + else + rolldown() + +/obj/item/clothing/under/verb/jumpsuit_adjust() + set name = "Adjust Jumpsuit Style" + set category = null + set src in usr + rolldown() + +/obj/item/clothing/under/proc/rolldown() + if(!can_use(usr)) + return + if(!can_adjust) + to_chat(usr, "You cannot wear this suit any differently!") + return + if(toggle_jumpsuit_adjust()) + to_chat(usr, "You adjust the suit to wear it more casually.") + else + to_chat(usr, "You adjust the suit back to normal.") + if(ishuman(usr)) + var/mob/living/carbon/human/H = usr + H.update_inv_w_uniform() + H.update_body() + +/obj/item/clothing/under/proc/toggle_jumpsuit_adjust() + adjusted = !adjusted + + if(adjusted) + if(fitted != FEMALE_UNIFORM_TOP) + fitted = NO_FEMALE_UNIFORM + if(!alt_covers_chest) // for the special snowflake suits that expose the chest when adjusted + body_parts_covered &= ~CHEST + else + fitted = initial(fitted) + if(!alt_covers_chest) + body_parts_covered |= CHEST + + return adjusted + /obj/item/clothing/under/rank dying_key = DYE_REGISTRY_UNDER diff --git a/code/modules/clothing/under/costume.dm b/code/modules/clothing/under/costume.dm index 7cbfe5abf5..69a1dc67b3 100644 --- a/code/modules/clothing/under/costume.dm +++ b/code/modules/clothing/under/costume.dm @@ -96,7 +96,7 @@ /obj/item/clothing/under/costume/kilt/polychromic/ComponentInitialize() . = ..() - AddElement(/datum/element/polychromic, list("#FFFFFF", "#F08080"), list("polykilt-primary", "polykilt-secondary"), null, POLYCHROMIC_ALTCLICK|POLYCHROMIC_NO_HELD|POLYCHROMIC_ACTION) + AddElement(/datum/element/polychromic, list("#FFFFFF", "#F08080"), 2) /obj/item/clothing/under/costume/gladiator name = "gladiator uniform" diff --git a/code/modules/clothing/under/miscellaneous.dm b/code/modules/clothing/under/miscellaneous.dm index a7557a0702..d475ca8100 100644 --- a/code/modules/clothing/under/miscellaneous.dm +++ b/code/modules/clothing/under/miscellaneous.dm @@ -241,69 +241,67 @@ desc = "A fancy button-up shirt made with polychromic threads." icon_state = "polysuit" item_state = "sl_suit" - hasprimary = TRUE - hassecondary = TRUE - hastertiary = TRUE - primary_color = "#FFFFFF" - secondary_color = "#353535" - tertiary_color = "#353535" mutantrace_variation = NONE +/obj/item/clothing/under/misc/poly_shirt/ComponentInitialize() + . = ..() + AddElement(/datum/element/polychromic, list("#FFFFFF", "#353535", "#353535"), 3) + /obj/item/clothing/under/misc/polyshorts name = "polychromic shorts" desc = "For ease of movement and style." icon_state = "polyshorts" item_state = "rainbow" - hasprimary = TRUE - hassecondary = TRUE - hastertiary = TRUE - primary_color = "#353535" - secondary_color = "#808080" - tertiary_color = "#808080" can_adjust = FALSE body_parts_covered = CHEST|GROIN|ARMS +/obj/item/clothing/under/misc/polyshorts/ComponentInitialize() + . = ..() + AddElement(/datum/element/polychromic, list("#353535", "#808080", "#808080"), 3) + /obj/item/clothing/under/misc/polyjumpsuit name = "polychromic tri-tone jumpsuit" desc = "A fancy jumpsuit made with polychromic threads." icon_state = "polyjump" item_state = "rainbow" - hasprimary = TRUE - hassecondary = TRUE - hastertiary = TRUE - primary_color = "#FFFFFF" - secondary_color = "#808080" - tertiary_color = "#FF3535" can_adjust = FALSE mutantrace_variation = NONE +/obj/item/clothing/under/misc/polyjumpsuit/ComponentInitialize() + . = ..() + AddElement(/datum/element/polychromic, list("#FFFFFF", "#808080", "#353535"), 3) + /obj/item/clothing/under/misc/poly_bottomless name = "polychromic bottomless shirt" - desc = "Great for showing off your junk in dubious style." + desc = "Great for showing off your underwear in dubious style." icon_state = "polybottomless" item_state = "rainbow" - primary_color = "#808080" - secondary_color = "#FF3535" body_parts_covered = CHEST|ARMS //Because there's no bottom included can_adjust = FALSE mutantrace_variation = NONE +/obj/item/clothing/under/misc/poly_bottomless/ComponentInitialize() + . = ..() + AddElement(/datum/element/polychromic, list("#808080", "#FF3535"), 2) + /obj/item/clothing/under/misc/poly_tanktop name = "polychromic tank top" desc = "For those lazy summer days." icon_state = "polyshimatank" item_state = "rainbow" - primary_color = "#808080" - secondary_color = "#FFFFFF" - tertiary_color = "#8CC6FF" body_parts_covered = CHEST|GROIN can_adjust = FALSE mutantrace_variation = NONE + var/list/poly_states = 3 + var/list/poly_colors = list("#808080", "#FFFFFF", "#8CC6FF") + +/obj/item/clothing/under/misc/poly_tanktop/ComponentInitialize() + . = ..() + AddElement(/datum/element/polychromic, poly_colors, poly_states) /obj/item/clothing/under/misc/poly_tanktop/female name = "polychromic feminine tank top" desc = "Great for showing off your chest in style. Not recommended for males." icon_state = "polyfemtankpantsu" - hastertiary = FALSE - primary_color = "#808080" - secondary_color = "#FF3535" + poly_states = 2 + poly_colors = list("#808080", "#FF3535") diff --git a/code/modules/clothing/under/shorts.dm b/code/modules/clothing/under/shorts.dm index ebf7cb5896..f61a41e4c3 100644 --- a/code/modules/clothing/under/shorts.dm +++ b/code/modules/clothing/under/shorts.dm @@ -35,19 +35,18 @@ desc = "95% Polychrome, 5% Spandex!" icon_state = "polyshortpants" item_state = "rainbow" - hasprimary = TRUE - hassecondary = TRUE - primary_color = "#FFFFFF" - secondary_color = "#F08080" mutantrace_variation = NONE + var/list/poly_colors = list("#FFFFFF", "#F08080") + +/obj/item/clothing/under/shorts/polychromic/ComponentInitialize() + . = ..() + AddElement(/datum/element/polychromic, poly_colors, 2) /obj/item/clothing/under/shorts/polychromic/pantsu name = "polychromic panties" desc = "Topless striped panties. Now with 120% more polychrome!" icon_state = "polypantsu" item_state = "rainbow" - hastertiary = FALSE - primary_color = "#FFFFFF" - secondary_color = "#8CC6FF" body_parts_covered = GROIN mutantrace_variation = NONE + poly_colors = list("#FFFFFF", "#8CC6FF") diff --git a/code/modules/clothing/under/skirt_dress.dm b/code/modules/clothing/under/skirt_dress.dm index f00e96d821..fa2c9eed71 100644 --- a/code/modules/clothing/under/skirt_dress.dm +++ b/code/modules/clothing/under/skirt_dress.dm @@ -211,21 +211,18 @@ desc = "A fancy skirt made with polychromic threads." icon_state = "polyskirt" item_state = "rainbow" - hasprimary = TRUE - hassecondary = TRUE - hastertiary = TRUE - primary_color = "#FFFFFF" - secondary_color = "#F08080" - tertiary_color = "#808080" mutantrace_variation = NONE + var/list/poly_colors = list("#FFFFFF", "#F08080", "#808080") + +/obj/item/clothing/under/dress/skirt/polychromic/ComponentInitialize() + . = ..() + AddElement(/datum/element/polychromic, poly_colors, 3) /obj/item/clothing/under/dress/skirt/polychromic/pleated name = "polychromic pleated skirt" desc = "A magnificent pleated skirt complements the woolen polychromatic sweater." icon_state = "polypleat" item_state = "rainbow" - primary_color = "#8CC6FF" - secondary_color = "#808080" - tertiary_color = "#FF3535" body_parts_covered = CHEST|GROIN|ARMS mutantrace_variation = NONE + poly_colors = list("#8CC6FF", "#808080", "#FF3535") diff --git a/code/modules/clothing/under/suits.dm b/code/modules/clothing/under/suits.dm index 3ee5204c3b..087262dd1e 100644 --- a/code/modules/clothing/under/suits.dm +++ b/code/modules/clothing/under/suits.dm @@ -109,11 +109,9 @@ desc = "For when you want to show off your horrible colour coordination skills." icon_state = "polysuit" item_state = "sl_suit" - hasprimary = TRUE - hassecondary = TRUE - hastertiary = TRUE - primary_color = "#FFFFFF" - secondary_color = "#FFFFFF" - tertiary_color = "#808080" can_adjust = FALSE mutantrace_variation = NONE + +/obj/item/clothing/under/suit/polychromic/ComponentInitialize() + . = ..() + AddElement(/datum/element/polychromic, list("#FFFFFF", "#FFFFFF", "#808080"), 3) diff --git a/icons/mob/clothing/head.dmi b/icons/mob/clothing/head.dmi index c499c236e36e363136e61b121b430ee0a94787b3..f2ea9fa55dc7b92f45665ae280be3722c8af95d1 100644 GIT binary patch delta 8017 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 C$vD6O diff --git a/icons/mob/clothing/neck.dmi b/icons/mob/clothing/neck.dmi index de59a136d99ca23e0b751b962395756793bcaafb..68fde7bff95931d53484b9bcb01221142988828d 100644 GIT binary patch literal 47399 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 F{}*HUlUe`( literal 45707 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˭+ynM8_{)Ni| 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 >%FmDPF@jm(^Lq(K+`udPkc3p3< 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 delta 1749 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 UItT-YItT=ZItT@~ItT{Ct)gLib^rhX delta 1806 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 L2?e($2?oXhCZA{P~wJ zzg<56`sL}$nw-ST^W~?%{`mCa=4_rW&zHad?dikBZk%%YCuPcie0jcn7uY&O{=26S z)@iytUw(S}Fen91m*>mJJ7;DW|Q5uzSPFct={hoMVF<14m{m9 z)~@$tW)xPoc)M$VeMU>#%=8WHA5R}Fd)h9~mydsW^Y>T z)p30mhGRBTKN&I%&H!7TwrHI}W>N0v?6f|};E-otr5EUhyphX5dw1aDALtC^sLamS zp}1}A!ZeyYgD zUT%OgBJa0%-mh%DQMvAmt#)Hco2)zE3(Y?Ho1`Mp+&WM)eOA5M~hJBrA_4cGR0&(rQ{3-hc#u2 zBL-uk#uuiTHd*61h@Sy-aB`U!idYy91A9+@X2#G=5d;-(^Mwfrmd_K-4p8qw8YbOk zihvKQY&*VkbaCuP(D%mFCj?HC2nZq+47nqT&8jW~H}oKpRwp1cq7(E~YB7^g4$)tp zoP{F#CkeNT1^-VJZWr{01@gct?7eXxJ{=d}l``UXwkuj+v43V&U^C~z%G{>=?Qa6) z34tQuf1MJ6Z8CL}BP-7x$HpEww#|WmW7~lKQ;&_1&Xaf`roZPJA#E_SOA`UQUn!fZ zt_4DHF-yoTc-r3MDKBHBcZ3dKv}7tG;_3onE@K< zVGRK=mkcQz1uj^c*>eWYr&ThmC%}sK(nC|RIwIGxV0m0Zk)ep{0q7`4aaz-Y9?IzNQxJD(7fNjH`R|DZAUxwjFh6JT`6qMcTU16LD z9NiNfDF2v`0A&I?&wJJpBl4#CUGRhF#541xm9FEC-Im&Zjw;8=#uW)T#P;wNnjZ2Nc~{=Yk=E--Sb2sexwf3 z;MxBbgu!yQ37_B><6f7Cw!Md#F#4>rMfsBD#^5t0jlOsIg(_w&{*Iz|=x!o|TK#nF zn$$XW<6MOG%Yz33UjE`#Vesx7wwRhN7pLK*w%i$b0~-!VTFCGMl!f1O^kBoM7u9fC z8ZPeJQc!evigArD<*Jl_CuIU6C#zCxqb(&=Jtgi5sA)W-=Nzw21#)~3#U4^0cJwrMTQPT*w?%R6=ft1f(tx9>&~Yn#yG8OfR)WYeIE#5=~* zw!#C4OtI9BuI&;{Q+g}eI5m8L?-<#;hSW>W5eca$Fa5VLjRyR{vuzEr{r4GvOr`c)l(v25jUMdSxlWIg0@U7LWTd2POuWlg$ z*Ql^ay@i=r;)qzkEOD&oz6%Eg5##J)y|OK3b<4uq0mWGd3Vfuf&N8@^g~iH})LHJp zs+j_#pJS_kvkdKLdR-}JR$23ac&KYi()*PS1?hlqGI*QBbGk7h

KY1-8!o;N3VO zUn<-sEGZhqK80HOGOWfy)m>rbxwSSFuM2Id3BAhJ)b>@jwt-(|YZ{PEpV~UG=~L4T zZ2ANbC_z5A=bJSIC>1Yam2J1sAO5z%_m`i4`+WHh{Ogye{{gzsMyw@~qELek35N{{ a0f!9<0*4I=1BVR>1cwa?1-A_e2Fo6`p>Xs7 diff --git a/icons/mob/clothing/uniform_digi.dmi b/icons/mob/clothing/uniform_digi.dmi index 9deb214335569dc3f88987f0f768b6be48fff785..6827581b8530877c7bb8691b9b2968daed005771 100644 GIT binary patch delta 1880 zcmV-e2dDV-fEDY26_6xx2Dc_pe`m z{q}qJ^|x=2XV&Z`bP)94ddF)C4Vl`8V;Qynvo=73CY z_7j>{Wt{b#Ne!RG(rFeO`R2a+V95;?MQ1HbE}+@4is-Me2GG=(4i* zLm)Guu(HMFF7*|E&3QHM9qgZv50(S1-E;T!;mzNh(>>MCE0CG86D@Uh8N$LKIx2Gl zS!Ih$T|snSbPnijzsI^FdS!!Xj&UB?cDGuUSrTHUqcSJVT$C*a7ADXFhd^e+P&uKvZS&p$?@*GbS$c>xx|fk$gZdsIxbKM)B(ksour;!k7^m z(y<=U7}8OC_`aDJo$J~{J`HjKoD7Aq_6?3<3}iha-ZL9rh74Vg8#*d85N;SSg z4IZyQaorDp3}NAZUSB8@bl1VGlRSilO_1Uk!V4vo-o01L2lgS`N00#*Qp>636WfS} zWvD>W=8~*(2CiBO_b2|Ymm@QQ#yl7Dsh>&70_j4|J{L-*KZ!;l_i>VU*?lBHweNUD zwT&Y+f<_97&MO#GEIKa9g0yjLCdNY>0)r(db)UF@r89t|z3K$SZnq?WUh^M-ed{lP z0e|!Xz@R@Eb=xfj(AR(oU`OTE0zuu*0TRDQ0NQI40BIs}P5KLpb2ku{aiIJ}#aXcb&i*KQi zM?^V)jDr?_P7>N{(6A7c& zdZu(kk&V02Xno<}MJbK-h03KqWT;yD4b`9=NAw#PE-AuNoQHkB=Z z2EK4cik6vt5Cx|>2g;F&1qW$r?v^5Wo?pwmbGn*&ayUtO~~diZ6C1tOVbK${?as||JEy1q?3~XG(q;3 zEaclq_Sq3|?dtymsQqyE0eWGvW)GxO14M226P7?>6j(QdAhh%eCMiJ0lXQZj z&;tYut`LNjw-~ru3PZ&~EG9ss0ZTez60am6b>$F%rr?Gl0VWtAE2R-R4C2YDn2AU@&>&zy;7Z*3vJ@pG1-T?T!Wx)sOw`Rv>#jNJQ;PDY6AhlV@*= zsHZeQN%<95wr9@ulf4dTqlZ9$X2R0N`zc`~C=@v5xnq$o&fg|EvjL+vNmfEVY}*=6 zn9RKc3&KZd6~m8S8cORZD7(Mag>gRN=-vuLd5_DE==yGbX^h`{k)ZJXttE)x-bbPX zj>aQ~@5N|%GU&-1J!y0nGe|}s(Vf0;SAs>iy=98g_s^(Xhb-tK?q3&wG>uTU=$7vN zevH1h9KnL;(Imw1?-7=}cN9VVXfmT^+W&h62#>Q(xPxzs+apU<_FkpL=MCm_y8Lefqs0V zOYWCsfpm730RNQcihg`*fj_mtpXLw3sdUV&ohvLT23C-9OG!Ne?3oL zOP?=10}@r{0=!u@q8WG+c|3~lvC49!H2G9-8|0#Xo>_aK@_nE-^)*erItiRFOh~cj zT7&p#Nr58V8yxm0B39Y63*TW_C*r0#YC4}Ss)yfW~y#7kANF6{5SUw-}X zm*2b3zkPW;vt~)Ld+L7r;XjWL7qP{4Pu<5KA0Hgc=*sp_E>yUGd+NRmY{iiO?(xBj z=I*Kc>G9#D6gYQJ-G>`zLaH*eN=}irE{x_v6001?Q6g6{Dk0@6Rnm*ZI%XWr9+}+8 zk&75aA_vJu*D84yO+Jlva3Bp-pJMiXUZhkx%Y{vmbA79gPnY_4pD9X7bv^KOSy}tR zlbKLh+2V4S`ika%yc+ig_VeR|WlwAO)O~pO>hIO*p6ci2$xPWLEp>Gn{K6nQDsu!` zWs6H)L3Cbp_ULTChPon(vOzS*I03fZtya^VB4VYZGDpl@lr07pCeQ*0PiDf;* z0f$GX$SI||bDu@2)J-Kws6#oOh3l&@9E(YHjYy}H7~o2O$!oM?kX3B9IEmIL83eh_ zGz|&52reWAkaq(r76WJ$zpRkzU7QrgjL49V z^?=5Zj;V+5n|aZ>t}P^SNEg7#koRlf;21_vRtWK)+2}H4=z84HQJH~o!{{>P?M`U$ zc>Rg%eqiu_3-|N-Oo5=g4rX1-gJ0PAR2)Nip@`DE_iFjTK4kj{GT=gLIktRa8_}=~ zO;EJCM5~;Et2X)j6Mxgok(oeao(oCrXHv32x{$NvLb3Fxqyfl%T*|xbJ`kYVcRZrn z#*vzYMhcP6D;QHOIxf+Iv~g@E#zPwdgC&>hK5SL4Pyqwp$3GuK^Rlj>@YAg1VgpBz_G5wAUs8(gft1{{R0zqc{5DQtISZqX0lE zAtA@;5^{W7H3K=jy-a~D`Y2QY>`|%!(7hS}O+fgBY|$;RL)1tjBVRw_ctqqD-$EY` zh;kTz2QB=_{Qz{UYrF*_m5pouh9ulFCZ!!_JWs2E& z%2^Bqhb0$^BPJNDc|9}5yrw0Nr{pIfvU5^+rij&pFmUi>CJZeUK~Q0t&rCqoc5*by zThxO~CC{mJPu+))?|%IF?ymlAD5Qpc=nF-EAaPW-J)b#B9QzSWm@!8Rfi7hNGXD)j ztR}NrR0?3T2Z=~^K-FFybZP1qFrggc(L9NTs?AptmWmaouP7`ROug@6BvLdkB|nPR zGo>4fY}}1T>k9{;l;T)lXu8y=JgS^dNH41Ht@oNHo)aLOUsPtcJ(gJyeqpS%scbQS z@R>7Gw9F(vDLBp9Qx1gG6byxgDaWSN%`BGjVHB9v!Rg;WClB`D4eonbRDj|Mzsx=< zpg~*TOHM%TL3!#;3V|Y!C@D`p$1!s~iYv-fAJ}H|W-RfVjr>xYghzfUZBvi@Qkv$( zvAl2GoVGP^Y@5(ItxfXJX>Hr0b6T5!CS>!cwh!3+sc8i^e`=c0AN2|q>Ex0Jnjm{i z7V_;QOLhd@yGq5ly0cysYCoLCLoY1WEI>LnK-6|WVF?sQfps$oLQ9`uk^)pbNhc@@ zJwUMF3PDJDi-D`9FjO4GVgfW8u%r_v@k#>Byx_6}y1rXq8sqm~Bq)4;YYF1F_mSv; zqw$F0dodcG40w?`Tne@ond8f>7!9$!D}MK^tW6OHcBqEwtRA&;L(dq*0fq+zfN^y3p< za=%0iq_cDK@K0&3==)hE5b$%cyCIoPinei3VJ(7;S<^^8{#>I6m;B5WdzE;Te#qX)eG+R+BUX?<9|x(mhsg4iqPe^%)P>4CzFy@w*5@seB}Rq_v`PUyU)LUdHfS<{G2HykU{2y bOb3Td2LXpn2Lgvo2Lp#p2L!iF2L&HFhsBC_ diff --git a/icons/obj/clothing/hats.dmi b/icons/obj/clothing/hats.dmi index 07d9c8cee6b8c5e2341a074263dd8132b4e672e0..2e0906ea20108632f2e31ffda05ac3eb1d3a7580 100644 GIT binary patch delta 15697 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 delta 15697 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 diff --git a/icons/obj/clothing/neck.dmi b/icons/obj/clothing/neck.dmi index 0bdaa36e6248c6651f423569e52749145389f88c..cf8e13292f622b8acbb91518d8171d6b88c15abc 100644 GIT binary patch delta 2981 zcmV;W3tIHD7PT3WBmq#dB@Y3A|Nj90)BwV(Hvpxj0KdQ8-Q5TX2(q%W(~1HA#sGIC z2XG+H-uow0fx*lc~zCSh4Ga`AlUFuy#BI zkqtw?%u9a;M#xoGA;o^DP}z}81H<~`2r3D4fe1@4Dj6Brg=j;Uwxu`rBr0kR9h2$~ zB^epDjxcg#qKro-?4YWD384Ke<2i`G68eeAdu zs=Ehysp?S#;gg$Z)E+Ho=eti=Rkv*zp8j9u^XcP$zdjxaJnj9#pg!&!c%dcq55CkA z28KdUA`A|{(i8ed^o0IVJz*dm3O|J~IHo7`4UCKoXaN0#qoacwz(6QG&I3+Nxbh8; zjScGoCr3uKfK#J?qgucaKgSW{0f5o5F%2LXI5{#o$rcJ2I5j#o#TE)o@X+{Bm@1Tr z`07Fk21duCQNB=oF9t?@kcOOz{+ENJen>;c#K3qs40Pk6p%%i4hJgiqH9QuCG~`TF z72@L@R2AZ991MVYn1BJw!G{p43JG!!Vub+O>#trje1jr?|K9xV4Mhje!Ss#?jJJP( zOT-@lh!qmlyx;Im;@rM|&BgswIJa-!wD1Lx4kh^B*7KR>!wG{?oLlz&KHub|wt)Rp zQ)KQ1ptqoRLQRuvPE0t2Zh*mHG^#0Jfd}=g#e@1K_(GvjI1Je*7#jiqF){sh6CndA z@SuM6c&vec3Xe7rTOU-fbg>!mpVJfflRUxkDLl4#eXx8WAy>S9SU!-D;~O7B6T>Zh zKp2}b>%N_c&60Sqd>|oPyaUkwutn2={=q?Lf7qfKKyXk@b88A3Ml9Cw?YnOXzTshL zf7qgFK-j-1LXPjHA|$&X0*2%)iz03zl%CCk>b`A%;CrPA89sqG@Pb={{Q__BC9?zv zq<^@;VG_0iz7rOH8w1T!fI)#b{EA(I9Ru0bLm9}e9x?+%A`1yViS%vk9iq-sfXYC2 z^^gYg^(zfzcQDF9m4p-^a>-1Dn|HCMs4|dmfIf-G_dkip?yzbp2!N!4f)EW9fbymu zP~vHS8Z@rIE<04+pCJ+ur#VcOh$4)s@tc1&$He-p-J!Bu7X`>|T^vA^aFE=?IE0va zv$0qUAMRXS{z~eE1f}j5fN*xUWqSKcFwK3<=gE^NPhD0#k(is)#FMGi{QR@gvM4~kbQ>o=- zM&YGWR1)rOW%m#>!VtQ}4|jGC4fK(;5a-pwqpAew)xl$`WG{;VkcTut6b$?i<{@X{ zJ{TzSkhCzd0EDX1kbsLos2U9o2nI!eV1}_yNIs;e0yu4> z+1r8+VzKX!=2ll%f51BC3_Mt0U;h#7m@*Iw1Q2VDW~sT+K!E^atoozQf>u=3RaBA2HrnyLgU1Q9byr_&Hs0)Tt`>)qprJKKj`47e2HoU^5A z00b_DIPYv}D8Q_aAevj7fj-E8YyV(#W1j;QQwxX*)d-sb#nb{~N;N{J&tzRJ)W_9I zLIb9kmPDTs#nQ4TOlC66%c9SSVqx}#ds|yNfM_nKbr38(;2fNb&%r)=DV-2r0&CN* zdOkT1`{?CNN_YvZ^sahOYmj^Vkj=pbVbJSBfPoDk)$`=YpN4(YXcOEOsF!+ZMq ztI}022VWRIm{$jnt`a~K;s^mvh$cK^?(6sv4k2m6!Z8r4MneLBBA*x;LgW)8P3Q`E zRg&I0V+&vb;B<|q#>E3R-82H;C*COuSaO`Z%9V&P6bK;J8qG;-qrv>EA6o$>m@_u% zyheChpN{u}{3}UNa*kyMt44#R+*-#lx1X-BKdG4}2m#G7EH%>vp+I!H4MAASl}doe z%`l*yNI+35M5DQXxVZl9w`-0M3Gcr$h-WMws3Z`tN+ciFump6rG}NylAp7q>L@ph$ z#1shDFcxv4n0Go2vm9SPjgRYqt^zKFc;swpy0c&4=T|Q|wSZVqjj%g_r)}>Q^2OrG ziRd$;Sh}<)g#L1N-X7sm{s{KbC&hyB5?H&kt3Go+9_w9+U`wvXyV(jv~l67oCF5>PB)H!a1B1|02cIhMe9w~@ br{3s)NRsDW;0Ddj00000NkvXXu0mjf(07OK delta 2591 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 B(yagh diff --git a/icons/obj/clothing/suits.dmi b/icons/obj/clothing/suits.dmi index 530cd61e6fd1e5cb9537a9f91887267b71bd0e94..607c26bb62ef0d3523f771d7176fd9f2ac266ae1 100644 GIT binary patch delta 1537 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 A0ssI2 diff --git a/icons/obj/clothing/uniforms.dmi b/icons/obj/clothing/uniforms.dmi index 55ec7669ba9cdc31b6ca4969319703a8738e3c9e..dfebe3815511ac769eec289436d3d340c2bfa981 100644 GIT binary patch delta 20853 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 delta 20629 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 diff --git a/modular_citadel/code/modules/clothing/suits/polychromic_cloaks.dm b/modular_citadel/code/modules/clothing/suits/polychromic_cloaks.dm deleted file mode 100644 index c2b7aab55f..0000000000 --- a/modular_citadel/code/modules/clothing/suits/polychromic_cloaks.dm +++ /dev/null @@ -1,38 +0,0 @@ -/obj/item/clothing/neck/cloak/polychromic //enables all three overlays to reduce copypasta and defines basic stuff - name = "polychromic cloak" - desc = "For when you want to show off your horrible colour coordination skills." - icon = 'modular_citadel/icons/polyclothes/item/neck.dmi' - mob_overlay_icon = 'modular_citadel/icons/polyclothes/mob/neck.dmi' - icon_state = "polyce" - item_state = "qmcloak" - hasprimary = TRUE - hassecondary = TRUE - hastertiary = TRUE - primary_color = "#FFFFFF" //RGB in hexcode - secondary_color = "#FFFFFF" - tertiary_color = "#808080" - -/obj/item/clothing/neck/cloak/polychromic/worn_overlays(isinhands, icon_file, used_state, style_flags = NONE) //this is where the main magic happens. - . = ..() - if(hasprimary | hassecondary | hastertiary) - if(!isinhands) //prevents the worn sprites from showing up if you're just holding them - if(hasprimary) //checks if overlays are enabled - var/mutable_appearance/primary_worn = mutable_appearance(mob_overlay_icon, "[icon_state]-primary") //automagical sprite selection - primary_worn.color = primary_color //colors the overlay - . += primary_worn //adds the overlay onto the buffer list to draw on the mob sprite. - if(hassecondary) - var/mutable_appearance/secondary_worn = mutable_appearance(mob_overlay_icon, "[icon_state]-secondary") - secondary_worn.color = secondary_color - . += secondary_worn - if(hastertiary) - var/mutable_appearance/tertiary_worn = mutable_appearance(mob_overlay_icon, "[icon_state]-tertiary") - tertiary_worn.color = tertiary_color - . += tertiary_worn - -/obj/item/clothing/neck/cloak/polychromic/polyce //DONATOR ITEM - name = "polychromic embroidered cloak" - desc = "A fancy cloak embroidered with polychromatic thread in a pattern that reminds one of the wielders of unlimited power." - icon_state = "polyce" - primary_color = "#808080" //RGB in hexcode - secondary_color = "#8CC6FF" - tertiary_color = "#FF3535" \ No newline at end of file diff --git a/modular_citadel/code/modules/custom_loadout/custom_items.dm b/modular_citadel/code/modules/custom_loadout/custom_items.dm index a9b502d629..bd377d6081 100644 --- a/modular_citadel/code/modules/custom_loadout/custom_items.dm +++ b/modular_citadel/code/modules/custom_loadout/custom_items.dm @@ -563,3 +563,8 @@ unique_reskin = list("Goodboye" = "fritz", "Badboye" = "fritz_bad") mutantrace_variation = NONE +/obj/item/clothing/neck/cloak/polychromic/polyce + name = "polychromic embroidered cloak" + desc = "A fancy cloak embroidered with polychromatic thread in a pattern that reminds one of the wielders of unlimited power." + icon_state = "polyce" + poly_colors = list("#808080", "#8CC6FF", "#FF3535") diff --git a/modular_citadel/icons/polyclothes/item/neck.dmi b/modular_citadel/icons/polyclothes/item/neck.dmi deleted file mode 100644 index e2792cf9d0f6513951f4c23c54c1e6dcd4135ae2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 633 zcmV-<0*3vGP)YnTGV!QaR&e!m0s9jGydXy0oR2Zn0004K zNklB?Uyc=}U@Fthu+dlX9`9v!f^^a$`TjPZQ{mL5t7MAi3O zqP&_2SmK%MgVy6)DIbh$qu#gv-h==YViOOF0Ob0nKga{n&~twF)^k8Z&B@_w4}fOz z`TgVN)B(+W;t$Xku^x>yu0ail3fFM1$I}SaaHPhQ2x=f=q^)MIO*T|kvl0LW9qF!c z2gPzKQe6foDW;1A049qB1c-{PNR+@r8A_Bu`9fr;|EbLT!ag*Gpu{eEG!3x75J>^N zwc&RFZ_U$<@#~e66u`DbGZMI$o{(8XqMy~UmasyC00012P)t-sz`(%& z|Notxotm1Osi~=~tgMfZkBp3r&d$!RuCCG1(aX!ry}iAgwp|=;h_*prD|N4xmE-0004WQchCV=-0C=2JR&a84_w-Y6@%7{?OD!tS%+FJ>RWQ*r;NmRLOex6# za*U0*I5Sc+(=$pSoZ^zil2jm5sUSb6GC5U=i!&v&s2HS+i!-e#F*g;&HbhsZTTqml zn^;sytn%X2gNLXCjh{sM(DV6=jQ+b1W!psK~#90?VF8u zqA(DJXF>vO6RN1x{=NTm?o4E@$_z=No}O)UISQTt_ag~Jt^!b0R8;gK#LJnuLe%~I z4ey)YWedcrvd&hOj!= zWB_9#0sBieiB%T~ob9^DO7f^TA-HW#7776pUcGf8NCZgs>>Zeb7pDNEj>QWiKvglp z7IgsJvVT=c0HF;?hi*(2;_}4bQWs?J%F&Wc5Ew!Aj|6NVq$VKKwl#6l(9#ruY970I z7Cd6tiRVGxbJfk930y|i+iL)3TsATQbwjeImq!I)*W{fu1E9+Hc%aFv zeIV?xPXY9}TMB?j0vHDLgVqNEzRdfx&x_myd?h@0LV}rI2P_}^X&RK%uzSq`cpd(LXZfq z@&Oru^8uJ+pfWWd0L}-9fc?dqyvhe;|CkSuh2~FqYCZrQ3P8*UPK#53%X~lt81n(W z7aP#?0SIk?F&~J_6MqZmd;qLW5c7eVvk3SQm3#nh@_|V?)jW*(0MNam2*CLO%$*5T zrsV^0lMe_0)D6j+ULF*HT@RcO%m9Rb4{|;LH#etKfP;sDd;ilB{6Pi?!1;jgPcC!^ z4_Xr>0FH3Z2S5Yhd|=L>Y_xnJ4M3Ie;XspD`#{)1p91JX&Id98;79<&0DjQ=K!BHo zKl!{UO#s*Vz_i@*v7e?vISn}A*B<};50^RH-jN`)dbIx^b0O#ibEDot~_G7yIivgBj34cAnn&J3ks9gGd!MZObU!d}QLD3TZ Y1(A#3{Jpcdz07*qoM6N<$g6Hs|Hvj+t diff --git a/tgstation.dme b/tgstation.dme index 84d74db295..5d0ca735bc 100755 --- a/tgstation.dme +++ b/tgstation.dme @@ -3291,7 +3291,6 @@ #include "modular_citadel\code\modules\client\verbs\who.dm" #include "modular_citadel\code\modules\clothing\neck.dm" #include "modular_citadel\code\modules\clothing\trek.dm" -#include "modular_citadel\code\modules\clothing\suits\polychromic_cloaks.dm" #include "modular_citadel\code\modules\clothing\suits\suits.dm" #include "modular_citadel\code\modules\custom_loadout\custom_items.dm" #include "modular_citadel\code\modules\custom_loadout\load_to_mob.dm" From 42ff9b1d35a46914a156c740a70b4875b9a56966 Mon Sep 17 00:00:00 2001 From: Ghommie <42542238+Ghommie@users.noreply.github.com> Date: Tue, 14 Apr 2020 01:23:26 +0200 Subject: [PATCH 099/113] Final test, fixes and parent calls. --- code/datums/elements/polychromic.dm | 61 +++++++++--------- code/game/objects/items/holy_weapons.dm | 2 +- code/game/objects/items/tanks/watertank.dm | 2 +- code/game/objects/items/tools/screwdriver.dm | 2 +- .../clockcult/clock_items/clockwork_slab.dm | 2 +- code/modules/antagonists/cult/cult_items.dm | 2 +- code/modules/clothing/glasses/_glasses.dm | 2 +- code/modules/clothing/gloves/_gloves.dm | 2 +- code/modules/clothing/head/_head.dm | 2 +- code/modules/clothing/head/misc_special.dm | 2 +- code/modules/clothing/masks/_masks.dm | 2 +- code/modules/clothing/neck/_neck.dm | 2 +- code/modules/clothing/shoes/_shoes.dm | 2 +- code/modules/food_and_drinks/pizzabox.dm | 2 +- icons/obj/clothing/cloaks.dmi | Bin 2114 -> 2616 bytes icons/obj/clothing/neck.dmi | Bin 3253 -> 2759 bytes 16 files changed, 42 insertions(+), 45 deletions(-) diff --git a/code/datums/elements/polychromic.dm b/code/datums/elements/polychromic.dm index f664ed9063..bce5a765fe 100644 --- a/code/datums/elements/polychromic.dm +++ b/code/datums/elements/polychromic.dm @@ -9,11 +9,10 @@ var/overlays_states //A list or a number of states. In the latter case, the atom icon_state/item_state will be used followed by a number. var/list/colors_by_atom = list() //list of color strings or mutable appearances, depending on the above variable. var/icon_file + var/worn_file //used in place of items' held or mob overlay icons if present. var/list/overlays_names //wrap numbers into text strings please. var/list/actions_by_atom = list() - var/list/already_updates_onmob = list() var/poly_flags - var/worn_file //used in place of items' held or mob overlay icons if present. var/static/list/suits_with_helmet_typecache = typecacheof(list(/obj/item/clothing/suit/hooded, /obj/item/clothing/suit/space/hardsuit)) var/list/helmet_by_suit //because poly winter coats exist. var/list/suit_by_helmet //Idem. @@ -58,11 +57,8 @@ if(_flags & POLYCHROMIC_ACTION) RegisterSignal(A, COMSIG_ITEM_EQUIPPED, .proc/grant_user_action) RegisterSignal(A, COMSIG_ITEM_DROPPED, .proc/remove_user_action) - if(!(_flags & POLYCHROMIC_NO_HELD) && !(_flags & POLYCHROMIC_NO_WORN)) - if(!SSdcs.GetElement(/datum/element/update_icon_updates_onmob)) - A.AddElement(/datum/element/update_icon_updates_onmob) - else - LAZYSET(already_updates_onmob, A, TRUE) + if(!(_flags & POLYCHROMIC_NO_WORN) || !(_flags & POLYCHROMIC_NO_HELD)) + A.AddElement(/datum/element/update_icon_updates_onmob) RegisterSignal(A, COMSIG_ITEM_WORN_OVERLAYS, .proc/apply_worn_overlays) if(suits_with_helmet_typecache[A.type]) RegisterSignal(A, COMSIG_SUIT_MADE_HELMET, .proc/register_helmet) @@ -83,19 +79,16 @@ qdel(P) UnregisterSignal(A, list(COMSIG_PARENT_EXAMINE, COMSIG_CLICK_ALT, COMSIG_ATOM_UPDATE_OVERLAYS, COMSIG_ITEM_EQUIPPED, COMSIG_ITEM_DROPPED, COMSIG_ITEM_WORN_OVERLAYS, COMSIG_SUIT_MADE_HELMET)) if(isitem(A)) - if(!(poly_flags & POLYCHROMIC_NO_HELD) && !(poly_flags & POLYCHROMIC_NO_WORN)) - if(!already_updates_onmob[A]) - A.RemoveElement(/datum/element/update_icon_updates_onmob) - else - LAZYREMOVE(already_updates_onmob, A) - var/obj/item/clothing/head/H = helmet_by_suit[A] - if(H) - UnregisterSignal(H, list(COMSIG_ATOM_UPDATE_OVERLAYS, COMSIG_ITEM_WORN_OVERLAYS, COMSIG_PARENT_QDELETING)) - LAZYREMOVE(helmet_by_suit, A) - LAZYREMOVE(suit_by_helmet, H) - colors_by_atom -= H - if(!QDELETED(H)) - H.update_icon() //removing the overlays + var/obj/item/clothing/head/H = helmet_by_suit[A] + if(H) + UnregisterSignal(H, list(COMSIG_ATOM_UPDATE_OVERLAYS, COMSIG_ITEM_WORN_OVERLAYS, COMSIG_PARENT_QDELETING)) + LAZYREMOVE(helmet_by_suit, A) + LAZYREMOVE(suit_by_helmet, H) + colors_by_atom -= H + if(!QDELETED(H)) + H.update_icon() //removing the overlays + if(!(poly_flags & POLYCHROMIC_NO_WORN) || !(poly_flags & POLYCHROMIC_NO_HELD)) + A.RemoveElement(/datum/element/update_icon_updates_onmob) if(!QDELETED(A) && ismob(A.loc)) var/mob/M = A.loc if(!(poly_flags & POLYCHROMIC_NO_HELD) && M.is_holding(A)) @@ -124,26 +117,29 @@ for(var/i in 1 to overlays_states) overlays += mutable_appearance(f_icon, "[used_state]-[i]", color = L[i]) else - for(var/I in 1 to length(overlays_states)) - var/mutable_appearance/M = L[I] - overlays += mutable_appearance(f_icon, overlays_states[I], color = M.color) + for(var/i in 1 to length(overlays_states)) + var/mutable_appearance/M = L[i] + overlays += mutable_appearance(f_icon, overlays_states[i], color = M.color) /datum/element/polychromic/proc/set_color(atom/source, mob/user) var/choice = input(user,"Polychromic options", "Recolor [source]") as null|anything in overlays_names if(!choice || QDELETED(source) || !user.canUseTopic(source, BE_CLOSE, NO_DEXTERY)) return - var/ncolor = input(user, "Polychromic options", "Choose [choice] Color") as color|null - if(!ncolor || QDELETED(source) || !user.canUseTopic(source, BE_CLOSE, NO_DEXTERY)) - return + var/index = overlays_names.Find(choice) var/list/L = colors_by_atom[source] if(!L) // Ummmmmh. return - var/K = L[overlays_names.Find(choice)] - if(istext(K)) - K = sanitize_hexcolor(ncolor, 6, TRUE, K) + var/mutable_appearance/M = L[index] + var/old_color = istype(M) ? M.color : M + var/ncolor = input(user, "Polychromic options", "Choose [choice] Color", old_color) as color|null + if(!ncolor || QDELETED(source) || !colors_by_atom[source] || !user.canUseTopic(source, BE_CLOSE, NO_DEXTERY)) + return + ncolor = sanitize_hexcolor(ncolor, 6, TRUE, old_color) + if(istype(M)) + M.color = ncolor else - var/mutable_appearance/M = K - M.color = sanitize_hexcolor(ncolor, 6, TRUE, M.color) + L[index] = ncolor + source.update_icon() return TRUE @@ -153,6 +149,7 @@ var/datum/action/polychromic/P = actions_by_atom[source] if(!P) P = new (source) + P.name = "Modify [source]'\s Colors" actions_by_atom[source] = P P.check_flags = AB_CHECK_RESTRAINED|AB_CHECK_STUN|AB_CHECK_CONSCIOUS RegisterSignal(P, COMSIG_ACTION_TRIGGER, .proc/activate_action) @@ -187,4 +184,4 @@ background_icon_state = "bg_polychromic" use_target_appearance = TRUE button_icon_state = null - target_appearance_matrix = list(0.75,0,0,0,0.75,0) + target_appearance_matrix = list(0.8,0,0,0,0.8,0) diff --git a/code/game/objects/items/holy_weapons.dm b/code/game/objects/items/holy_weapons.dm index 845d14ccff..ac60a322d8 100644 --- a/code/game/objects/items/holy_weapons.dm +++ b/code/game/objects/items/holy_weapons.dm @@ -304,7 +304,7 @@ var/shield_icon = "shield-red" /obj/item/nullrod/staff/worn_overlays(isinhands, icon_file, used_state, style_flags = NONE) - . = list() + . = ..() if(isinhands) . += mutable_appearance('icons/effects/effects.dmi', shield_icon, MOB_LAYER + 0.01) diff --git a/code/game/objects/items/tanks/watertank.dm b/code/game/objects/items/tanks/watertank.dm index 5210f00e99..6ff5dfc8ad 100644 --- a/code/game/objects/items/tanks/watertank.dm +++ b/code/game/objects/items/tanks/watertank.dm @@ -377,7 +377,7 @@ add_overlay(filling) /obj/item/reagent_containers/chemtank/worn_overlays(isinhands = FALSE, icon_file, used_state, style_flags = NONE) //apply chemcolor and level - . = list() + . = ..() //inhands + reagent_filling if(!isinhands && reagents.total_volume) var/mutable_appearance/filling = mutable_appearance('icons/obj/reagentfillings.dmi', "backpackmob-10") diff --git a/code/game/objects/items/tools/screwdriver.dm b/code/game/objects/items/tools/screwdriver.dm index 24fe73ba12..e9f517a9f1 100644 --- a/code/game/objects/items/tools/screwdriver.dm +++ b/code/game/objects/items/tools/screwdriver.dm @@ -54,7 +54,7 @@ . += base_overlay /obj/item/screwdriver/worn_overlays(isinhands = FALSE, icon_file, used_state, style_flags = NONE) - . = list() + . = ..() if(isinhands && random_color) var/mutable_appearance/M = mutable_appearance(icon_file, "screwdriver_head") M.appearance_flags = RESET_COLOR diff --git a/code/modules/antagonists/clockcult/clock_items/clockwork_slab.dm b/code/modules/antagonists/clockcult/clock_items/clockwork_slab.dm index e6045b2548..5837ac302d 100644 --- a/code/modules/antagonists/clockcult/clock_items/clockwork_slab.dm +++ b/code/modules/antagonists/clockcult/clock_items/clockwork_slab.dm @@ -122,7 +122,7 @@ addtimer(CALLBACK(src, .proc/check_on_mob, user), 1) //dropped is called before the item is out of the slot, so we need to check slightly later /obj/item/clockwork/slab/worn_overlays(isinhands = FALSE, icon_file, used_state, style_flags = NONE) - . = list() + . = ..() if(isinhands && item_state && inhand_overlay) var/mutable_appearance/M = mutable_appearance(icon_file, "slab_[inhand_overlay]") . += M diff --git a/code/modules/antagonists/cult/cult_items.dm b/code/modules/antagonists/cult/cult_items.dm index ea6bfa9b92..b05aa7f769 100644 --- a/code/modules/antagonists/cult/cult_items.dm +++ b/code/modules/antagonists/cult/cult_items.dm @@ -452,7 +452,7 @@ return BLOCK_NONE /obj/item/clothing/suit/hooded/cultrobes/cult_shield/worn_overlays(isinhands, icon_file, used_state, style_flags = NONE) - . = list() + . = ..() if(!isinhands && current_charges) . += mutable_appearance('icons/effects/cult_effects.dmi', "shield-cult", MOB_LAYER + 0.01) diff --git a/code/modules/clothing/glasses/_glasses.dm b/code/modules/clothing/glasses/_glasses.dm index 362e4a5605..8cbc416b2e 100644 --- a/code/modules/clothing/glasses/_glasses.dm +++ b/code/modules/clothing/glasses/_glasses.dm @@ -347,7 +347,7 @@ colored_before = TRUE /obj/item/clothing/glasses/sunglasses/blindfold/white/worn_overlays(isinhands = FALSE, icon_file, used_state, style_flags = NONE) - . = list() + . = ..() if(!isinhands && ishuman(loc) && !colored_before) var/mob/living/carbon/human/H = loc var/mutable_appearance/M = mutable_appearance('icons/mob/clothing/eyes.dmi', "blindfoldwhite") diff --git a/code/modules/clothing/gloves/_gloves.dm b/code/modules/clothing/gloves/_gloves.dm index 21ebeaa2bb..ddf5e4b584 100644 --- a/code/modules/clothing/gloves/_gloves.dm +++ b/code/modules/clothing/gloves/_gloves.dm @@ -27,7 +27,7 @@ return OXYLOSS /obj/item/clothing/gloves/worn_overlays(isinhands = FALSE, icon_file, used_state, style_flags = NONE) - . = list() + . = ..() if(!isinhands) if(damaged_clothes) . += mutable_appearance('icons/effects/item_damage.dmi', "damagedgloves") diff --git a/code/modules/clothing/head/_head.dm b/code/modules/clothing/head/_head.dm index 121217c128..475e7a4e51 100644 --- a/code/modules/clothing/head/_head.dm +++ b/code/modules/clothing/head/_head.dm @@ -49,7 +49,7 @@ /obj/item/clothing/head/worn_overlays(isinhands = FALSE, icon_file, used_state, style_flags = NONE) - . = list() + . = ..() if(!isinhands) if(damaged_clothes) . += mutable_appearance('icons/effects/item_damage.dmi', "damagedhelmet") diff --git a/code/modules/clothing/head/misc_special.dm b/code/modules/clothing/head/misc_special.dm index 4ef2970a24..9c96223a6f 100644 --- a/code/modules/clothing/head/misc_special.dm +++ b/code/modules/clothing/head/misc_special.dm @@ -205,7 +205,7 @@ icon_state = S.icon_state /obj/item/clothing/head/wig/worn_overlays(isinhands = FALSE, icon_file, used_state, style_flags = NONE) - . = list() + . = ..() if(!isinhands) var/datum/sprite_accessory/S = GLOB.hair_styles_list[hair_style] if(!S) diff --git a/code/modules/clothing/masks/_masks.dm b/code/modules/clothing/masks/_masks.dm index ac087fd9e2..7df38661e5 100644 --- a/code/modules/clothing/masks/_masks.dm +++ b/code/modules/clothing/masks/_masks.dm @@ -29,7 +29,7 @@ /obj/item/clothing/mask/proc/handle_speech() /obj/item/clothing/mask/worn_overlays(isinhands = FALSE, icon_file, used_state, style_flags = NONE) - . = list() + . = ..() if(!isinhands) if(body_parts_covered & HEAD) if(damaged_clothes) diff --git a/code/modules/clothing/neck/_neck.dm b/code/modules/clothing/neck/_neck.dm index 33666d2b00..402ea37f21 100644 --- a/code/modules/clothing/neck/_neck.dm +++ b/code/modules/clothing/neck/_neck.dm @@ -7,7 +7,7 @@ equip_delay_other = 40 /obj/item/clothing/neck/worn_overlays(isinhands = FALSE, icon_file, used_state, style_flags = NONE) - . = list() + . = ..() if(!isinhands) if(body_parts_covered & HEAD) if(damaged_clothes) diff --git a/code/modules/clothing/shoes/_shoes.dm b/code/modules/clothing/shoes/_shoes.dm index cc5e88c5d6..802dd7265e 100644 --- a/code/modules/clothing/shoes/_shoes.dm +++ b/code/modules/clothing/shoes/_shoes.dm @@ -50,7 +50,7 @@ last_blood_DNA = blood_dna[blood_dna.len] /obj/item/clothing/shoes/worn_overlays(isinhands = FALSE, icon_file, used_state, style_flags = NONE) - . = list() + . = ..() if(!isinhands) var/bloody = FALSE if(blood_DNA) diff --git a/code/modules/food_and_drinks/pizzabox.dm b/code/modules/food_and_drinks/pizzabox.dm index 3505a35487..94c8d7219c 100644 --- a/code/modules/food_and_drinks/pizzabox.dm +++ b/code/modules/food_and_drinks/pizzabox.dm @@ -87,7 +87,7 @@ add_overlay(tag_overlay) /obj/item/pizzabox/worn_overlays(isinhands, icon_file, used_state, style_flags = NONE) - . = list() + . = ..() var/current_offset = 2 if(isinhands) for(var/V in boxes) //add EXTRA BOX per box diff --git a/icons/obj/clothing/cloaks.dmi b/icons/obj/clothing/cloaks.dmi index dd1ae7d727541359971f603e226d63c94065b7f0..6f4de62cc06828e238bc3a9eba60c77316a9dac9 100644 GIT binary patch delta 2329 zcmV+!3Fh{~5V#aUiBL{Q4GJ0x0000DNk~Le0001h0001B2m=5B0OF*IdjJ3e8Bk1A zMZmzoKPCY{CILbx0bK!go0%1K?dpR=`2fKPE7%kfEWfsLIFWR0g;#?0|2tjk+~!Z zK|umSLIO@r0+HPzN>^3_S5^T`ObJ(31XorAKqdlGF9B{u4sb#TcSQwFOafR}16EZA zR#gg4O$2d73uQV2VmJXaQe;+D1aCwQbVLYaI00B!1Xfj(Aptsn0XIYeI!KKG8vrds z|Ns91DKh~@RRJk90XIb`C@3*8F?tmhumAu6M`i$EhMJn1si~=~tgP6I0|7-=9UUEv zjEn(edjVs7MMXu+%gX^#WdT%aJ3BkXv^BcAy0^Et0aR!JPjLWLcmYON0d9!_Uv^DR zO#-AK0cwN+Mp)S|+1b|C*3{J0+}zya;^NNE&H*?^0Xav&z`%FZ$9ez&00DGTPE!Ct z=GbNc005ekEdqOgiF9H?eokd_Dv`=`4T)7~M65z%Tnd#HT>V_Y(G379wU0_PkC&4G z00$>YL_t(&f$f)zR~tnX#urFPg_V#5X+mo&MB17J5G>SfRYEmwEr^yDi=y@Ys*n19 z)JL<)8cAT2P)cND2qYv>Nm2VBdhag9G;^0Dw6*HlZ#O%C6DH?;zrAzs48w7T3>h+1 zrmE`d>YD0m-Eos9-EnhmE#A807EOA?JMO8etLOQ;x_fJM>>C=aR%=6p4uaX-*l4ra z8XL_tg2iIDJDMDJyAHyR`U1f+mO0*I_4r01ozcb#-<3^&L6{ZSSK5fJtMp z(v@KD0Re-@+t}Dh0)Tud?63gUb$o9xGJtz;@4mXq5SSXAR;N?-c0#YAlEB>K^0-{U zfR*5}HC7T>><+=a(=7Xpj~Jn(@K5CCU| z<74MudG)o|$9%#WVhVO1hB+7?27uu=-h7MiWB{zHbE|4kOaUk`0swEr1HUi;$9%#$ zVN7^OaFaPur2_cDfBfC|&Y$NicO*>0G5{h8yg{6|0j z9zpa6T6YcA-KUD@(>zoH~NhK{EIIK2m6nH_4PLw_$n6Q z<_NF=+WVWe7*GJCWf33%F5*_acQ4O>*Vmu=ww?kg7Xk2{=P!LvM!1OzM+3;=F!+bVG7X?i zC)628BozuEm`bO?9mA0Rg&+vcWisF%0)|Y6APCRPavTuC@RaA-Jdl)Zc6xd?Ih&kb zSfB`kVp=1Jq!-f@1VA){1Xs|1KNBSYc zbSVH(28A600Hx*tT?vqZ31rA-vBLsD0W3zA&|8EUM3@jj=rdRWQLKbaj41?|fxIlM z-ZJ!k@CT_y08@~jVE{1l8MO-34g()$N zawQ1Gz#nh4pIasX=1OVo+Eqq^>TebODx^ zmp22L&*u?=1Xz=@tIFDc+Hb$FW+egurU3j`P!NJN0gwTI6#xk69FXIAR9x1}0YzGc zOCfVW1c0ll6h@#30L)^110bXaFrUlg5-^X8K|aS;0p!3M0F+9SQlfGI2*5v;S}CT0 zV1``?U=BiabFdP^W0@$!a5#@EQCwSx*o6R+0N!1@N<c*x;+o-G130!h5JhT0DQfd7R=QM^7eF(F3?z#-(x* zlQj&Q=BIceRD{`!)f%8#Ayi zfSb5TTod6=wt)JgHIJ;3lkt*8T z4FG8f*6>j{5@5Z&=qkGn0ILdD!tB4c#=-fW`iZ30*&T~?z#6x4e&7HcLso41AtPAQ%ZLw2OtUH-LlJ25!e<0tc189tBsDu9gV=P$~gZU`mgFwJY=ccz>W{%00000NkvXXu0mjf)e-J; delta 1843 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 a@h{p-KOfl+_P_uD002ovPDHLk0$_sZ4~8@V delta 2957 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 z Date: Tue, 14 Apr 2020 01:55:01 +0200 Subject: [PATCH 100/113] I knew using lazy helpers wouldn't have helped much. --- code/datums/elements/polychromic.dm | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/code/datums/elements/polychromic.dm b/code/datums/elements/polychromic.dm index bce5a765fe..1c438c86c5 100644 --- a/code/datums/elements/polychromic.dm +++ b/code/datums/elements/polychromic.dm @@ -14,8 +14,8 @@ var/list/actions_by_atom = list() var/poly_flags var/static/list/suits_with_helmet_typecache = typecacheof(list(/obj/item/clothing/suit/hooded, /obj/item/clothing/suit/space/hardsuit)) - var/list/helmet_by_suit //because poly winter coats exist. - var/list/suit_by_helmet //Idem. + var/list/helmet_by_suit = list() //because poly winter coats exist. + var/list/suit_by_helmet = list() //Idem. /datum/element/polychromic/Attach(datum/target, list/colors, states, _flags = POLYCHROMIC_ACTION|POLYCHROMIC_NO_HELD, _icon, _worn, list/names = list("Primary", "Secondary", "Tertiary", "Quaternary", "Quinary", "Senary")) . = ..() @@ -82,8 +82,8 @@ var/obj/item/clothing/head/H = helmet_by_suit[A] if(H) UnregisterSignal(H, list(COMSIG_ATOM_UPDATE_OVERLAYS, COMSIG_ITEM_WORN_OVERLAYS, COMSIG_PARENT_QDELETING)) - LAZYREMOVE(helmet_by_suit, A) - LAZYREMOVE(suit_by_helmet, H) + helmet_by_suit -= A + suit_by_helmet -= H colors_by_atom -= H if(!QDELETED(H)) H.update_icon() //removing the overlays @@ -166,8 +166,8 @@ examine_list += "Alt-click to recolor it." /datum/element/polychromic/proc/register_helmet(atom/source, obj/item/clothing/head/H) - LAZYSET(suit_by_helmet, H, source) - LAZYSET(helmet_by_suit, source, H) + suit_by_helmet[H] = source + helmet_by_suit[source] = H colors_by_atom[H] = colors_by_atom[source] RegisterSignal(H, COMSIG_ATOM_UPDATE_OVERLAYS, .proc/apply_overlays) RegisterSignal(H, COMSIG_ITEM_WORN_OVERLAYS, .proc/apply_worn_overlays) @@ -175,8 +175,8 @@ /datum/element/polychromic/proc/unregister_helmet(atom/source) var/obj/item/clothing/suit/S = suit_by_helmet[source] - LAZYREMOVE(suit_by_helmet, source) - LAZYREMOVE(helmet_by_suit, S) + suit_by_helmet -= source + helmet_by_suit -= S colors_by_atom -= source /datum/action/polychromic From ac36cd49a5b7459c544c4246f8b1521b880aa1eb Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Mon, 13 Apr 2020 19:10:49 -0500 Subject: [PATCH 101/113] Automatic changelog generation for PR #11379 [ci skip] --- html/changelogs/AutoChangeLog-pr-11379.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-11379.yml diff --git a/html/changelogs/AutoChangeLog-pr-11379.yml b/html/changelogs/AutoChangeLog-pr-11379.yml new file mode 100644 index 0000000000..319d4b2140 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-11379.yml @@ -0,0 +1,4 @@ +author: "Ghommie" +delete-after: True +changes: + - refactor: "refactored polychromic clothing into an element." From 2e2fc456326189c5e2d149477c29498069b5a242 Mon Sep 17 00:00:00 2001 From: Artur Date: Tue, 14 Apr 2020 09:28:43 +0300 Subject: [PATCH 102/113] Conflicting icon fix --- icons/mob/clothing/neck.dmi | Bin 47399 -> 47688 bytes icons/obj/clothing/neck.dmi | Bin 2759 -> 2897 bytes 2 files changed, 0 insertions(+), 0 deletions(-) diff --git a/icons/mob/clothing/neck.dmi b/icons/mob/clothing/neck.dmi index 68fde7bff95931d53484b9bcb01221142988828d..78073222cae4bfbe0b96d993cc5c5ee851bfe40d 100644 GIT binary patch delta 5070 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 U9yV##JP`FW);EQsb)BF54=E%Ypa1{> delta 4779 zcmXX~c|27A_a2m`vTsF<>}5?z*&-pbtL#IH5K^{?YhPl-N5~eDE&DoI##myMA~7?W zv1A?F*vB@;{BFP3_x;Cx-Fx24>zwC2=REh`fnEBtZTeJkx~pjtqQDF2Qz>>iE}rY+ z#)KQGCHu0M{wp!}XCJEFNTom2NMO^r5bR{B;E|^FP`d_L_r+j-c2dt?(Sm=rYFEhe zez}{OzcLm$s>&Ar{CL;W=9+cc(2-)K<`BL=_w@u z-SWKYFY-yzs{2KS`oQQ%Bh4Zyx!Z6tnA(bH@7eU>ItIEq(K}E{SuT#MF`YIhminXs z-XG5Cy1$ZabmFOM)|au}S>*=Z@izAik2=q2>0NMt#1)n5_c(UTKQpqA?p|G4SHFb( zjrx_bkaoO7jjC@G10DH0AJcPDO|~e)5@d*bLFBP}Olpc!OBvwLBaB=6fj{e#)xaa$ zv#Y!B-w@q>yP3uEk5B>d{J>0O^#p$9UQ>auf^hT_0oqR!E(mgHD90~0rL9?h3lapvE8NZqu-`cT% z*=71LaF`NGDK&5Opw}v-=L=}8C~7|qNHxK|ycrIz;rM@ZCCq+}h zGva?iYC3zHcFEUHde5Xa>DD7Wxumk))8ee7L*Dn?1N%SX=8Drr5327B^cyxfjN174 z#aQWRNvUQ?NZ%ER+mXu)Qp%J-*DwA^UL!JZF>!Y{II5A{N;p7v)f>xP$DDa6P{9Xwi#xPHeyX^S+z2dRPFI; zhBXRO=cwZW;2V&fPUj<=Ug*jVl)Lc1WyJIq>nvbi20IocJVj7)ajYVuz#CX+ls>(~ z@peXOjhS9k?o|kvg~|AM9&b;J;Me(yg9Vv^p~alG@M>bf8jFfYW*}GE{&`4Zc`2px z-^}J#uJ6p;_34nArxW1m5=1xmmtRnAvo=&xGNaMv%g^D>`ugINKw;>ZmF7+Z+P~=| z-(+)QpdjNdQT#l5p(xF6!2Xh_=rvYI07I&VJaH1{sN;F*Ei@}Bj+;y>jwG)T45$Lt zut8Jsm_o0yQB!*CzyR~--b_m)cyjVHH8X>-l6P%^B!L>o_PDJrzln}l+;ektspyF_ zQCqhA8vw%7 z8)r(G|D&Cv*VOKyAz(dnO=v)#*F60A6nF=zyKM9A)eG6p?^-dpNvuqYlpSF&b$Vw_ z=S-;fxV1KD-@PLbiQpB;KNsXc zQX-*OZ1Ksmg7s}P0x?J3pN@AqpMr%#p$7FfUx@`k%GTDF3GwTrtFNhK95Z8dLf@kl zEFuX#x6&2K0Evi8{IK(` zfU9e6k0}74wlEK270!wYCnw?FVUIRw-Q7B{c`24@^<@Co0TJDXvS?Ps9><|2-jR`$ zNr?rLbcKsIOqp)60OS>8<}pqPiImm?xplb3z52!8<(Jmc`QRr|h)peF8F#KKKG{J& z{v~n9=}07!VF_UQ)Z4qSs|&KYxcGc;%@)nzEScVo4Bg*ELxI1) zON?`eTEP_3M?&xf0%xLL)2YT_jhd)#k?#vipb_%7mtDIlrJa|NRQ&e3@6;(srAgl- z3uETI>}(6-aKUx1#F)=GT6A=D|FAZ#YASe+6}?(E>LEd;jk_0khnxU2GcFR;X$+=B z?)c$8%>WuU?-AGLHy1}AI7I_+IAu{!x8bN5dMv|aeTx_~ZSG=RCxx#8TeU%QT6MP# z%CZ|!=hFKW{x>5Gq{A=%*3F)yJ?B!H)VmyTuz(a$wA%X{vm=GSh3F-Y?`~4I3uryR zf~FsdUV}d`pWF%oxK4~pxGXDp7#SHAm6RUAkN@<-u4K?de*FBYbGamsS?~WBJf6R! zFBaV`@}^G|jGayBW(<|G?-~%mn|-gp{s_}Equ4Mm3qo=w;|)gGqjH@?y12e8Ng z#c{)0aLp=N3BwQ9uTJY)*+euoo$6{`wy@ooYNoS+b|^`Bm63Mi)w`db~Z;vmK8QC1U!CorLxwp z7KKC#X&-M!7Z*n;^+|_`0GG^y4qASmu#m9u0|f%DS)WC){yvSJmGy#>N>!+x zTAHDB_6i(5_j%-m$SlI?eYZ5I*!|{nAmB6_pVHO2e(ukgbsq!v){PKNt&lY*sR3zf%H4{4-abBC?8S{SNE>u{dCw;HZ^`}XaA@+yuuBJN+p#-8zbqI_31P1UWDt-AV? zYho{Sqq0sl0(QA7Io09SdywHW*b`-r2o=$#exADI13JOzf>E(lqstOjuN&57GK{>B z>Qqd)%S`hdQV7Go;*jr4FcFShvV4uIz`MZ(6Qb})EQ3C<_UQ86%tYOJ9g%Pf2sXiR}T0RHUs0vqMH;WfZSQfYK4$)T<%Bkbt@ zAA|YFLQ_5!zV6dJ>5f-KD9>06bHN3IPQ|BCc7lOW6^i{OqxbPH#&CM{`>Z6&b#hxd@puiNpuA}P>>(fm6paSlMvJE z0v4x71r9teJNrV$;KIrt?Z=PgIWgzowDk1!&j8oWOlv??5A6hLEV zV{230cF!^tud=}DAE9h(8EmMGzEKEqb(`n}D`FKYT@j;z!xI;Rx*R$*uN` z?J2Otn&N5$t4Pd6?l(D5uTL+a%~W5vmbCdCZ}VEiiuB_{peJ2NIkgU^!z#>lg=J+- z+4mT`jwE1U!Bp4U$i`)6@;z3%u)Dka)Qh1`3(w0I&k5J(OzJb2&$5}s_;=D8b$WW*x2dT~B;T}hYRakF_SO-qy`2E+ zj*Y#&l@pnU$LGB1d$a`hlt4V~rvM~zKtk!XdRlh>!S6>u0cUg;Up0p`akZSiD!yxk zfKW`!Zs|logW7=3Nj*3G8N02)haACA3REQ4`ky#|iW|#NiP$q9U8=*xqki$yo93xS z-jj?r6pxxizqQvf>s+5`b#*+ENdNZtYa(|FLg&ZOkSGUpp@V#{vdQB{TgbX2_bf7melcaTkinmIxs#SdVJs~v-Az8fI0?>=C>7={q2_5Y0*sV0$yHT z-=}CkPTc06cWJfN)fNAYpalMVDaj0(@oh&7O5h;xHo4iF?WYZf{lDBiIr4T=m>c6!jiB6Tf<_p z@0!j=hx%Cy$18je^!CT>(383{QXjoca)=|p-3d(L%3tHLa6g?fus^%w_&+$xb zR5N3pWkq3S<)9*1{bmKK|Jv*haab_J=yZerFZhXe@Mhsmy!MVhp$B59XCE?NaYrck zRs`9Ef3MIg?5y%QYvs!;Ji*~|x~+Q!{D|mui(9Q6&Ff^qX?1yd9Pm#}daZ@JbTGg3 zisS`}Bny?v$jA)1HP*a6VYzVnhg+kKt!?+m+wl`VQI#Q~q42)GKGtG~ot+&pPv8}g zgV1-)^v1*E*`c4GsjhxoD)>i2Pz{B(UYD~$wK|Fe6~Q-GM|EUNo)zv>W#`wsffW&n zKbo2eD$S{AK+mmh@m1SEGc$G8hQKK&7O_{+Z!R6fPYSH+bj#x=yVjovwI!TFy6%OL zsSCgQHzkGb_>fqDbrlj48X)dSXBgp2^-M;;f=p@B2oe+42rhiWV@{vKPi3$2JpiW< z$T%2gd9A%aiQh_u0)uhgWSk`@p%w_;XT>5kR87!1ocKM-45}`QF{xp5r^*bGV zcrUEHbK0#bX{BE{`N-N1xVskgZZ9;X0=x`EnxY2 z)@)Sr_JI9J5tRQqL{#JGjkYgVK23M|@-}vZ#kLQROId}v_VmQL#(B;J*x1-?Vsg|+ zmFw&33Xv&URBdf-lt*-YjOGXiz&x>z*A)u1qFsYUtX#f!Nt*9w zbzY|kv>Mq-y+IlsZWhMz4*6@-Ob?qK+u<=5+A-SdsFtMveWPBTe4+lg}rr zbJL9T?SjSpMZv*T;XY4UaRpgXH9c^{v;_^nNth{X;o#&Pk>6^d>s`L}2eVyW0HLF11CbL--nhWYd3Xz{;v9sFzp-AQFB*Muiaqu9vz`92ys-)&p$`bDZuOMfiAtT zE)ALdz_{o7cb2Da2epwU5ME^h+H*+BkPuwkWJQ{`mDEx1>QQ+43>vSeH#YGo$L-7) z?5) zQtaBLxjT^tL*PFXlKA`*o10U-wz_t6EEvsGoW*ePWQu3FH-Gv^YrgY0h%~xbJkM6S SzUXHNIPTst)vM8Uj`}}tIi!{V diff --git a/icons/obj/clothing/neck.dmi b/icons/obj/clothing/neck.dmi index 622f43ea56843baa5589405fdbe42e415e88a8b2..c4c9c94f48485b44001aaacbf20e7d46b50874ab 100644 GIT binary patch delta 2586 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 Date: Tue, 14 Apr 2020 09:30:14 +0300 Subject: [PATCH 103/113] Ghommies suggestions and renames a proc --- code/__HELPERS/unsorted.dm | 2 +- code/datums/components/crafting/recipes/recipes_clothing.dm | 2 +- code/game/machinery/cloning.dm | 4 ++-- code/modules/antagonists/bloodsucker/bloodsucker_life.dm | 3 +-- code/modules/antagonists/bloodsucker/powers/feed.dm | 2 +- code/modules/mob/living/carbon/carbon.dm | 2 +- code/modules/mob/living/carbon/human/species_types/vampire.dm | 4 ++-- 7 files changed, 9 insertions(+), 10 deletions(-) diff --git a/code/__HELPERS/unsorted.dm b/code/__HELPERS/unsorted.dm index 2cc8c48dd5..afa858afb7 100644 --- a/code/__HELPERS/unsorted.dm +++ b/code/__HELPERS/unsorted.dm @@ -1565,7 +1565,7 @@ GLOBAL_DATUM_INIT(dview_mob, /mob/dview, new) world.TgsChatBroadcast() //Checks to see if either the victim has a garlic necklace or garlic in their blood -/proc/sucking_checks(var/mob/living/carbon/target, check_neck, check_blood) +/proc/blood_sucking_checks(var/mob/living/carbon/target, check_neck, check_blood) //Bypass this if the target isnt carbon. if(!iscarbon(target)) return TRUE diff --git a/code/datums/components/crafting/recipes/recipes_clothing.dm b/code/datums/components/crafting/recipes/recipes_clothing.dm index fc1f4e25e5..b9e3c379b4 100644 --- a/code/datums/components/crafting/recipes/recipes_clothing.dm +++ b/code/datums/components/crafting/recipes/recipes_clothing.dm @@ -296,7 +296,7 @@ category = CAT_CLOTHING -/datum/crafting_recipe/wintercoat_cosmic +/datum/crafting_recipe/garlic_necklace name = "Garlic Necklace" result = /obj/item/clothing/neck/garlic_necklace reqs = list(/obj/item/reagent_containers/food/snacks/grown/garlic = 15, diff --git a/code/game/machinery/cloning.dm b/code/game/machinery/cloning.dm index b0132884ea..b4744ec254 100644 --- a/code/game/machinery/cloning.dm +++ b/code/game/machinery/cloning.dm @@ -142,6 +142,8 @@ if(!QDELETED(clonemind.current)) if(clonemind.current.stat != DEAD) //mind is associated with a non-dead body return FALSE + if(AmBloodsucker(clonemind.current)) //If the mind is a bloodsucker + return FALSE if(clonemind.current.suiciding) // Mind is associated with a body that is suiciding. return FALSE if(clonemind.active) //somebody is using that mind @@ -159,8 +161,6 @@ mess = TRUE update_icon() return FALSE - if(AmBloodsucker(clonemind)) //If the mind is a bloodsucker - return FALSE attempting = TRUE //One at a time!! countdown.start() diff --git a/code/modules/antagonists/bloodsucker/bloodsucker_life.dm b/code/modules/antagonists/bloodsucker/bloodsucker_life.dm index ae685c5603..efccb5591e 100644 --- a/code/modules/antagonists/bloodsucker/bloodsucker_life.dm +++ b/code/modules/antagonists/bloodsucker/bloodsucker_life.dm @@ -247,7 +247,7 @@ owner.current.apply_status_effect(STATUS_EFFECT_UNCONSCIOUS) ADD_TRAIT(owner.current, TRAIT_FAKEDEATH, "bloodsucker") // Come after UNCONSCIOUS or else it fails ADD_TRAIT(owner.current, TRAIT_NODEATH, "bloodsucker") // Without this, you'll just keep dying while you recover. - ADD_TRAIT(owner.current, TRAIT_RESISTHIGHPRESSURE, "bloodsucker") // So you can heal in 0 G. otherwise you just...heal forever. + ADD_TRAIT(owner.current, TRAIT_RESISTHIGHPRESSURE, "bloodsucker") // So you can heal in space. Otherwise you just...heal forever. ADD_TRAIT(owner.current, TRAIT_RESISTLOWPRESSURE, "bloodsucker") // Visuals owner.current.update_sight() @@ -260,7 +260,6 @@ /datum/antagonist/bloodsucker/proc/Torpor_End() owner.current.stat = SOFT_CRIT owner.current.remove_status_effect(STATUS_EFFECT_UNCONSCIOUS) - owner.current.cure_fakedeath("bloodsucker") REMOVE_TRAIT(owner.current, TRAIT_FAKEDEATH, "bloodsucker") REMOVE_TRAIT(owner.current, TRAIT_NODEATH, "bloodsucker") REMOVE_TRAIT(owner.current, TRAIT_RESISTHIGHPRESSURE, "bloodsucker") diff --git a/code/modules/antagonists/bloodsucker/powers/feed.dm b/code/modules/antagonists/bloodsucker/powers/feed.dm index 40e0dbd25a..8ac4fcebc1 100644 --- a/code/modules/antagonists/bloodsucker/powers/feed.dm +++ b/code/modules/antagonists/bloodsucker/powers/feed.dm @@ -300,7 +300,7 @@ SEND_SIGNAL(user, COMSIG_ADD_MOOD_EVENT, "drankkilled", /datum/mood_event/drankkilled) // BAD // in bloodsucker_life.dm /datum/action/bloodsucker/feed/ContinueActive(mob/living/user, mob/living/target) - return ..() && target && (!target_grappled || user.pulling == target) && sucking_checks(target, TRUE, TRUE) // Active, and still antag, + return ..() && target && (!target_grappled || user.pulling == target) && blood_sucking_checks(target, TRUE, TRUE) // Active, and still antag, // NOTE: We only care about pulling if target started off that way. Mostly only important for Aggressive feed. /datum/action/bloodsucker/feed/proc/ApplyVictimEffects(mob/living/target) diff --git a/code/modules/mob/living/carbon/carbon.dm b/code/modules/mob/living/carbon/carbon.dm index f0e94e4845..40b8de36c5 100644 --- a/code/modules/mob/living/carbon/carbon.dm +++ b/code/modules/mob/living/carbon/carbon.dm @@ -854,7 +854,7 @@ /mob/living/carbon/proc/can_defib() var/tlimit = DEFIB_TIME_LIMIT * 10 var/obj/item/organ/heart = getorgan(/obj/item/organ/heart) - if(suiciding || hellbound || HAS_TRAIT(src, TRAIT_HUSK) || AmBloodsucker()) + if(suiciding || hellbound || HAS_TRAIT(src, TRAIT_HUSK) || AmBloodsucker(src)) return if((world.time - timeofdeath) > tlimit) return diff --git a/code/modules/mob/living/carbon/human/species_types/vampire.dm b/code/modules/mob/living/carbon/human/species_types/vampire.dm index c4a9fdb086..415cd9889c 100644 --- a/code/modules/mob/living/carbon/human/species_types/vampire.dm +++ b/code/modules/mob/living/carbon/human/species_types/vampire.dm @@ -82,7 +82,7 @@ to_chat(H, "You're already full!") return //This checks whether or not they are wearing a garlic clove on their neck - if(!sucking_checks(victim, TRUE, FALSE)) + if(!blood_sucking_checks(victim, TRUE, FALSE)) return if(victim.stat == DEAD) to_chat(H, "You need a living victim!") @@ -96,7 +96,7 @@ to_chat(H, "[victim] is blessed! You stop just in time to avoid catching fire.") return //Here we check now for both the garlic cloves on the neck and for blood in the victims bloodstream. - if(!sucking_checks(victim, TRUE, TRUE)) + if(!blood_sucking_checks(victim, TRUE, TRUE)) return if(!do_after(H, 30, target = victim)) return From fb7dc7a54cf2660d745515772eefe6f05cdfbc70 Mon Sep 17 00:00:00 2001 From: Artur Date: Tue, 14 Apr 2020 09:42:11 +0300 Subject: [PATCH 104/113] Fucking icons --- code/game/machinery/cloning.dm | 4 ++-- code/modules/hydroponics/grown/garlic.dm | 1 - 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/code/game/machinery/cloning.dm b/code/game/machinery/cloning.dm index b4744ec254..bc0fec68ba 100644 --- a/code/game/machinery/cloning.dm +++ b/code/game/machinery/cloning.dm @@ -142,10 +142,10 @@ if(!QDELETED(clonemind.current)) if(clonemind.current.stat != DEAD) //mind is associated with a non-dead body return FALSE - if(AmBloodsucker(clonemind.current)) //If the mind is a bloodsucker - return FALSE if(clonemind.current.suiciding) // Mind is associated with a body that is suiciding. return FALSE + if(AmBloodsucker(clonemind.current)) //If the mind is a bloodsucker + return FALSE if(clonemind.active) //somebody is using that mind if( ckey(clonemind.key)!=ckey ) return FALSE diff --git a/code/modules/hydroponics/grown/garlic.dm b/code/modules/hydroponics/grown/garlic.dm index fd24376282..4184b85008 100644 --- a/code/modules/hydroponics/grown/garlic.dm +++ b/code/modules/hydroponics/grown/garlic.dm @@ -26,5 +26,4 @@ desc = "A clove of garlic on a cable, tied to itself in a circle, just might fit around your neck. For loonies people who fear getting their blood sucked." icon_state = "garlic_necklace" item_state = "garlic_necklace" - alternate_worn_icon = 'icons/mob/neck.dmi' \ No newline at end of file From 9c2a3fb4cc0a3daf37f038b72a3142408167a76e Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Tue, 14 Apr 2020 03:33:10 -0500 Subject: [PATCH 105/113] Automatic changelog generation for PR #11838 [ci skip] --- html/changelogs/AutoChangeLog-pr-11838.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-11838.yml diff --git a/html/changelogs/AutoChangeLog-pr-11838.yml b/html/changelogs/AutoChangeLog-pr-11838.yml new file mode 100644 index 0000000000..464448c138 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-11838.yml @@ -0,0 +1,4 @@ +author: "kappa-sama" +delete-after: True +changes: + - rscdel: "normies can no longer steal circuit codes" From ee3bd67756d16003258b6acb490673a23a0067f0 Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Tue, 14 Apr 2020 03:34:01 -0500 Subject: [PATCH 106/113] Automatic changelog generation for PR #11831 [ci skip] --- html/changelogs/AutoChangeLog-pr-11831.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-11831.yml diff --git a/html/changelogs/AutoChangeLog-pr-11831.yml b/html/changelogs/AutoChangeLog-pr-11831.yml new file mode 100644 index 0000000000..22b0e71692 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-11831.yml @@ -0,0 +1,4 @@ +author: "Ghommie" +delete-after: True +changes: + - bugfix: "fixed a few floaty sprite accessories." From ef2bfd74c251b091b7d967381efc4ce07ab16115 Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Tue, 14 Apr 2020 03:34:22 -0500 Subject: [PATCH 107/113] Automatic changelog generation for PR #11830 [ci skip] --- html/changelogs/AutoChangeLog-pr-11830.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-11830.yml diff --git a/html/changelogs/AutoChangeLog-pr-11830.yml b/html/changelogs/AutoChangeLog-pr-11830.yml new file mode 100644 index 0000000000..79d3e7656f --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-11830.yml @@ -0,0 +1,4 @@ +author: "Ghommie" +delete-after: True +changes: + - bugfix: "Fixed the phantom thief component, again." From fb82619bd306278308308950afc116ffb7097f4b Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Tue, 14 Apr 2020 03:34:48 -0500 Subject: [PATCH 108/113] Automatic changelog generation for PR #11829 [ci skip] --- html/changelogs/AutoChangeLog-pr-11829.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-11829.yml diff --git a/html/changelogs/AutoChangeLog-pr-11829.yml b/html/changelogs/AutoChangeLog-pr-11829.yml new file mode 100644 index 0000000000..5cf966cd02 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-11829.yml @@ -0,0 +1,4 @@ +author: "Ghommie" +delete-after: True +changes: + - bugfix: "Fixed a whacky miniature cell duping issue." From 4cd8f1b934ac5052656ad61e2495b4a4acecfb47 Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Tue, 14 Apr 2020 03:35:07 -0500 Subject: [PATCH 109/113] Automatic changelog generation for PR #11828 [ci skip] --- html/changelogs/AutoChangeLog-pr-11828.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-11828.yml diff --git a/html/changelogs/AutoChangeLog-pr-11828.yml b/html/changelogs/AutoChangeLog-pr-11828.yml new file mode 100644 index 0000000000..067963046f --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-11828.yml @@ -0,0 +1,4 @@ +author: "Ghommie" +delete-after: True +changes: + - bugfix: "Fixed toilet cistern loot spawning on the floor." From 3259d1392517b150b95a02353cd11ca7b5ea1f5c Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Tue, 14 Apr 2020 03:35:49 -0500 Subject: [PATCH 110/113] Automatic changelog generation for PR #11826 [ci skip] --- html/changelogs/AutoChangeLog-pr-11826.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-11826.yml diff --git a/html/changelogs/AutoChangeLog-pr-11826.yml b/html/changelogs/AutoChangeLog-pr-11826.yml new file mode 100644 index 0000000000..4ffe43239d --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-11826.yml @@ -0,0 +1,4 @@ +author: "Ghommie" +delete-after: True +changes: + - refactor: "Backend body size preferences." From d0b1a770bef2b831a1511bc6a0548d95708f6d44 Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Tue, 14 Apr 2020 03:37:39 -0500 Subject: [PATCH 111/113] Automatic changelog generation for PR #11655 [ci skip] --- html/changelogs/AutoChangeLog-pr-11655.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-11655.yml diff --git a/html/changelogs/AutoChangeLog-pr-11655.yml b/html/changelogs/AutoChangeLog-pr-11655.yml new file mode 100644 index 0000000000..7acbf5efa7 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-11655.yml @@ -0,0 +1,4 @@ +author: "Ghommie" +delete-after: True +changes: + - balance: "The crusher's vortex talisman trophy now has a cooldown between each spawned wall." From 6a4a937da5ad15043424fc1e1c929f0437a6e1f5 Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Tue, 14 Apr 2020 05:38:37 -0500 Subject: [PATCH 112/113] Automatic changelog generation for PR #11618 [ci skip] --- html/changelogs/AutoChangeLog-pr-11618.yml | 12 ++++++++++++ 1 file changed, 12 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-11618.yml diff --git a/html/changelogs/AutoChangeLog-pr-11618.yml b/html/changelogs/AutoChangeLog-pr-11618.yml new file mode 100644 index 0000000000..99acbbeef5 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-11618.yml @@ -0,0 +1,12 @@ +author: "Arturlang" +delete-after: True +changes: + - rscadd: "Adds garlic, a mutation of onions" + - rscadd: "You can now make garlic necklaces." + - tweak: "Tweaked hunger to be more the same as blood level for bloodsuckers" + - tweak: "Bloodsuckers no longer get zero healing from regenerative cores, the core now heals their wounds but not their blood." + - balance: "Bloodsucker heal is now based a lot more on blood level." + - bugfix: "You can no longer be effectively immortal when fully auged as a bloodsucker." + - bugfix: "Regenerative cores will regain their old names when they are renewed, no more working decayed cores." + - code_imp: "Removes a lot of unnecesiry clutter of comments and tries to make the vars more consistent for bloodsucker code." + - code_imp: "Made the regenerative core use one proc instead of copypasta" From 8f71aafde52b2331ec3414794ea6e99837882b90 Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Tue, 14 Apr 2020 06:17:15 -0500 Subject: [PATCH 113/113] Automatic changelog generation for PR #11809 [ci skip] --- html/changelogs/AutoChangeLog-pr-11809.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-11809.yml diff --git a/html/changelogs/AutoChangeLog-pr-11809.yml b/html/changelogs/AutoChangeLog-pr-11809.yml new file mode 100644 index 0000000000..92c882825f --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-11809.yml @@ -0,0 +1,4 @@ +author: "kevinz000" +delete-after: True +changes: + - rscadd: "Volumetric storage is here."

eHmaPT9!R7X=YKZc|C=eayPJG`l6FDLcn u+dd8FtPL>GbmYu%*=rglkJ5|yX+vwjKjs2Q9-cb@aCSIkU$yr{@_zwI9EN28 From bc16600070f707679818774d5fa0ff6a6c5fbd6c Mon Sep 17 00:00:00 2001 From: kevinz000 <2003111+kevinz000@users.noreply.github.com> Date: Fri, 10 Apr 2020 04:00:59 -0700 Subject: [PATCH 055/113] alternative way --- code/__DEFINES/storage.dm | 4 ++ code/_onclick/hud/screen_objects/storage.dm | 6 ++- code/datums/components/storage/ui.dm | 44 +++++++++++---------- 3 files changed, 33 insertions(+), 21 deletions(-) diff --git a/code/__DEFINES/storage.dm b/code/__DEFINES/storage.dm index bdcb638666..b4240455fe 100644 --- a/code/__DEFINES/storage.dm +++ b/code/__DEFINES/storage.dm @@ -41,3 +41,7 @@ #define MINIMUM_PIXELS_PER_ITEM 6 /// Maximum number of objects that will be allowed to be displayed using the volumetric display system. Arbitrary number to prevent server lockups. #define MAXIMUM_VOLUMETRIC_ITEMS 256 +/// How much padding to give between items +#define VOLUMETRIC_STORAGE_ITEM_PADDING 1 +/// How much padding to give to edges +#define VOLUMETRIC_STORAGE_EDGE_PADDING 1 diff --git a/code/_onclick/hud/screen_objects/storage.dm b/code/_onclick/hud/screen_objects/storage.dm index 5b73d8721a..db287565f2 100644 --- a/code/_onclick/hud/screen_objects/storage.dm +++ b/code/_onclick/hud/screen_objects/storage.dm @@ -71,6 +71,7 @@ icon_state = "stored_continue" var/obj/screen/storage/stored_left/left var/obj/screen/storage/stored_right/right + var/pixel_size /obj/screen/storage/volumetric_box/center/Initialize(mapload, new_master, our_item) left = new(null, src, our_item) @@ -78,7 +79,7 @@ return ..() /obj/screen/storage/volumetric_box/center/Destroy() - QDEL_NULL(lefT) + QDEL_NULL(left) QDEL_NULL(right) return ..() @@ -89,6 +90,9 @@ * Sets the size of this box screen object and regenerates its left/right borders. This includes the actual border's size! */ /obj/screen/storage/volumetric_box/center/proc/set_pixel_size(pixels) + if(pixel_size == pixels) + return + pixel_size = pixels cut_overlays() //our icon size is 32 pixels. transform = matrix((pixels - (VOLUMETRIC_STORAGE_BOX_BORDER_SIZE * 2)) / VOLUMETRIC_STORAGE_BOX_ICON_SIZE, 0, 0, 0, 1, 0) diff --git a/code/datums/components/storage/ui.dm b/code/datums/components/storage/ui.dm index 0d606a2f84..aa778c0054 100644 --- a/code/datums/components/storage/ui.dm +++ b/code/datums/components/storage/ui.dm @@ -81,14 +81,9 @@ // Generate ui_item_blocks for missing ones and render+orient. var/list/atom/contents = accessible_items() - - var/horizontal_pixels = maxcolumns * world.icon_size - // do the check for fallback for when someone has too much gamer gear - if((MINIMUM_PIXELS_PER_ITEM * length(contents)) > horizontal_pixels) - to_chat(user, "[parent] was showed to you in legacy mode due to your items overrunning the three row limit! Consider not carrying too much or bugging a maintainer to raise this limit!") - return orient2hud_legacy(user, maxcolumns) - // after this point we are sure we can somehow fit all items with 8 pixels or more into our one row. - + // our volume + var/our_volume = get_max_volume() + var/horizontal_pixels = (maxcolumns * world.icon_size) - (VOLUMETRIC_STORAGE_EDGE_PADDING * 2) // sigh loopmania time var/used = 0 // define outside for performance @@ -100,33 +95,41 @@ used += volume volume_by_item[I] = volume percentage_by_item[I] = volume / get_max_volume() - to_chat(world, "DEBUG: [I] volume [volume] percent [percentage_by_item[I]]") var/overrun = FALSE - if(used >= (horizontal_pixels + 4)) //2-4 pixel grace zone + if(used > our_volume) // congratulations we are now in overrun mode. everything will be crammed to minimum storage pixels. to_chat(user, "[parent] rendered in overrun mode due to more items inside than the maximum volume supports.") overrun = TRUE + // item padding + horizontal_pixels -= ((length(percentage_by_item) - 1) * VOLUMETRIC_STORAGE_ITEM_PADDING) + + // do the check for fallback for when someone has too much gamer gear + if((MINIMUM_PIXELS_PER_ITEM * length(percentage_by_item)) > horizontal_pixels) + to_chat(user, "[parent] was showed to you in legacy mode due to your items overrunning the three row limit! Consider not carrying too much or bugging a maintainer to raise this limit!") + return orient2hud_legacy(user, maxcolumns) + // after this point we are sure we can somehow fit all items with 8 pixels or more into our one row. + // define outside for marginal performance boost var/obj/item/I // start at this pixel from screen_start_x. - var/current_pixel = 0 + var/current_pixel = VOLUMETRIC_STORAGE_EDGE_PADDING LAZYINITLIST(ui_item_blocks) + for(var/i in percentage_by_item) I = i var/percent = percentage_by_item[I] if(!ui_item_blocks[I]) - ui_item_blocks[I] = new /obj/screen/storage/volumetric_box(null, src, I) - var/obj/screen/storage/volumetric_box/B = ui_item_blocks[I] - var/pixels_to_use = overrun? MINIMUM_PIXELS_PER_ITEM : max(MINIMUM_PIXELS_PER_ITEM, FLOOR(horizontal_pixels * percent, MINIMUM_PIXELS_PER_ITEM)) - to_chat(world, "DEBUG: [I] using [pixels_to_use] pixels out of [horizontal_pixels]") + ui_item_blocks[I] = new /obj/screen/storage/volumetric_box/center(null, src, I) + var/obj/screen/storage/volumetric_box/center/B = ui_item_blocks[I] + var/pixels_to_use = overrun? MINIMUM_PIXELS_PER_ITEM : max(MINIMUM_PIXELS_PER_ITEM, round(horizontal_pixels * percent, 1)) // now that we have pixels_to_use, place our thing and add it to the returned list. - B.screen_loc = I.screen_loc = "[screen_start_x]:[current_pixel + (pixels_to_use * 0.5)],[screen_start_y]:[screen_pixel_y]" + B.screen_loc = I.screen_loc = "[screen_start_x]:[current_pixel + (pixels_to_use * 0.5) + VOLUMETRIC_STORAGE_ITEM_PADDING],[screen_start_y]:[screen_pixel_y]" // add the used pixels to pixel after we place the object - current_pixel += pixels_to_use + current_pixel += pixels_to_use + VOLUMETRIC_STORAGE_ITEM_PADDING // set various things B.set_pixel_size(pixels_to_use) @@ -174,9 +177,10 @@ maxallowedscreensize = current_maxscreensize // we got screen size, register signal RegisterSignal(M, COMSIG_MOB_CLIENT_LOGOUT, .proc/on_logout, override = TRUE) - if(M.active_storage) - M.active_storage.ui_hide(M) - M.active_storage = src + if(M.active_storage != src) + if(M.active_storage) + M.active_storage.ui_hide(M) + M.active_storage = src LAZYOR(is_using, M) if(volumetric_ui()) //new volumetric ui bay-style From 84c8183ccb1f5ab09674872cd846d0da54c1c8ec Mon Sep 17 00:00:00 2001 From: kevinz000 <2003111+kevinz000@users.noreply.github.com> Date: Fri, 10 Apr 2020 04:42:34 -0700 Subject: [PATCH 056/113] k --- code/datums/components/storage/ui.dm | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/code/datums/components/storage/ui.dm b/code/datums/components/storage/ui.dm index aa778c0054..7e9355a665 100644 --- a/code/datums/components/storage/ui.dm +++ b/code/datums/components/storage/ui.dm @@ -123,11 +123,11 @@ if(!ui_item_blocks[I]) ui_item_blocks[I] = new /obj/screen/storage/volumetric_box/center(null, src, I) var/obj/screen/storage/volumetric_box/center/B = ui_item_blocks[I] - var/pixels_to_use = overrun? MINIMUM_PIXELS_PER_ITEM : max(MINIMUM_PIXELS_PER_ITEM, round(horizontal_pixels * percent, 1)) + var/pixels_to_use = overrun? MINIMUM_PIXELS_PER_ITEM : max(MINIMUM_PIXELS_PER_ITEM, horizontal_pixels * percent) // now that we have pixels_to_use, place our thing and add it to the returned list. - B.screen_loc = I.screen_loc = "[screen_start_x]:[current_pixel + (pixels_to_use * 0.5) + VOLUMETRIC_STORAGE_ITEM_PADDING],[screen_start_y]:[screen_pixel_y]" + B.screen_loc = I.screen_loc = "[screen_start_x]:[round(current_pixel + (pixels_to_use * 0.5) + VOLUMETRIC_STORAGE_ITEM_PADDING, 1)],[screen_start_y]:[screen_pixel_y]" // add the used pixels to pixel after we place the object current_pixel += pixels_to_use + VOLUMETRIC_STORAGE_ITEM_PADDING From a9f6ac4131c2bf10cee14d971efbb7d6a85dc6fa Mon Sep 17 00:00:00 2001 From: kevinz000 <2003111+kevinz000@users.noreply.github.com> Date: Fri, 10 Apr 2020 04:42:51 -0700 Subject: [PATCH 057/113] default to legacy --- code/datums/components/storage/storage.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/datums/components/storage/storage.dm b/code/datums/components/storage/storage.dm index 7cf820239c..0efdc96600 100644 --- a/code/datums/components/storage/storage.dm +++ b/code/datums/components/storage/storage.dm @@ -22,7 +22,7 @@ var/locked = FALSE //when locked nothing can see inside or use it. /// Storage flags, including what kinds of limiters we use for how many items we can hold - var/storage_flags = STORAGE_FLAGS_VOLUME_DEFAULT + var/storage_flags = STORAGE_FLAGS_LEGACY_DEFAULT /// Max w_class we can hold. Applies to [STORAGE_LIMIT_COMBINED_W_CLASS] and [STORAGE_LIMIT_VOLUME] var/max_w_class = WEIGHT_CLASS_SMALL /// Max combined w_class. Applies to [STORAGE_LIMIT_COMBINED_W_CLASS] From 6705fc97247fce0e775f84907dc19fded29a77b4 Mon Sep 17 00:00:00 2001 From: kevinz000 <2003111+kevinz000@users.noreply.github.com> Date: Fri, 10 Apr 2020 04:45:19 -0700 Subject: [PATCH 058/113] Update rped.dm --- code/datums/components/storage/concrete/rped.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/datums/components/storage/concrete/rped.dm b/code/datums/components/storage/concrete/rped.dm index 1e609c4107..d919828e8e 100644 --- a/code/datums/components/storage/concrete/rped.dm +++ b/code/datums/components/storage/concrete/rped.dm @@ -3,7 +3,7 @@ allow_quick_gather = TRUE allow_quick_empty = TRUE click_gather = TRUE - storage_flags = STORAGE_LIMIT_MAX_ITEMS | STORAGE_LIMIT_COMBINED_W_CLASS + storage_flags = STORAGE_FLAGS_LEGACY_DEFAULT max_w_class = WEIGHT_CLASS_NORMAL max_combined_w_class = 100 max_items = 100 From a02bad15eaccf3d539bc58476d32c765a68af6bd Mon Sep 17 00:00:00 2001 From: kevinz000 <2003111+kevinz000@users.noreply.github.com> Date: Fri, 10 Apr 2020 04:45:28 -0700 Subject: [PATCH 059/113] Update stack.dm --- code/datums/components/storage/concrete/stack.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/datums/components/storage/concrete/stack.dm b/code/datums/components/storage/concrete/stack.dm index 76c7bc2af5..a3f1e526a0 100644 --- a/code/datums/components/storage/concrete/stack.dm +++ b/code/datums/components/storage/concrete/stack.dm @@ -1,7 +1,7 @@ //Stack-only storage. /datum/component/storage/concrete/stack display_numerical_stacking = TRUE - storage_flags = STORAGE_LIMIT_COMBINED_W_CLASS | STORAGE_LIMIT_MAX_ITEMS + storage_flags = STORAGE_FLAGS_LEGACY_DEFAULT var/max_combined_stack_amount = 300 max_w_class = WEIGHT_CLASS_NORMAL max_combined_w_class = WEIGHT_CLASS_NORMAL * 14 From 37884962049e7d61514cc2d14030d791acd999bc Mon Sep 17 00:00:00 2001 From: kevinz000 <2003111+kevinz000@users.noreply.github.com> Date: Fri, 10 Apr 2020 12:42:50 -0700 Subject: [PATCH 060/113] multiline support --- code/_globalvars/bitfields.dm | 6 +++ code/datums/components/storage/storage.dm | 5 +- code/datums/components/storage/ui.dm | 60 +++++++++++++---------- 3 files changed, 41 insertions(+), 30 deletions(-) diff --git a/code/_globalvars/bitfields.dm b/code/_globalvars/bitfields.dm index 5367322d8e..488926e078 100644 --- a/code/_globalvars/bitfields.dm +++ b/code/_globalvars/bitfields.dm @@ -249,5 +249,11 @@ GLOBAL_LIST_INIT(bitfields, list( "COMBAT_FLAG_SOFT_STAMCRIT" = COMBAT_FLAG_SOFT_STAMCRIT, "COMBAT_FLAG_INTENTIONALLY_RESTING" = COMBAT_FLAG_INTENTIONALLY_RESTING, "COMBAT_FLAG_RESISTING_REST" = COMBAT_FLAG_RESISTING_REST + ), + "storage_flags" = list( + "STORAGE_LIMIT_MAX_ITEMS" = STORAGE_LIMIT_MAX_ITEMS, + "STORAGE_LIMIT_MAX_W_CLASS" = STORAGE_LIMIT_MAX_W_CLASS, + "STORAGE_LIMIT_COMBINED_W_CLASS" = STORAGE_LIMIT_COMBINED_W_CLASS + "STORAGE_LIMIT_VOLUME" = STORAGE_LIMIT_VOLUME ) )) diff --git a/code/datums/components/storage/storage.dm b/code/datums/components/storage/storage.dm index 0efdc96600..7cd43ccece 100644 --- a/code/datums/components/storage/storage.dm +++ b/code/datums/components/storage/storage.dm @@ -50,11 +50,9 @@ var/obj/screen/storage/boxes/ui_boxes /// New volumetric storage display mode's left side var/obj/screen/storage/left/ui_left - /// New volumetric storage display mode's right side - var/obj/screen/storage/right/ui_right /// New volumetric storage display mode's center 'blocks' var/obj/screen/storage/continuous/ui_continuous - /// The close button, used in all modes. + /// The close button, used in all modes. Frames right side in volumetric mode. var/obj/screen/storage/close/ui_close /// Associative list of list(item = screen object) for volumetric storage item screen blocks var/list/ui_item_blocks @@ -130,7 +128,6 @@ QDEL_NULL(ui_close) QDEL_NULL(ui_continuous) QDEL_NULL(ui_left) - QDEL_NULL(ui_right) // DO NOT USE QDEL_LIST_ASSOC. if(ui_item_blocks) for(var/i in ui_item_blocks) diff --git a/code/datums/components/storage/ui.dm b/code/datums/components/storage/ui.dm index 7e9355a665..23fabf76e8 100644 --- a/code/datums/components/storage/ui.dm +++ b/code/datums/components/storage/ui.dm @@ -84,6 +84,7 @@ // our volume var/our_volume = get_max_volume() var/horizontal_pixels = (maxcolumns * world.icon_size) - (VOLUMETRIC_STORAGE_EDGE_PADDING * 2) + var/max_horizontal_pixels = horizontal_pixels * screen_max_rows // sigh loopmania time var/used = 0 // define outside for performance @@ -95,25 +96,34 @@ used += volume volume_by_item[I] = volume percentage_by_item[I] = volume / get_max_volume() + var/padding_pixels = ((length(percentage_by_item) - 1) * VOLUMETRIC_STORAGE_ITEM_PADDING) + VOLUMETRIC_STORAGE_EDGE_PADDING * 2 + var/min_pixels = (MINIMUM_PIXELS_PER_ITEM * length(percentage_by_item)) + padding_pixels + // do the check for fallback for when someone has too much gamer gear + if((min_pixels) > (max_horizontal_pixels + 4)) // 4 pixel grace zone + to_chat(user, "[parent] was showed to you in legacy mode due to your items overrunning the three row limit! Consider not carrying too much or bugging a maintainer to raise this limit!") + return orient2hud_legacy(user, maxcolumns) + // after this point we are sure we can somehow fit all items into our max number of rows. + + // determine rows + var/rows = CLAMP(CEILING(min_pixels / horizontal_pixels, 1), 1, screen_max_rows) + var/overrun = FALSE if(used > our_volume) // congratulations we are now in overrun mode. everything will be crammed to minimum storage pixels. to_chat(user, "[parent] rendered in overrun mode due to more items inside than the maximum volume supports.") overrun = TRUE - // item padding - horizontal_pixels -= ((length(percentage_by_item) - 1) * VOLUMETRIC_STORAGE_ITEM_PADDING) + // how much we are using + var/using_horizontal_pixels = horizontal_pixels * rows - // do the check for fallback for when someone has too much gamer gear - if((MINIMUM_PIXELS_PER_ITEM * length(percentage_by_item)) > horizontal_pixels) - to_chat(user, "[parent] was showed to you in legacy mode due to your items overrunning the three row limit! Consider not carrying too much or bugging a maintainer to raise this limit!") - return orient2hud_legacy(user, maxcolumns) - // after this point we are sure we can somehow fit all items with 8 pixels or more into our one row. + // item padding + using_horizontal_pixels -= padding_pixels // define outside for marginal performance boost var/obj/item/I // start at this pixel from screen_start_x. var/current_pixel = VOLUMETRIC_STORAGE_EDGE_PADDING + var/row = 1 LAZYINITLIST(ui_item_blocks) @@ -123,11 +133,15 @@ if(!ui_item_blocks[I]) ui_item_blocks[I] = new /obj/screen/storage/volumetric_box/center(null, src, I) var/obj/screen/storage/volumetric_box/center/B = ui_item_blocks[I] - var/pixels_to_use = overrun? MINIMUM_PIXELS_PER_ITEM : max(MINIMUM_PIXELS_PER_ITEM, horizontal_pixels * percent) + var/pixels_to_use = overrun? MINIMUM_PIXELS_PER_ITEM : max(using_horizontal_pixels * percent, MINIMUM_PIXELS_PER_ITEM) + var/addrow = FALSE + if(CEILING(pixels_to_use, 1) >= FLOOR(horizontal_pixels - current_pixel - VOLUMETRIC_STORAGE_EDGE_PADDING, 1)) + pixels_to_use = horizontal_pixels - current_pixel - VOLUMETRIC_STORAGE_EDGE_PADDING + addrow = TRUE // now that we have pixels_to_use, place our thing and add it to the returned list. - B.screen_loc = I.screen_loc = "[screen_start_x]:[round(current_pixel + (pixels_to_use * 0.5) + VOLUMETRIC_STORAGE_ITEM_PADDING, 1)],[screen_start_y]:[screen_pixel_y]" + B.screen_loc = I.screen_loc = "[screen_start_x]:[round(current_pixel + (pixels_to_use * 0.5) + VOLUMETRIC_STORAGE_ITEM_PADDING, 1)],[screen_start_y+row-1]:[screen_pixel_y]" // add the used pixels to pixel after we place the object current_pixel += pixels_to_use + VOLUMETRIC_STORAGE_ITEM_PADDING @@ -146,20 +160,22 @@ . += B.on_screen_objects() . += I + // go up a row if needed + if(addrow) + row++ + current_pixel = VOLUMETRIC_STORAGE_EDGE_PADDING + // Then, continuous section. ui_continuous = get_ui_continuous() - ui_continuous.screen_loc = "[screen_start_x]:[screen_pixel_x],[screen_start_y]:[screen_pixel_y] to [screen_start_x+maxcolumns-1]:[screen_pixel_x],[screen_start_y]:[screen_pixel_y]" + ui_continuous.screen_loc = "[screen_start_x]:[screen_pixel_x],[screen_start_y]:[screen_pixel_y] to [screen_start_x+maxcolumns-1]:[screen_pixel_x],[screen_start_y+rows-1]:[screen_pixel_y]" . += ui_continuous - // Then, left and right. + // Then, left. ui_left = get_ui_left() - ui_left.screen_loc = "[screen_start_x]:[screen_pixel_x - 2],[screen_start_y]:[screen_pixel_y]" + ui_left.screen_loc = "[screen_start_x]:[screen_pixel_x - 2],[screen_start_y]:[screen_pixel_y] to [screen_start_x]:[screen_pixel_x - 2],[screen_start_y+rows-1]:[screen_pixel_y]" . += ui_left - ui_right = get_ui_right() - ui_right.screen_loc = "[screen_start_x + maxcolumns]:[screen_pixel_x],[screen_start_y]:[screen_pixel_y]" - . += ui_right - // Then, closer. + // Then, closer, which is also our right element. ui_close = get_ui_close() - ui_close.screen_loc = "[screen_start_x + maxcolumns]:[screen_pixel_x + 2],[screen_start_y]:[screen_pixel_y]" + ui_close.screen_loc = "[screen_start_x + maxcolumns]:[screen_pixel_x],[screen_start_y + row - 1]:[screen_pixel_y]" . += ui_close /** @@ -217,7 +233,7 @@ if(!M.client) return TRUE UnregisterSignal(M, COMSIG_MOB_CLIENT_LOGOUT) - M.client.screen -= list(ui_boxes, ui_close, ui_left, ui_right, ui_continuous) + get_ui_item_objects_hide() + M.client.screen -= list(ui_boxes, ui_close, ui_left, ui_continuous) + get_ui_item_objects_hide() if(M.active_storage == src) M.active_storage = null LAZYREMOVE(is_using, M) @@ -260,14 +276,6 @@ ui_left = new(null, src) return ui_left -/** - * Gets our ui_right, making it if it doesn't exist. - */ -/datum/component/storage/proc/get_ui_right() - if(!ui_right) - ui_right = new(null, src) - return ui_right - /** * Gets our ui_close, making it if it doesn't exist. */ From b21598a441be800275cb1c65b68cfe6adc8a3c81 Mon Sep 17 00:00:00 2001 From: kevinz000 <2003111+kevinz000@users.noreply.github.com> Date: Fri, 10 Apr 2020 12:47:16 -0700 Subject: [PATCH 061/113] fix --- code/datums/components/storage/ui.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/datums/components/storage/ui.dm b/code/datums/components/storage/ui.dm index 23fabf76e8..c1c049dfd3 100644 --- a/code/datums/components/storage/ui.dm +++ b/code/datums/components/storage/ui.dm @@ -175,7 +175,7 @@ . += ui_left // Then, closer, which is also our right element. ui_close = get_ui_close() - ui_close.screen_loc = "[screen_start_x + maxcolumns]:[screen_pixel_x],[screen_start_y + row - 1]:[screen_pixel_y]" + ui_close.screen_loc = "[screen_start_x + maxcolumns]:[screen_pixel_x],[screen_start_y]:[screen_pixel_y] to [screen_start_x + maxcolumns]:[screen_pixel_x],[screen_start_y + row - 1]:[screen_pixel_y]" . += ui_close /** From f652a612e54b6dac227adf20d51fd7d2e03143cc Mon Sep 17 00:00:00 2001 From: kevinz000 <2003111+kevinz000@users.noreply.github.com> Date: Fri, 10 Apr 2020 22:18:53 -0700 Subject: [PATCH 062/113] missing comma --- code/_globalvars/bitfields.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/_globalvars/bitfields.dm b/code/_globalvars/bitfields.dm index 488926e078..f0c854c398 100644 --- a/code/_globalvars/bitfields.dm +++ b/code/_globalvars/bitfields.dm @@ -253,7 +253,7 @@ GLOBAL_LIST_INIT(bitfields, list( "storage_flags" = list( "STORAGE_LIMIT_MAX_ITEMS" = STORAGE_LIMIT_MAX_ITEMS, "STORAGE_LIMIT_MAX_W_CLASS" = STORAGE_LIMIT_MAX_W_CLASS, - "STORAGE_LIMIT_COMBINED_W_CLASS" = STORAGE_LIMIT_COMBINED_W_CLASS + "STORAGE_LIMIT_COMBINED_W_CLASS" = STORAGE_LIMIT_COMBINED_W_CLASS, "STORAGE_LIMIT_VOLUME" = STORAGE_LIMIT_VOLUME ) )) From 31e032180842cd8c8738d130558d85f4f9e2c1ff Mon Sep 17 00:00:00 2001 From: Ghommie <42542238+Ghommie@users.noreply.github.com> Date: Sat, 11 Apr 2020 16:53:08 +0200 Subject: [PATCH 063/113] Minor action datum refactor and spellcasting fix. --- code/__DEFINES/dcs/signals.dm | 2 +- code/__HELPERS/roundend.dm | 2 +- code/controllers/subsystem/vote.dm | 2 +- code/datums/action.dm | 28 +++++------ code/datums/dash_weapon.dm | 2 +- code/datums/elements/spellcasting.dm | 12 ++--- code/game/machinery/launch_pad.dm | 4 +- .../objects/items/robot/robot_upgrades.dm | 14 +++--- .../changeling/changeling_power.dm | 3 +- .../changeling/powers/tiny_prick.dm | 6 +-- .../clock_helpers/hierophant_network.dm | 2 +- .../clock_items/clock_weapons/_call_weapon.dm | 2 +- .../clockcult/clock_mobs/_eminence.dm | 4 +- .../clock_scriptures/scripture_scripts.dm | 2 +- code/modules/antagonists/cult/blood_magic.dm | 4 +- code/modules/antagonists/cult/cult_comms.dm | 20 ++++---- code/modules/antagonists/cult/cult_items.dm | 4 +- .../antagonists/cult/rune_spawn_action.dm | 2 +- .../traitor/equipment/Malf_Modules.dm | 2 +- .../modules/clothing/spacesuits/chronosuit.dm | 2 +- .../carbon/alien/humanoid/alien_powers.dm | 11 ++--- .../carbon/human/species_types/golems.dm | 2 +- .../carbon/human/species_types/jellypeople.dm | 6 +-- code/modules/mob/living/say.dm | 2 +- .../simple_animal/hostile/giant_spider.dm | 9 ++-- .../mob/living/simple_animal/slime/powers.dm | 2 +- code/modules/projectiles/gun.dm | 2 +- code/modules/spells/spell.dm | 39 ++++++++------- code/modules/spells/spell_types/aimed.dm | 5 +- code/modules/spells/spell_types/lightning.dm | 6 +-- code/modules/spells/spell_types/mime.dm | 48 ++++++++----------- code/modules/surgery/organs/vocal_cords.dm | 4 +- 32 files changed, 124 insertions(+), 131 deletions(-) diff --git a/code/__DEFINES/dcs/signals.dm b/code/__DEFINES/dcs/signals.dm index e75f832df3..2ab04cb37f 100644 --- a/code/__DEFINES/dcs/signals.dm +++ b/code/__DEFINES/dcs/signals.dm @@ -179,7 +179,7 @@ // #define SPEECH_FORCED 7 #define COMSIG_MOB_ANTAG_ON_GAIN "mob_antag_on_gain" //from base of /datum/antagonist/on_gain(): (antag_datum) -#define COMSIG_MOB_SPELL_CAST_CHECK "mob_spell_cast_check" //called from base of /obj/effect/proc_holder/spell/cast_check(): (spell) +#define COMSIG_MOB_SPELL_CAN_CAST "mob_spell_can_cast" //called from base of /obj/effect/proc_holder/spell/can_cast(): (spell) // /mob/living signals #define COMSIG_LIVING_REGENERATE_LIMBS "living_regenerate_limbs" //from base of /mob/living/regenerate_limbs(): (noheal, excluded_limbs) diff --git a/code/__HELPERS/roundend.dm b/code/__HELPERS/roundend.dm index e416396991..7cbfbd040a 100644 --- a/code/__HELPERS/roundend.dm +++ b/code/__HELPERS/roundend.dm @@ -513,7 +513,7 @@ if(owner && GLOB.common_report && SSticker.current_state == GAME_STATE_FINISHED) SSticker.show_roundend_report(owner.client, FALSE) -/datum/action/report/IsAvailable() +/datum/action/report/IsAvailable(silent = FALSE) return 1 /datum/action/report/Topic(href,href_list) diff --git a/code/controllers/subsystem/vote.dm b/code/controllers/subsystem/vote.dm index 7d72951278..a202afd905 100644 --- a/code/controllers/subsystem/vote.dm +++ b/code/controllers/subsystem/vote.dm @@ -763,7 +763,7 @@ SUBSYSTEM_DEF(vote) remove_from_client() Remove(owner) -/datum/action/vote/IsAvailable() +/datum/action/vote/IsAvailable(silent = FALSE) return 1 /datum/action/vote/proc/remove_from_client() diff --git a/code/datums/action.dm b/code/datums/action.dm index 6c08a33f33..4be3c9b1e7 100644 --- a/code/datums/action.dm +++ b/code/datums/action.dm @@ -95,7 +95,7 @@ /datum/action/proc/Process() return -/datum/action/proc/IsAvailable() +/datum/action/proc/IsAvailable(silent = FALSE) if(!owner) return FALSE var/mob/living/L = owner @@ -134,7 +134,7 @@ ApplyIcon(button, force) - if(!IsAvailable()) + if(!IsAvailable(TRUE)) button.color = transparent_when_unavailable ? rgb(128,0,0,128) : rgb(128,0,0) else button.color = rgb(255,255,255,255) @@ -308,7 +308,7 @@ icon_icon = 'icons/mob/actions/actions_items.dmi' button_icon_state = "vortex_recall" -/datum/action/item_action/vortex_recall/IsAvailable() +/datum/action/item_action/vortex_recall/IsAvailable(silent = FALSE) if(istype(target, /obj/item/hierophant_club)) var/obj/item/hierophant_club/H = target if(H.teleporting) @@ -320,7 +320,7 @@ background_icon_state = "bg_clock" buttontooltipstyle = "clockcult" -/datum/action/item_action/clock/IsAvailable() +/datum/action/item_action/clock/IsAvailable(silent = FALSE) if(!is_servant_of_ratvar(owner)) return 0 return ..() @@ -329,7 +329,7 @@ name = "Create Judicial Marker" desc = "Allows you to create a stunning Judicial Marker at any location in view. Click again to disable." -/datum/action/item_action/clock/toggle_visor/IsAvailable() +/datum/action/item_action/clock/toggle_visor/IsAvailable(silent = FALSE) if(!is_servant_of_ratvar(owner)) return 0 if(istype(target, /obj/item/clothing/glasses/judicial_visor)) @@ -408,7 +408,7 @@ /datum/action/item_action/jetpack_stabilization name = "Toggle Jetpack Stabilization" -/datum/action/item_action/jetpack_stabilization/IsAvailable() +/datum/action/item_action/jetpack_stabilization/IsAvailable(silent = FALSE) var/obj/item/tank/jetpack/J = target if(!istype(J) || !J.on) return 0 @@ -465,7 +465,7 @@ /datum/action/item_action/organ_action check_flags = AB_CHECK_CONSCIOUS -/datum/action/item_action/organ_action/IsAvailable() +/datum/action/item_action/organ_action/IsAvailable(silent = FALSE) var/obj/item/organ/I = target if(!I.owner) return 0 @@ -634,32 +634,32 @@ return FALSE if(target) var/obj/effect/proc_holder/S = target - S.Click() + S.Trigger(usr) return TRUE -/datum/action/spell_action/IsAvailable() +/datum/action/spell_action/IsAvailable(silent = FALSE) if(!target) return FALSE return TRUE /datum/action/spell_action/spell -/datum/action/spell_action/spell/IsAvailable() +/datum/action/spell_action/spell/IsAvailable(silent = FALSE) if(!target) return FALSE var/obj/effect/proc_holder/spell/S = target if(owner) - return S.can_cast(owner, FALSE, TRUE) + return S.can_cast(owner, FALSE, silent) return FALSE /datum/action/spell_action/alien -/datum/action/spell_action/alien/IsAvailable() +/datum/action/spell_action/alien/IsAvailable(silent = FALSE) if(!target) return FALSE var/obj/effect/proc_holder/alien/ab = target if(owner) - return ab.cost_check(ab.check_turf,owner,1) + return ab.cost_check(ab.check_turf,owner,silent) return FALSE @@ -701,7 +701,7 @@ button.maptext_width = 24 button.maptext_height = 12 -/datum/action/cooldown/IsAvailable() +/datum/action/cooldown/IsAvailable(silent = FALSE) return next_use_time <= world.time /datum/action/cooldown/proc/StartCooldown() diff --git a/code/datums/dash_weapon.dm b/code/datums/dash_weapon.dm index 8eda936bb7..c31139dcd7 100644 --- a/code/datums/dash_weapon.dm +++ b/code/datums/dash_weapon.dm @@ -19,7 +19,7 @@ dashing_item = dasher holder = user -/datum/action/innate/dash/IsAvailable() +/datum/action/innate/dash/IsAvailable(silent = FALSE) if(current_charges > 0) return TRUE else diff --git a/code/datums/elements/spellcasting.dm b/code/datums/elements/spellcasting.dm index a917108bf1..69d628d9d2 100644 --- a/code/datums/elements/spellcasting.dm +++ b/code/datums/elements/spellcasting.dm @@ -12,7 +12,7 @@ RegisterSignal(target, COMSIG_ITEM_EQUIPPED, .proc/on_equip) RegisterSignal(target, COMSIG_ITEM_DROPPED, .proc/on_drop) else if(ismob(target)) - RegisterSignal(target, COMSIG_MOB_SPELL_CAST_CHECK, .proc/on_cast) + RegisterSignal(target, COMSIG_MOB_SPELL_CAN_CAST, .proc/on_cast) stacked_spellcasting_by_user[target]++ else return ELEMENT_INCOMPATIBLE @@ -21,24 +21,24 @@ /datum/element/spellcasting/Detach(datum/target) . = ..() - UnregisterSignal(target, list(COMSIG_ITEM_EQUIPPED, COMSIG_ITEM_DROPPED, COMSIG_MOB_SPELL_CAST_CHECK)) + UnregisterSignal(target, list(COMSIG_ITEM_EQUIPPED, COMSIG_ITEM_DROPPED, COMSIG_MOB_SPELL_CAN_CAST)) if(users_by_item[target]) var/mob/user = users_by_item[target] stacked_spellcasting_by_user[user]-- if(!stacked_spellcasting_by_user[user]) stacked_spellcasting_by_user -= user - UnregisterSignal(user, COMSIG_MOB_SPELL_CAST_CHECK) + UnregisterSignal(user, COMSIG_MOB_SPELL_CAN_CAST) else if(ismob(target)) stacked_spellcasting_by_user[target]-- if(!stacked_spellcasting_by_user[target]) stacked_spellcasting_by_user -= target /datum/element/spellcasting/proc/on_equip(datum/source, mob/equipper, slot) - if(!(slot in cast_slots)) + if(!(slot & cast_slots)) return users_by_item[source] = equipper if(!stacked_spellcasting_by_user[equipper]) - RegisterSignal(equipper, COMSIG_MOB_SPELL_CAST_CHECK, .proc/on_cast) + RegisterSignal(equipper, COMSIG_MOB_SPELL_CAN_CAST, .proc/on_cast) stacked_spellcasting_by_user[equipper]++ /datum/element/spellcasting/proc/on_drop(datum/source, mob/user) @@ -48,7 +48,7 @@ stacked_spellcasting_by_user[user]-- if(!stacked_spellcasting_by_user[user]) stacked_spellcasting_by_user -= user - UnregisterSignal(user, COMSIG_MOB_SPELL_CAST_CHECK) + UnregisterSignal(user, COMSIG_MOB_SPELL_CAN_CAST) /datum/element/spellcasting/proc/on_cast(mob/caster, obj/effect/proc_holder/spell) return cast_flags diff --git a/code/game/machinery/launch_pad.dm b/code/game/machinery/launch_pad.dm index 0f5e51215d..d01f7e3e40 100644 --- a/code/game/machinery/launch_pad.dm +++ b/code/game/machinery/launch_pad.dm @@ -57,7 +57,7 @@ var/turf/target = locate(target_x, target_y, z) ghost.forceMove(target) -/obj/machinery/launchpad/proc/isAvailable() +/obj/machinery/launchpad/proc/isAvailable(silent = FALSE) if(stat & NOPOWER) return FALSE if(panel_open) @@ -198,7 +198,7 @@ QDEL_NULL(briefcase) return ..() -/obj/machinery/launchpad/briefcase/isAvailable() +/obj/machinery/launchpad/briefcase/isAvailable(silent = FALSE) if(closed) return FALSE return ..() diff --git a/code/game/objects/items/robot/robot_upgrades.dm b/code/game/objects/items/robot/robot_upgrades.dm index b137c5c0f3..08ce73109c 100644 --- a/code/game/objects/items/robot/robot_upgrades.dm +++ b/code/game/objects/items/robot/robot_upgrades.dm @@ -663,21 +663,19 @@ var/maxReduction = 1 -/obj/effect/proc_holder/silicon/cyborg/vtecControl/Click(mob/living/silicon/robot/user) - var/mob/living/silicon/robot/self = usr - +/obj/effect/proc_holder/silicon/cyborg/vtecControl/Trigger(mob/living/silicon/robot/user) currentState = (currentState + 1) % 3 - if(istype(self)) + if(istype(user)) switch(currentState) if (0) - self.speed = initial(self.speed) + user.speed = initial(user.speed) if (1) - self.speed = initial(self.speed) - maxReduction * 0.5 + user.speed = initial(user.speed) - maxReduction * 0.5 if (2) - self.speed = initial(self.speed) - maxReduction * 1 + user.speed = initial(user.speed) - maxReduction * 1 action.button_icon_state = "Chevron_State_[currentState]" action.UpdateButtonIcon() - return + return TRUE diff --git a/code/modules/antagonists/changeling/changeling_power.dm b/code/modules/antagonists/changeling/changeling_power.dm index 574edf225a..aa45c56892 100644 --- a/code/modules/antagonists/changeling/changeling_power.dm +++ b/code/modules/antagonists/changeling/changeling_power.dm @@ -28,8 +28,7 @@ action.Remove(user) return -/obj/effect/proc_holder/changeling/Click() - var/mob/user = usr +/obj/effect/proc_holder/changeling/Trigger(mob/user) if(!user || !user.mind || !user.mind.has_antag_datum(/datum/antagonist/changeling)) return try_to_sting(user) diff --git a/code/modules/antagonists/changeling/powers/tiny_prick.dm b/code/modules/antagonists/changeling/powers/tiny_prick.dm index 3e19ce74fe..a8fe56aae7 100644 --- a/code/modules/antagonists/changeling/powers/tiny_prick.dm +++ b/code/modules/antagonists/changeling/powers/tiny_prick.dm @@ -3,8 +3,7 @@ desc = "Stabby stabby." var/sting_icon = null -/obj/effect/proc_holder/changeling/sting/Click() - var/mob/user = usr +/obj/effect/proc_holder/changeling/sting/Trigger(mob/user) if(!user || !user.mind) return var/datum/antagonist/changeling/changeling = user.mind.has_antag_datum(/datum/antagonist/changeling) @@ -74,8 +73,7 @@ action_icon_state = "ling_sting_transform" action_background_icon_state = "bg_ling" -/obj/effect/proc_holder/changeling/sting/transformation/Click() - var/mob/user = usr +/obj/effect/proc_holder/changeling/sting/transformation/Trigger(mob/user) var/datum/antagonist/changeling/changeling = user.mind.has_antag_datum(/datum/antagonist/changeling) if(changeling.chosen_sting) unset_sting(user) diff --git a/code/modules/antagonists/clockcult/clock_helpers/hierophant_network.dm b/code/modules/antagonists/clockcult/clock_helpers/hierophant_network.dm index 37f6f0b2d7..0c01dc0963 100644 --- a/code/modules/antagonists/clockcult/clock_helpers/hierophant_network.dm +++ b/code/modules/antagonists/clockcult/clock_helpers/hierophant_network.dm @@ -35,7 +35,7 @@ var/span_for_name = "heavy_brass" var/span_for_message = "brass" -/datum/action/innate/hierophant/IsAvailable() +/datum/action/innate/hierophant/IsAvailable(silent = FALSE) if(!is_servant_of_ratvar(owner)) return FALSE return ..() diff --git a/code/modules/antagonists/clockcult/clock_items/clock_weapons/_call_weapon.dm b/code/modules/antagonists/clockcult/clock_items/clock_weapons/_call_weapon.dm index a87767c05e..40aca961fc 100644 --- a/code/modules/antagonists/clockcult/clock_items/clock_weapons/_call_weapon.dm +++ b/code/modules/antagonists/clockcult/clock_items/clock_weapons/_call_weapon.dm @@ -12,7 +12,7 @@ var/obj/item/clockwork/weapon/weapon_type //The type of weapon to create var/obj/item/clockwork/weapon/weapon -/datum/action/innate/call_weapon/IsAvailable() +/datum/action/innate/call_weapon/IsAvailable(silent = FALSE) if(!is_servant_of_ratvar(owner)) qdel(src) return diff --git a/code/modules/antagonists/clockcult/clock_mobs/_eminence.dm b/code/modules/antagonists/clockcult/clock_mobs/_eminence.dm index e4722dbcb0..faa5e025ca 100644 --- a/code/modules/antagonists/clockcult/clock_mobs/_eminence.dm +++ b/code/modules/antagonists/clockcult/clock_mobs/_eminence.dm @@ -232,7 +232,7 @@ background_icon_state = "bg_clock" buttontooltipstyle = "clockcult" -/datum/action/innate/eminence/IsAvailable() +/datum/action/innate/eminence/IsAvailable(silent = FALSE) if(!iseminence(owner)) qdel(src) return @@ -283,7 +283,7 @@ desc = "Initiates a mass recall, warping all servants to the Ark after a short delay. This can only be used once." button_icon_state = "Spatial Gateway" -/datum/action/innate/eminence/mass_recall/IsAvailable() +/datum/action/innate/eminence/mass_recall/IsAvailable(silent = FALSE) . = ..() if(.) var/obj/structure/destructible/clockwork/massive/celestial_gateway/G = GLOB.ark_of_the_clockwork_justiciar diff --git a/code/modules/antagonists/clockcult/clock_scriptures/scripture_scripts.dm b/code/modules/antagonists/clockcult/clock_scriptures/scripture_scripts.dm index 4e1a5b42cb..d3b600ec29 100644 --- a/code/modules/antagonists/clockcult/clock_scriptures/scripture_scripts.dm +++ b/code/modules/antagonists/clockcult/clock_scriptures/scripture_scripts.dm @@ -150,7 +150,7 @@ /obj/item/clothing/head/helmet/space, /obj/item/clothing/shoes/magboots)) //replace this only if ratvar is up -/datum/action/innate/clockwork_armaments/IsAvailable() +/datum/action/innate/clockwork_armaments/IsAvailable(silent = FALSE) if(!is_servant_of_ratvar(owner)) qdel(src) return diff --git a/code/modules/antagonists/cult/blood_magic.dm b/code/modules/antagonists/cult/blood_magic.dm index c4a8c1e827..51933d2c0f 100644 --- a/code/modules/antagonists/cult/blood_magic.dm +++ b/code/modules/antagonists/cult/blood_magic.dm @@ -17,7 +17,7 @@ qdel(X) ..() -/datum/action/innate/cult/blood_magic/IsAvailable() +/datum/action/innate/cult/blood_magic/IsAvailable(silent = FALSE) if(!iscultist(owner)) return FALSE return ..() @@ -118,7 +118,7 @@ hand_magic = null ..() -/datum/action/innate/cult/blood_spell/IsAvailable() +/datum/action/innate/cult/blood_spell/IsAvailable(silent = FALSE) if(!iscultist(owner) || owner.incapacitated() || !charges) return FALSE return ..() diff --git a/code/modules/antagonists/cult/cult_comms.dm b/code/modules/antagonists/cult/cult_comms.dm index 761412e9f8..64c03b9aeb 100644 --- a/code/modules/antagonists/cult/cult_comms.dm +++ b/code/modules/antagonists/cult/cult_comms.dm @@ -6,7 +6,7 @@ buttontooltipstyle = "cult" check_flags = AB_CHECK_RESTRAINED|AB_CHECK_STUN|AB_CHECK_CONSCIOUS -/datum/action/innate/cult/IsAvailable() +/datum/action/innate/cult/IsAvailable(silent = FALSE) if(!iscultist(owner)) return FALSE return ..() @@ -51,7 +51,7 @@ name = "Spiritual Communion" desc = "Conveys a message from the spirit realm that all cultists can hear." -/datum/action/innate/cult/comm/spirit/IsAvailable() +/datum/action/innate/cult/comm/spirit/IsAvailable(silent = FALSE) if(iscultist(owner.mind.current)) return TRUE @@ -72,7 +72,7 @@ name = "Assert Leadership" button_icon_state = "cultvote" -/datum/action/innate/cult/mastervote/IsAvailable() +/datum/action/innate/cult/mastervote/IsAvailable(silent = FALSE) var/datum/antagonist/cult/C = owner.mind.has_antag_datum(/datum/antagonist/cult,TRUE) if(!C || C.cult_team.cult_vote_called || !ishuman(owner)) return FALSE @@ -137,7 +137,7 @@ to_chat(B.current,"[Nominee] has won the cult's support and is now their master. Follow [Nominee.p_their()] orders to the best of your ability!") return TRUE -/datum/action/innate/cult/master/IsAvailable() +/datum/action/innate/cult/master/IsAvailable(silent = FALSE) if(!owner.mind || !owner.mind.has_antag_datum(/datum/antagonist/cult/master) || GLOB.cult_narsie) return 0 return ..() @@ -220,9 +220,9 @@ CM.attached_action = src ..() -/datum/action/innate/cult/master/cultmark/IsAvailable() +/datum/action/innate/cult/master/cultmark/IsAvailable(silent = FALSE) if(cooldown > world.time) - if(!CM.active) + if(!CM.active && !silent) to_chat(owner, "You need to wait [DisplayTimeText(cooldown - world.time)] before you can mark another target!") return FALSE return ..() @@ -299,7 +299,7 @@ name = "Mark a Blood Target for the Cult" desc = "Marks a target for the entire cult to track." -/datum/action/innate/cult/master/cultmark/ghost/IsAvailable() +/datum/action/innate/cult/master/cultmark/ghost/IsAvailable(silent = FALSE) if(istype(owner, /mob/dead/observer) && iscultist(owner.mind.current)) return TRUE else @@ -313,7 +313,7 @@ var/cooldown = 0 var/base_cooldown = 600 -/datum/action/innate/cult/ghostmark/IsAvailable() +/datum/action/innate/cult/ghostmark/IsAvailable(silent = FALSE) if(istype(owner, /mob/dead/observer) && iscultist(owner.mind.current)) return TRUE else @@ -389,11 +389,11 @@ PM.attached_action = src ..() -/datum/action/innate/cult/master/pulse/IsAvailable() +/datum/action/innate/cult/master/pulse/IsAvailable(silent = FALSE) if(!owner.mind || !owner.mind.has_antag_datum(/datum/antagonist/cult/master)) return FALSE if(cooldown > world.time) - if(!PM.active) + if(!PM.active && !silent) to_chat(owner, "You need to wait [DisplayTimeText(cooldown - world.time)] before you can pulse again!") return FALSE return ..() diff --git a/code/modules/antagonists/cult/cult_items.dm b/code/modules/antagonists/cult/cult_items.dm index b31bfc0693..959e5be2c4 100644 --- a/code/modules/antagonists/cult/cult_items.dm +++ b/code/modules/antagonists/cult/cult_items.dm @@ -207,7 +207,7 @@ phasein = /obj/effect/temp_visual/dir_setting/cult/phase phaseout = /obj/effect/temp_visual/dir_setting/cult/phase/out -/datum/action/innate/dash/cult/IsAvailable() +/datum/action/innate/dash/cult/IsAvailable(silent = FALSE) if(iscultist(holder) && current_charges) return TRUE else @@ -227,7 +227,7 @@ sword = bastard holder = user -/datum/action/innate/cult/spin2win/IsAvailable() +/datum/action/innate/cult/spin2win/IsAvailable(silent = FALSE) if(iscultist(holder) && cooldown <= world.time) return TRUE else diff --git a/code/modules/antagonists/cult/rune_spawn_action.dm b/code/modules/antagonists/cult/rune_spawn_action.dm index 60a8527860..b164246060 100644 --- a/code/modules/antagonists/cult/rune_spawn_action.dm +++ b/code/modules/antagonists/cult/rune_spawn_action.dm @@ -14,7 +14,7 @@ var/obj/effect/temp_visual/cult/rune_spawn/rune_center_type var/rune_color -/datum/action/innate/cult/create_rune/IsAvailable() +/datum/action/innate/cult/create_rune/IsAvailable(silent = FALSE) if(!rune_type || cooldown > world.time) return FALSE return ..() diff --git a/code/modules/antagonists/traitor/equipment/Malf_Modules.dm b/code/modules/antagonists/traitor/equipment/Malf_Modules.dm index e6ca95472e..6616eea006 100644 --- a/code/modules/antagonists/traitor/equipment/Malf_Modules.dm +++ b/code/modules/antagonists/traitor/equipment/Malf_Modules.dm @@ -43,7 +43,7 @@ GLOBAL_LIST_INIT(blacklisted_malf_machines, typecacheof(list( else owner_AI = owner -/datum/action/innate/ai/IsAvailable() +/datum/action/innate/ai/IsAvailable(silent = FALSE) . = ..() if(owner_AI && owner_AI.malf_cooldown > world.time) return FALSE diff --git a/code/modules/clothing/spacesuits/chronosuit.dm b/code/modules/clothing/spacesuits/chronosuit.dm index 4311aa5166..94ccdf94c6 100644 --- a/code/modules/clothing/spacesuits/chronosuit.dm +++ b/code/modules/clothing/spacesuits/chronosuit.dm @@ -321,7 +321,7 @@ check_flags = AB_CHECK_CONSCIOUS //|AB_CHECK_INSIDE var/obj/item/clothing/suit/space/chronos/chronosuit = null -/datum/action/innate/chrono_teleport/IsAvailable() +/datum/action/innate/chrono_teleport/IsAvailable(silent = FALSE) return (chronosuit && chronosuit.activated && chronosuit.camera && !chronosuit.teleporting) /datum/action/innate/chrono_teleport/Activate() diff --git a/code/modules/mob/living/carbon/alien/humanoid/alien_powers.dm b/code/modules/mob/living/carbon/alien/humanoid/alien_powers.dm index ef6a372f9e..42b2c4433b 100644 --- a/code/modules/mob/living/carbon/alien/humanoid/alien_powers.dm +++ b/code/modules/mob/living/carbon/alien/humanoid/alien_powers.dm @@ -21,14 +21,13 @@ Doesn't work on other aliens/AI.*/ . = ..() action = new(src) -/obj/effect/proc_holder/alien/Click() - if(!iscarbon(usr)) - return 1 - var/mob/living/carbon/user = usr - if(cost_check(check_turf,user)) +/obj/effect/proc_holder/alien/Trigger(mob/living/carbon/user, skip_cost_check) + if(!istype(user)) + return TRUE + if(!skip_cost_check || cost_check(check_turf,user)) if(fire(user) && user) // Second check to prevent runtimes when evolving user.adjustPlasma(-plasma_cost) - return 1 + return TRUE /obj/effect/proc_holder/alien/on_gain(mob/living/carbon/user) return diff --git a/code/modules/mob/living/carbon/human/species_types/golems.dm b/code/modules/mob/living/carbon/human/species_types/golems.dm index 4ee069afe8..abc2288e9b 100644 --- a/code/modules/mob/living/carbon/human/species_types/golems.dm +++ b/code/modules/mob/living/carbon/human/species_types/golems.dm @@ -469,7 +469,7 @@ var/cooldown = 150 var/last_teleport = 0 -/datum/action/innate/unstable_teleport/IsAvailable() +/datum/action/innate/unstable_teleport/IsAvailable(silent = FALSE) if(..()) if(world.time > last_teleport + cooldown) return 1 diff --git a/code/modules/mob/living/carbon/human/species_types/jellypeople.dm b/code/modules/mob/living/carbon/human/species_types/jellypeople.dm index 9937b52002..c04167a61f 100644 --- a/code/modules/mob/living/carbon/human/species_types/jellypeople.dm +++ b/code/modules/mob/living/carbon/human/species_types/jellypeople.dm @@ -84,7 +84,7 @@ background_icon_state = "bg_alien" required_mobility_flags = NONE -/datum/action/innate/regenerate_limbs/IsAvailable() +/datum/action/innate/regenerate_limbs/IsAvailable(silent = FALSE) if(..()) var/mob/living/carbon/human/H = owner var/list/limbs_to_heal = H.get_missing_limbs() @@ -223,7 +223,7 @@ icon_icon = 'icons/mob/actions/actions_slime.dmi' background_icon_state = "bg_alien" -/datum/action/innate/split_body/IsAvailable() +/datum/action/innate/split_body/IsAvailable(silent = FALSE) if(..()) var/mob/living/carbon/human/H = owner if(H.blood_volume >= BLOOD_VOLUME_SLIME_SPLIT) @@ -776,7 +776,7 @@ ..() species = _species -/datum/action/innate/use_extract/IsAvailable() +/datum/action/innate/use_extract/IsAvailable(silent = FALSE) if(..()) if(species && species.current_extract && (world.time > species.extract_cooldown)) return TRUE diff --git a/code/modules/mob/living/say.dm b/code/modules/mob/living/say.dm index 35b49cce8e..f90b285d2d 100644 --- a/code/modules/mob/living/say.dm +++ b/code/modules/mob/living/say.dm @@ -354,7 +354,7 @@ GLOBAL_LIST_INIT(department_radio_keys, list( if(cultslurring) message = cultslur(message) - + if(clockcultslurring) message = CLOCK_CULT_SLUR(message) diff --git a/code/modules/mob/living/simple_animal/hostile/giant_spider.dm b/code/modules/mob/living/simple_animal/hostile/giant_spider.dm index 3c3612f434..439bedf3cc 100644 --- a/code/modules/mob/living/simple_animal/hostile/giant_spider.dm +++ b/code/modules/mob/living/simple_animal/hostile/giant_spider.dm @@ -400,10 +400,9 @@ action.button_icon_state = "wrap_[active]" action.UpdateButtonIcon() -/obj/effect/proc_holder/wrap/Click() - if(!istype(usr, /mob/living/simple_animal/hostile/poison/giant_spider/nurse)) +/obj/effect/proc_holder/wrap/Trigger(mob/living/simple_animal/hostile/poison/giant_spider/nurse/user) + if(!istype(user)) return TRUE - var/mob/living/simple_animal/hostile/poison/giant_spider/nurse/user = usr activate(user) return TRUE @@ -444,7 +443,7 @@ check_flags = AB_CHECK_CONSCIOUS button_icon_state = "lay_eggs" -/datum/action/innate/spider/lay_eggs/IsAvailable() +/datum/action/innate/spider/lay_eggs/IsAvailable(silent = FALSE) if(..()) if(!istype(owner, /mob/living/simple_animal/hostile/poison/giant_spider/nurse)) return 0 @@ -508,7 +507,7 @@ desc = "Send a command to all living spiders." button_icon_state = "command" -/datum/action/innate/spider/comm/IsAvailable() +/datum/action/innate/spider/comm/IsAvailable(silent = FALSE) if(!istype(owner, /mob/living/simple_animal/hostile/poison/giant_spider/nurse/midwife)) return FALSE return TRUE diff --git a/code/modules/mob/living/simple_animal/slime/powers.dm b/code/modules/mob/living/simple_animal/slime/powers.dm index bf80ab9ff4..4f8e271d6f 100644 --- a/code/modules/mob/living/simple_animal/slime/powers.dm +++ b/code/modules/mob/living/simple_animal/slime/powers.dm @@ -11,7 +11,7 @@ background_icon_state = "bg_alien" var/needs_growth = NO_GROWTH_NEEDED -/datum/action/innate/slime/IsAvailable() +/datum/action/innate/slime/IsAvailable(silent = FALSE) if(..()) var/mob/living/simple_animal/slime/S = owner if(needs_growth == GROWTH_NEEDED) diff --git a/code/modules/projectiles/gun.dm b/code/modules/projectiles/gun.dm index dd40648191..9c1a23174e 100644 --- a/code/modules/projectiles/gun.dm +++ b/code/modules/projectiles/gun.dm @@ -513,7 +513,7 @@ icon_icon = 'icons/mob/actions/actions_items.dmi' button_icon_state = "sniper_zoom" -/datum/action/item_action/toggle_scope_zoom/IsAvailable() +/datum/action/item_action/toggle_scope_zoom/IsAvailable(silent = FALSE) . = ..() if(!.) var/obj/item/gun/G = target diff --git a/code/modules/spells/spell.dm b/code/modules/spells/spell.dm index 03488fa8a9..1e4e0b6dc7 100644 --- a/code/modules/spells/spell.dm +++ b/code/modules/spells/spell.dm @@ -45,6 +45,12 @@ GLOBAL_LIST_INIT(spells, typesof(/obj/effect/proc_holder/spell)) //needed for th /obj/effect/proc_holder/singularity_pull() return +/obj/effect/proc_holder/Click() + return Trigger(usr, FALSE) + +/obj/effect/proc_holder/proc/Trigger(mob/user) + return TRUE + /obj/effect/proc_holder/proc/InterceptClickOn(mob/living/caller, params, atom/A) if(caller.ranged_ability != src || ranged_ability_user != caller) //I'm not actually sure how these would trigger, but, uh, safety, I guess? to_chat(caller, "[caller.ranged_ability.name] has been disabled.") @@ -150,8 +156,8 @@ GLOBAL_LIST_INIT(spells, typesof(/obj/effect/proc_holder/spell)) //needed for th if(mobs_blacklist) mobs_blacklist = typecacheof(mobs_blacklist) -/obj/effect/proc_holder/spell/proc/cast_check(skipcharge = FALSE, mob/user = usr) //checks if the spell can be cast based on its settings; skipcharge is used when an additional cast_check is called inside the spell - if(!can_cast(user, skipcharge)) +/obj/effect/proc_holder/spell/proc/cast_check(skipcharge = FALSE, mob/user = usr, skip_can_cast = FALSE) //checks if the spell can be cast based on its settings; skipcharge is used when an additional cast_check is called inside the spell + if(!skip_can_cast && !can_cast(user, skipcharge)) return FALSE if(!skipcharge) @@ -183,15 +189,17 @@ GLOBAL_LIST_INIT(spells, typesof(/obj/effect/proc_holder/spell)) //needed for th /obj/effect/proc_holder/spell/proc/invocation(mob/user = usr) //spelling the spell out and setting it on recharge/reducing charges amount switch(invocation_type) if("shout") - if(prob(50))//Auto-mute? Fuck that noise - user.say(invocation, forced = "spell") - else - user.say(replacetext(invocation," ","`"), forced = "spell") + if(user.can_speak_vocal(invocation)) + if(prob(50))//Auto-mute? Fuck that noise + user.say(invocation, forced = "spell") + else + user.say(replacetext(invocation," ","`"), forced = "spell") if("whisper") - if(prob(50)) - user.whisper(invocation) - else - user.whisper(replacetext(invocation," ","`")) + if(user.can_speak_vocal(invocation)) + if(prob(50)) + user.whisper(invocation) + else + user.whisper(replacetext(invocation," ","`")) if("emote") user.visible_message(invocation, invocation_emote_self) //same style as in mob/living/emote.dm @@ -210,8 +218,8 @@ GLOBAL_LIST_INIT(spells, typesof(/obj/effect/proc_holder/spell)) //needed for th qdel(action) return ..() -/obj/effect/proc_holder/spell/Click() - if(cast_check()) +/obj/effect/proc_holder/spell/Trigger(mob/user, skip_can_cast = TRUE) + if(cast_check(FALSE, user, skip_can_cast)) choose_targets() return 1 @@ -432,7 +440,7 @@ GLOBAL_LIST_INIT(spells, typesof(/obj/effect/proc_holder/spell)) //needed for th return 1 /obj/effect/proc_holder/spell/proc/can_cast(mob/user = usr, skipcharge = FALSE, silent = FALSE) - var/magic_flags = SEND_SIGNAL(user, COMSIG_MOB_SPELL_CAST_CHECK, src) + var/magic_flags = SEND_SIGNAL(user, COMSIG_MOB_SPELL_CAN_CAST, src) if(magic_flags & SPELL_SKIP_ALL_REQS) return TRUE @@ -448,9 +456,8 @@ GLOBAL_LIST_INIT(spells, typesof(/obj/effect/proc_holder/spell)) //needed for th to_chat(user, "You can't cast this spell here.") return FALSE - if(!skipcharge) - if(!charge_check(user)) - return FALSE + if(!skipcharge && !charge_check(user, silent)) + return FALSE if(user.stat && !stat_allowed && !(magic_flags & SPELL_SKIP_STAT)) if(!silent) diff --git a/code/modules/spells/spell_types/aimed.dm b/code/modules/spells/spell_types/aimed.dm index 786026a1bc..1a904b1076 100644 --- a/code/modules/spells/spell_types/aimed.dm +++ b/code/modules/spells/spell_types/aimed.dm @@ -11,12 +11,11 @@ var/current_amount = 0 //How many projectiles left. var/projectiles_per_fire = 1 //Projectiles per fire. Probably not a good thing to use unless you override ready_projectile(). -/obj/effect/proc_holder/spell/aimed/Click() - var/mob/living/user = usr +/obj/effect/proc_holder/spell/aimed/Trigger(mob/user, skip_can_cast = TRUE) if(!istype(user)) return var/msg - if(!can_cast(user, FALSE, TRUE)) + if(!skip_can_cast && !can_cast(user, FALSE, TRUE)) msg = "You can no longer cast [name]!" remove_ranged_ability(msg) return diff --git a/code/modules/spells/spell_types/lightning.dm b/code/modules/spells/spell_types/lightning.dm index 81b26cf464..d0c3c4166c 100644 --- a/code/modules/spells/spell_types/lightning.dm +++ b/code/modules/spells/spell_types/lightning.dm @@ -15,9 +15,9 @@ action_icon_state = "lightning" -/obj/effect/proc_holder/spell/targeted/tesla/Click() - if(!ready && cast_check()) - StartChargeup() +/obj/effect/proc_holder/spell/targeted/tesla/Trigger(mob/user, skip_can_cast = TRUE) + if(!ready && cast_check(FALSE, user, skip_can_cast)) + StartChargeup(user) return 1 /obj/effect/proc_holder/spell/targeted/tesla/proc/StartChargeup(mob/user = usr) diff --git a/code/modules/spells/spell_types/mime.dm b/code/modules/spells/spell_types/mime.dm index a3bb81ae55..8f39da5031 100644 --- a/code/modules/spells/spell_types/mime.dm +++ b/code/modules/spells/spell_types/mime.dm @@ -16,12 +16,12 @@ action_icon_state = "mime" action_background_icon_state = "bg_mime" -/obj/effect/proc_holder/spell/aoe_turf/conjure/mime_wall/Click() - if(usr && usr.mind) - if(!usr.mind.miming) +/obj/effect/proc_holder/spell/aoe_turf/conjure/mime_wall/Trigger(mob/user, skip_can_cast = TRUE) + if(user.mind) + if(!user.mind.miming) to_chat(usr, "You must dedicate yourself to silence first.") return - invocation = "[usr.real_name] looks as if a wall is in front of [usr.p_them()]." + invocation = "[user.real_name] looks as if a wall is in front of [user.p_them()]." else invocation_type ="none" ..() @@ -41,17 +41,12 @@ action_icon_state = "mime" action_background_icon_state = "bg_mime" -/obj/effect/proc_holder/spell/targeted/mime/speak/Click() - if(!usr) - return - if(!ishuman(usr)) - return - var/mob/living/carbon/human/H = usr - if(H.mind.miming) +/obj/effect/proc_holder/spell/targeted/mime/speak/Trigger(mob/user, skip_can_cast = TRUE) + if(user.mind?.miming) still_recharging_msg = "You can't break your vow of silence that fast!" else still_recharging_msg = "You'll have to wait before you can give your vow of silence again!" - ..() + return ..() /obj/effect/proc_holder/spell/targeted/mime/speak/cast(list/targets,mob/user = usr) for(var/mob/living/carbon/human/H in targets) @@ -82,15 +77,15 @@ action_icon_state = "mime" action_background_icon_state = "bg_mime" -/obj/effect/proc_holder/spell/targeted/forcewall/mime/Click() - if(usr && usr.mind) - if(!usr.mind.miming) +/obj/effect/proc_holder/spell/targeted/forcewall/mime/Trigger(mob/user, skip_can_cast = TRUE) + if(user.mind) + if(!user.mind.miming) to_chat(usr, "You must dedicate yourself to silence first.") return - invocation = "[usr.real_name] looks as if a blockade is in front of [usr.p_them()]." + invocation = "[user.real_name] looks as if a blockade is in front of [user.p_them()]." else invocation_type ="none" - ..() + return ..() /obj/effect/proc_holder/spell/aimed/finger_guns name = "Finger Guns" @@ -114,19 +109,18 @@ base_icon_state = "mime" -/obj/effect/proc_holder/spell/aimed/finger_guns/Click() - var/mob/living/carbon/human/owner = usr - if(owner.incapacitated()) - to_chat(owner, "You can't properly point your fingers while incapacitated.") +/obj/effect/proc_holder/spell/aimed/finger_guns/Trigger(mob/user, skip_can_cast = TRUE) + if(user.incapacitated()) + to_chat(user, "You can't properly point your fingers while incapacitated.") return - if(usr && usr.mind) - if(!usr.mind.miming) + if(user.mind) + if(!user.mind.miming) to_chat(usr, "You must dedicate yourself to silence first.") return - invocation = "[usr.real_name] fires [usr.p_their()] finger gun!" + invocation = "[user.real_name] fires [user.p_their()] finger gun!" else invocation_type ="none" - ..() + return ..() /obj/effect/proc_holder/spell/targeted/touch/mimerope name = "Invisible Rope" @@ -144,8 +138,8 @@ action_background_icon_state = "bg_mime" hand_path = /obj/item/melee/touch_attack/mimerope -/obj/effect/proc_holder/spell/targeted/touch/mimerope/Click() - if(usr && usr.mind) +/obj/effect/proc_holder/spell/targeted/touch/mimerope/Trigger(mob/user, skip_can_cast = TRUE) + if(user.mind) if(!usr.mind.miming) to_chat(usr, "You must dedicate yourself to silence first.") return diff --git a/code/modules/surgery/organs/vocal_cords.dm b/code/modules/surgery/organs/vocal_cords.dm index 7c849dbd68..671d31530a 100644 --- a/code/modules/surgery/organs/vocal_cords.dm +++ b/code/modules/surgery/organs/vocal_cords.dm @@ -74,7 +74,7 @@ ..() cords = target -/datum/action/item_action/organ_action/colossus/IsAvailable() +/datum/action/item_action/organ_action/colossus/IsAvailable(silent = FALSE) if(world.time < cords.next_command) return FALSE if(!owner) @@ -632,7 +632,7 @@ ..() cords = target -/datum/action/item_action/organ_action/velvet/IsAvailable() +/datum/action/item_action/organ_action/velvet/IsAvailable(silent = FALSE) return TRUE /datum/action/item_action/organ_action/velvet/Trigger() From 7615f63753b65ee6bd2c3f819b64ffe708fab192 Mon Sep 17 00:00:00 2001 From: Ghommie <42542238+Ghommie@users.noreply.github.com> Date: Sat, 11 Apr 2020 17:43:09 +0200 Subject: [PATCH 064/113] Oopsie --- code/modules/spells/spell.dm | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/code/modules/spells/spell.dm b/code/modules/spells/spell.dm index 1e4e0b6dc7..143fe508b6 100644 --- a/code/modules/spells/spell.dm +++ b/code/modules/spells/spell.dm @@ -187,15 +187,18 @@ GLOBAL_LIST_INIT(spells, typesof(/obj/effect/proc_holder/spell)) //needed for th return TRUE /obj/effect/proc_holder/spell/proc/invocation(mob/user = usr) //spelling the spell out and setting it on recharge/reducing charges amount + var/mob/living/L + if(isliving(user)) + L = user switch(invocation_type) if("shout") - if(user.can_speak_vocal(invocation)) + if(!L || L.can_speak_vocal(invocation)) if(prob(50))//Auto-mute? Fuck that noise user.say(invocation, forced = "spell") else user.say(replacetext(invocation," ","`"), forced = "spell") if("whisper") - if(user.can_speak_vocal(invocation)) + if(!L || L.can_speak_vocal(invocation)) if(prob(50)) user.whisper(invocation) else From ab3ed7f9c2e95245162627598641a0f384624698 Mon Sep 17 00:00:00 2001 From: Ghommie <42542238+Ghommie@users.noreply.github.com> Date: Sat, 11 Apr 2020 23:27:19 +0200 Subject: [PATCH 065/113] Space Hermit Ruin fixes. --- _maps/RandomRuins/SpaceRuins/spacehermit.dmm | 333 +++++++++---------- code/game/turfs/simulated/minerals.dm | 14 +- icons/turf/mining.dmi | Bin 39619 -> 39985 bytes icons/turf/smoothrocks.dmi | Bin 5463 -> 4949 bytes 4 files changed, 172 insertions(+), 175 deletions(-) diff --git a/_maps/RandomRuins/SpaceRuins/spacehermit.dmm b/_maps/RandomRuins/SpaceRuins/spacehermit.dmm index 8113c586ff..dd7e700146 100644 --- a/_maps/RandomRuins/SpaceRuins/spacehermit.dmm +++ b/_maps/RandomRuins/SpaceRuins/spacehermit.dmm @@ -145,9 +145,6 @@ "aE" = ( /turf/open/floor/plating/asteroid/airless, /area/ruin/powered) -"aF" = ( -/turf/open/floor/plating/asteroid, -/area/ruin/powered) "aG" = ( /obj/structure/sink/puddle, /turf/open/floor/plating/asteroid, @@ -241,7 +238,7 @@ /turf/closed/mineral/random/low_chance/earth_like, /area/ruin/powered) "bb" = ( -/turf/closed/mineral/random/earth_like, +/turf/closed/mineral/random/no_caves/earth_like, /area/ruin/powered) "bc" = ( /obj/item/circuitboard/machine/circuit_imprinter, @@ -1137,7 +1134,7 @@ ao ao ak af -aF +am bb bb bb @@ -1189,7 +1186,7 @@ an an ae ae -aF +am bb bb bb @@ -1223,8 +1220,8 @@ bb bb bb ba -aF -aF +am +am ba ba ba @@ -1241,7 +1238,7 @@ ar af at at -aF +am bb fp bb @@ -1275,10 +1272,10 @@ bb bb bb ad -aF -aF -aF -aF +am +am +am +am ba aH aJ @@ -1286,13 +1283,13 @@ aL bb bb aT -aF -aF -aF -aF -aF -aF -aF +am +am +am +am +am +am +am aR bb bb @@ -1328,23 +1325,23 @@ bb bb ad au -aF +am aB -aF -aF -aF -aF -aF +am +am +am +am +am ba bb -aF -aF -aF -aF -aF -aF -aF -aF +am +am +am +am +am +am +am +am bg bb fp @@ -1384,19 +1381,19 @@ bs aC bC WH -aF -aF -aF +am +am +am ba bb bb -aF -aF -aF -aF -aF -aF -aF +am +am +am +am +am +am +am bb bb bb @@ -1432,23 +1429,23 @@ bb bb ad ax -aF +am aD -aF -aF -aF -aF +am +am +am +am bb bb bb aU bd -aF -aF +am +am bl bm -aF -aF +am +am bb bb bb @@ -1484,20 +1481,20 @@ bb bb ad ay -aF -aF -aF +am +am +am aG -aF -aF +am +am bb bb ba av be -aF -aF -aF +am +am +am bn bo bo @@ -1535,24 +1532,24 @@ bb bb bb ba -aF -aF -aF -aF -aF -aF -aF +am +am +am +am +am +am +am bb bb bb bc bf -aF -aF -aF -aF -aF -aF +am +am +am +am +am +am br bb bb @@ -1590,22 +1587,22 @@ bb bb bb bb -aF -aF -aF -aF -aF +am +am +am +am +am bb bb -aF -aF -aF -aF -aF -aF -aF -aF -aF +am +am +am +am +am +am +am +am +am bb bb bb @@ -1642,21 +1639,21 @@ bb bb bb bb -aF -aF -aF -aF -aF +am +am +am +am +am aN -aF -aF -aF -aF +am +am +am +am aR -aF -aF -aF -aF +am +am +am +am bb bb fp @@ -1695,22 +1692,22 @@ bb bb bb ba -aF -aF -aF +am +am +am ba ba -aF -aF -aF -aF -aF -aF -aF -aF -aF -aF -aF +am +am +am +am +am +am +am +am +am +am +am ba ba ba @@ -1752,16 +1749,16 @@ ba aK ba ba -aF -aF -aF -aF -aF -aF -aF +am +am +am +am +am +am +am bp -aF -aF +am +am aR ba ba @@ -1805,15 +1802,15 @@ ba fp ba aP -aF -aF -aF -aF -aF -aF -aF -aF -aF +am +am +am +am +am +am +am +am +am aR ba ba @@ -1858,15 +1855,15 @@ ba ba aQ aP -aF -aF +am +am aR -aF -aF -aF -aF +am +am +am +am bb -aF +am ba ba aZ @@ -1910,12 +1907,12 @@ ba ba ba ba -aF -aF -aF -aF +am +am +am +am aP -aF +am bg bb bb @@ -1962,12 +1959,12 @@ bb bb ba ba -aF -aF -aF -aF -aF -aF +am +am +am +am +am +am aS bb fp @@ -2015,11 +2012,11 @@ bb bb ba bg -aF -aF -aF -aF -aF +am +am +am +am +am aS bb fp @@ -2066,12 +2063,12 @@ bb bb fp ba -aF -aF +am +am bj -aF -aF -aF +am +am +am aS fp bb @@ -2120,9 +2117,9 @@ ba ba aS bi -aF -aF -aF +am +am +am aS aS bb @@ -2171,10 +2168,10 @@ ba aZ ba aS -aF -aF -aF -aF +am +am +am +am aS aS ba diff --git a/code/game/turfs/simulated/minerals.dm b/code/game/turfs/simulated/minerals.dm index c61ac8972c..20ced46e87 100644 --- a/code/game/turfs/simulated/minerals.dm +++ b/code/game/turfs/simulated/minerals.dm @@ -173,6 +173,13 @@ /turf/closed/mineral/silver = 12, /turf/closed/mineral/plasma = 20, /turf/closed/mineral/iron = 40, /turf/closed/mineral/titanium = 11, /turf/closed/mineral/gibtonite = 4, /turf/closed/mineral/bscrystal = 1) +/turf/closed/mineral/random/no_caves/earth_like + icon_state = "rock_oxy" + turf_type = /turf/open/floor/plating/asteroid + baseturfs = /turf/open/floor/plating/asteroid + initial_gas_mix = OPENTURF_DEFAULT_ATMOS + defer_change = TRUE + /turf/closed/mineral/random/high_chance icon_state = "rock_highchance" mineralChance = 25 @@ -246,13 +253,6 @@ /turf/closed/mineral/silver/volcanic = 20, /turf/closed/mineral/plasma/volcanic = 30, /turf/closed/mineral/bscrystal/volcanic = 1, /turf/closed/mineral/gibtonite/volcanic = 2, /turf/closed/mineral/iron/volcanic = 95) -/turf/closed/mineral/random/earth_like - icon_state = "rock_oxy" - turf_type = /turf/open/floor/plating/asteroid - baseturfs = /turf/open/floor/plating/asteroid - initial_gas_mix = OPENTURF_DEFAULT_ATMOS - defer_change = TRUE - /turf/closed/mineral/iron mineralType = /obj/item/stack/ore/iron diff --git a/icons/turf/mining.dmi b/icons/turf/mining.dmi index 6561438228be7c87921d297f61f6c57ccd2da724..335cff453e0efa3779c51fe9e82035774cbab499 100644 GIT binary patch literal 39985 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 z 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∨Pj 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 z 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 literal 5463 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 Date: Sat, 11 Apr 2020 23:43:01 +0200 Subject: [PATCH 066/113] Not-so-airless turfs. --- code/game/turfs/simulated/minerals.dm | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/code/game/turfs/simulated/minerals.dm b/code/game/turfs/simulated/minerals.dm index 20ced46e87..7e1b39cb39 100644 --- a/code/game/turfs/simulated/minerals.dm +++ b/code/game/turfs/simulated/minerals.dm @@ -177,6 +177,9 @@ icon_state = "rock_oxy" turf_type = /turf/open/floor/plating/asteroid baseturfs = /turf/open/floor/plating/asteroid + mineralSpawnChanceList = list(/turf/closed/mineral/uranium/earth_like = 5, /turf/closed/mineral/diamond/earth_like = 1, /turf/closed/mineral/gold/earth_like = 10, + /turf/closed/mineral/silver/earth_like = 12, /turf/closed/mineral/plasma/earth_like = 20, /turf/closed/mineral/iron/earth_like = 40, + /turf/closed/mineral/titanium/earth_like = 11, /turf/closed/mineral/gibtonite/earth_like = 4, /turf/closed/mineral/bscrystal/earth_like = 1) initial_gas_mix = OPENTURF_DEFAULT_ATMOS defer_change = TRUE @@ -201,6 +204,10 @@ icon_state = "rock_highchance_oxy" turf_type = /turf/open/floor/plating/asteroid baseturfs = /turf/open/floor/plating/asteroid + mineralSpawnChanceList = list( + /turf/closed/mineral/uranium/earth_like = 35, /turf/closed/mineral/diamond/earth_like = 30, /turf/closed/mineral/gold/earth_like = 45, + /turf/closed/mineral/titanium/earth_like = 45, /turf/closed/mineral/silver/earth_like = 50, /turf/closed/mineral/plasma/earth_like = 50, + /turf/closed/mineral/bscrystal/earth_like = 20) initial_gas_mix = OPENTURF_DEFAULT_ATMOS defer_change = TRUE @@ -218,6 +225,10 @@ turf_type = /turf/open/floor/plating/asteroid baseturfs = /turf/open/floor/plating/asteroid initial_gas_mix = OPENTURF_DEFAULT_ATMOS + mineralSpawnChanceList = list( + /turf/closed/mineral/uranium/earth_like = 2, /turf/closed/mineral/diamond/earth_like = 1, /turf/closed/mineral/gold/earth_like = 4, + /turf/closed/mineral/titanium/earth_like = 4, /turf/closed/mineral/silver/earth_like = 6, /turf/closed/mineral/plasma/earth_like = 15, + /turf/closed/mineral/iron/earth_like = 40, /turf/closed/mineral/gibtonite/earth_like = 2, /turf/closed/mineral/bscrystal/earth_like = 1) defer_change = TRUE /turf/closed/mineral/random/volcanic @@ -624,3 +635,10 @@ baseturfs = /turf/open/floor/plating/asteroid/basalt/lava_land_surface initial_gas_mix = LAVALAND_DEFAULT_ATMOS defer_change = 1 + +/turf/closed/mineral/gibtonite/earth_like + icon_state = "rock_oxy" + turf_type = /turf/open/floor/plating/asteroid + baseturfs = /turf/open/floor/plating/asteroid + initial_gas_mix = OPENTURF_DEFAULT_ATMOS + defer_change = TRUE From 983f3693573d6f2e53e20b380aad04367c77e46c Mon Sep 17 00:00:00 2001 From: Ghommie <42542238+Ghommie@users.noreply.github.com> Date: Sun, 12 Apr 2020 01:49:25 +0200 Subject: [PATCH 067/113] Little Holodeck refactor. --- code/__HELPERS/global_lists.dm | 8 ++++++++ code/_globalvars/lists/mapping.dm | 2 ++ code/game/area/areas/holodeck.dm | 4 ++++ code/modules/holodeck/area_copy.dm | 25 ++++++++++++++++++++----- code/modules/holodeck/computer.dm | 9 +++++---- 5 files changed, 39 insertions(+), 9 deletions(-) diff --git a/code/__HELPERS/global_lists.dm b/code/__HELPERS/global_lists.dm index 38e25b04c5..0c45a746d8 100644 --- a/code/__HELPERS/global_lists.dm +++ b/code/__HELPERS/global_lists.dm @@ -89,6 +89,14 @@ INVOKE_ASYNC(GLOBAL_PROC, /proc/init_ref_coin_values) //so the current procedure doesn't sleep because of UNTIL() + for(var/path in subtypesof(/area/holodeck)) + var/area/holodeck/A = path + var/list/compatibles = initial(A.compatible_holodeck_comps) + if(!compatibles || initial(A.abstract_type) == path) + continue + for(var/comp in compatibles) + LAZYADD(GLOB.holodeck_areas_prototypes[comp], A) + //creates every subtype of prototype (excluding prototype) and adds it to list L. //if no list/L is provided, one is created. /proc/init_subtypes(prototype, list/L) diff --git a/code/_globalvars/lists/mapping.dm b/code/_globalvars/lists/mapping.dm index fb8863ebe7..bcf35859c3 100644 --- a/code/_globalvars/lists/mapping.dm +++ b/code/_globalvars/lists/mapping.dm @@ -50,3 +50,5 @@ GLOBAL_LIST_EMPTY_TYPED(areas_by_type, /area) GLOBAL_LIST_EMPTY(all_abstract_markers) GLOBAL_LIST_EMPTY(stationroom_landmarks) //List of all spawns for stationrooms + +GLOBAL_LIST_EMPTY(holodeck_areas_prototypes) //List of holodeck area prototypes per holodeck computer type \ No newline at end of file diff --git a/code/game/area/areas/holodeck.dm b/code/game/area/areas/holodeck.dm index d32091f98b..75ed2b656c 100644 --- a/code/game/area/areas/holodeck.dm +++ b/code/game/area/areas/holodeck.dm @@ -6,6 +6,8 @@ hidden = TRUE var/obj/machinery/computer/holodeck/linked + var/list/compatible_holodeck_comps + var/abstract_type = /area/holodeck var/restricted = 0 // if true, program goes on emag list /* @@ -53,6 +55,8 @@ */ /area/holodeck/rec_center name = "\improper Recreational Holodeck" + compatible_holodeck_comps = list(/obj/machinery/computer/holodeck) + abstract_type = /area/holodeck/rec_center /area/holodeck/rec_center/offline name = "Holodeck - Offline" diff --git a/code/modules/holodeck/area_copy.dm b/code/modules/holodeck/area_copy.dm index 9fb97c08a7..67f8cdddec 100644 --- a/code/modules/holodeck/area_copy.dm +++ b/code/modules/holodeck/area_copy.dm @@ -63,23 +63,38 @@ GLOBAL_LIST_INIT(duplicate_forbidden_vars_by_type, typecacheof_assoc_list(list( var/src_min_x = 99999 var/src_min_y = 99999 + var/src_max_x = 0 + var/src_max_y = 0 var/list/refined_src = new/list() - for (var/turf/T in turfs_src) + for (var/i in turfs_src) + var/turf/T = i src_min_x = min(src_min_x,T.x) src_min_y = min(src_min_y,T.y) - for (var/turf/T in turfs_src) + src_max_x = max(src_max_x,T.y) + src_max_y = max(src_max_y,T.y) + for (var/i in turfs_src) + var/turf/T = i refined_src[T] = "[T.x - src_min_x].[T.y - src_min_y]" var/trg_min_x = 99999 var/trg_min_y = 99999 + var/trg_max_x = 0 + var/trg_max_y = 0 var/list/refined_trg = new/list() - for (var/turf/T in turfs_trg) + for (var/i in turfs_trg) + var/turf/T = i trg_min_x = min(trg_min_x,T.x) trg_min_y = min(trg_min_y,T.y) - for (var/turf/T in turfs_trg) - refined_trg["[T.x - trg_min_x].[T.y - trg_min_y]"] = T + trg_max_x = max(trg_max_x,T.y) + trg_max_y = max(trg_max_y,T.y) + + var/diff_x = round(((src_max_x - src_min_x) - (trg_max_x - trg_min_x))/2) + var/diff_y = round(((src_max_y - src_min_y) - (trg_max_y - trg_min_y))/2) + for (var/i in turfs_trg) + var/turf/T = i + refined_trg["[T.x - trg_min_x + diff_x].[T.y - trg_min_y + diff_y]"] = T var/list/toupdate = new/list() diff --git a/code/modules/holodeck/computer.dm b/code/modules/holodeck/computer.dm index b5cbed8b79..3c87082393 100644 --- a/code/modules/holodeck/computer.dm +++ b/code/modules/holodeck/computer.dm @@ -2,7 +2,10 @@ Holodeck Update The on-station holodeck area is of type [holodeck_type]. - All subtypes of [program_type] are loaded into the program cache or emag programs list. + All types found in GLOB.holodeck_areas_per_comp_type[src.type], generated on make_datum_references_lists(), + are loaded into the program cache or emag programs list. + Paths with their abstract_type variable equal to themselves will be skipped. + If init_program is null, a random program will be loaded on startup. If you don't wish this, set it to the offline program or another of your choosing. @@ -12,7 +15,6 @@ 3) Create a new control console that uses those areas Non-mapped areas should be skipped but you should probably comment them out anyway. - The base of program_type will always be ignored; only subtypes will be loaded. */ #define HOLODECK_CD 25 @@ -35,7 +37,6 @@ // Splitting this up allows two holodecks of the same size // to use the same source patterns. Y'know, if you want to. var/holodeck_type = /area/holodeck/rec_center // locate(this) to get the target holodeck - var/program_type = /area/holodeck/rec_center // subtypes of this (but not this itself) are loadable programs var/active = FALSE var/damaged = FALSE @@ -181,7 +182,7 @@ return ..() /obj/machinery/computer/holodeck/proc/generate_program_list() - for(var/typekey in subtypesof(program_type)) + for(var/typekey in GLOB.holodeck_areas_prototypes[type]) var/area/holodeck/A = GLOB.areas_by_type[typekey] if(!A || !A.contents.len) continue From fe4b2705681be4976c31c28b57e332413ca79e4b Mon Sep 17 00:00:00 2001 From: Ghommie <42542238+Ghommie@users.noreply.github.com> Date: Sun, 12 Apr 2020 05:08:49 +0200 Subject: [PATCH 068/113] Sprite size preferences?! Oh no! --- code/__DEFINES/movespeed_modification.dm | 1 + code/__HELPERS/mobs.dm | 3 ++- .../configuration/entries/game_options.dm | 23 +++++++++++++++++ code/datums/dna.dm | 17 +++++++++++++ code/modules/client/preferences.dm | 25 ++++++++++++++++++- code/modules/client/preferences_savefile.dm | 10 ++++++++ config/game_options.txt | 12 +++++++++ 7 files changed, 89 insertions(+), 2 deletions(-) diff --git a/code/__DEFINES/movespeed_modification.dm b/code/__DEFINES/movespeed_modification.dm index 76c326cec0..9764cda1ae 100644 --- a/code/__DEFINES/movespeed_modification.dm +++ b/code/__DEFINES/movespeed_modification.dm @@ -59,6 +59,7 @@ #define MOVESPEED_ID_SPECIES "SPECIES_SPEED_MOD" +#define MOVESPEED_ID_SMALL_STRIDE "SMALL_STRIDE" #define MOVESPEED_ID_PRONE_DRAGGING "PRONE_DRAG" #define MOVESPEED_ID_HUMAN_CARRYING "HUMAN_CARRY" #define MOVESPEED_ID_SHRINK_RAY "SHRUNKEN_SPEED_MODIFIER" diff --git a/code/__HELPERS/mobs.dm b/code/__HELPERS/mobs.dm index febd333578..e022c10007 100644 --- a/code/__HELPERS/mobs.dm +++ b/code/__HELPERS/mobs.dm @@ -209,7 +209,8 @@ "ipc_antenna" = "None", "flavor_text" = "", "meat_type" = "Mammalian", - "body_model" = MALE + "body_model" = MALE, + "body_size" = RESIZE_DEFAULT_SIZE )) /proc/random_hair_style(gender) diff --git a/code/controllers/configuration/entries/game_options.dm b/code/controllers/configuration/entries/game_options.dm index f253bc543d..c3d0d2e3e7 100644 --- a/code/controllers/configuration/entries/game_options.dm +++ b/code/controllers/configuration/entries/game_options.dm @@ -449,3 +449,26 @@ key_mode = KEY_MODE_TEXT value_mode = VALUE_MODE_FLAG config_entry_value = list(GEN_VISIBLE_NO_CLOTHES, GEN_VISIBLE_NO_UNDIES, GEN_VISIBLE_NEVER) //refer to cit_helpers for all toggles. + +//Body size configs, the feature will be disabled if both min and max have the same value. +/datum/config_entry/number/body_size_min + config_entry_value = RESIZE_DEFAULT_SIZE + min_val = 0.1 //to avoid issues with zeros and negative values. + max_val = RESIZE_DEFAULT_SIZE + +/datum/config_entry/number/body_size_max + config_entry_value = RESIZE_DEFAULT_SIZE + min_val = RESIZE_DEFAULT_SIZE + +//pun pun slowdown for characters smaller than this thanks shorter strides. +//Set to a value below 'body_size_min' to disable it. +/datum/config_entry/number/threshold_body_size_slowdown + config_entry_value = RESIZE_DEFAULT_SIZE * 0.85 + min_val = 0 + max_val = RESIZE_DEFAULT_SIZE + +//multiplicative slowdown multiplier. See 'dna.update_body_size' for the operation. +//doesn't apply to floating or crawling mobs +/datum/config_entry/number/body_size_slowdown_multiplier + config_entry_value = 0.25 + min_val = 1.1 //otherwise it'd be a waste of time. diff --git a/code/datums/dna.dm b/code/datums/dna.dm index 95b45b6bc2..1c866ea535 100644 --- a/code/datums/dna.dm +++ b/code/datums/dna.dm @@ -41,6 +41,7 @@ /datum/dna/proc/transfer_identity(mob/living/carbon/destination, transfer_SE = 0) if(!istype(destination)) return + var/old_size = destination.dna.features["body_size"] destination.dna.unique_enzymes = unique_enzymes destination.dna.uni_identity = uni_identity destination.dna.blood_type = blood_type @@ -56,6 +57,8 @@ if(transfer_SE) destination.dna.mutation_index = mutation_index + destination.dna.update_body_size(old_size) + SEND_SIGNAL(destination, COMSIG_CARBON_IDENTITY_TRANSFERRED_TO, src, transfer_SE) /datum/dna/proc/copy_dna(datum/dna/new_dna) @@ -368,7 +371,9 @@ /mob/living/carbon/human/proc/hardset_dna(ui, list/mutation_index, newreal_name, newblood_type, datum/species/mrace, newfeatures) if(newfeatures) + var/old_size = dna.features["body_size"] dna.features = newfeatures + dna.update_body_size(old_size) if(mrace) var/datum/species/newrace = new mrace.type @@ -644,3 +649,15 @@ gib() else set_species(/datum/species/dullahan) + +/datum/dna/proc/update_body_size(old_size) + if(!holder || features["body_size"] == old_size) + return + holder.resize = features["body_size"] / old_size + holder.update_transform() + var/danger = CONFIG_GET(number/threshold_body_size_slowdown) + if(features["body_size"] < danger) + var/slowdown = 1 + round(danger/features["body_size"], 0.1) * CONFIG_GET(number/body_size_slowdown_multiplier) + holder.add_movespeed_modifier(MOVESPEED_ID_SMALL_STRIDE, TRUE, 100, NONE, TRUE, slowdown, ALL, FLOATING|CRAWLING) + else if(old_size < danger) + holder.remove_movespeed_modifier(MOVESPEED_ID_SMALL_STRIDE) diff --git a/code/modules/client/preferences.dm b/code/modules/client/preferences.dm index adfcd547bc..c2196fb170 100644 --- a/code/modules/client/preferences.dm +++ b/code/modules/client/preferences.dm @@ -150,7 +150,8 @@ GLOBAL_LIST_EMPTY(preferences_datums) "ipc_antenna" = "None", "flavor_text" = "", "meat_type" = "Mammalian", - "body_model" = MALE + "body_model" = MALE, + "body_size" = RESIZE_DEFAULT_SIZE ) var/list/custom_names = list() @@ -379,6 +380,9 @@ GLOBAL_LIST_EMPTY(preferences_datums) dat += "    Change
" mutant_colors = TRUE + if (CONFIG_GET(number/body_size_min) != CONFIG_GET(number/body_size_max)) + dat += "Sprite Size: [features["body_size"]]%
" + if((EYECOLOR in pref_species.species_traits) && !(NOEYES in pref_species.species_traits)) if(!use_skintones && !mutant_colors) @@ -2191,6 +2195,21 @@ GLOBAL_LIST_EMPTY(preferences_datums) if("body_model") features["body_model"] = features["body_model"] == MALE ? FEMALE : MALE + if("bodysize") + var/min = CONFIG_GET(number/body_size_min) + var/max = CONFIG_GET(number/body_size_max) + var/danger = CONFIG_GET(number/threshold_body_size_slowdown) + var/new_bodysize = input(user, "Choose your desired sprite size:\n([min*100]%-[max*100]%), Warning: May make your character look distorted[danger > min ? ", and an exponential slowdown will occur for those smaller than [danger*100]%!" : "!"]", "Character Preference", features["body_size"]*100) as num|null + if (new_bodysize) + new_bodysize = CLAMP(new_bodysize * 0.01, min, max) + var/dorfy + if(danger > new_bodysize) + dorfy = alert(user, "The chosen size appears to be smaller than the threshold of [danger*100]%, which will lead to an added exponential slowdown. Are you sure about that?", "Dwarfism Alert", "Yes", "Move it to the threshold", "No") + if(!dorfy || dorfy == "Move it above the threshold") + new_bodysize = danger + if(dorfy != "No") + features["body_size"] = new_bodysize + if("hotkeys") hotkeys = !hotkeys if(hotkeys) @@ -2431,6 +2450,8 @@ GLOBAL_LIST_EMPTY(preferences_datums) pref_species = new /datum/species/human save_character() + var/old_size = character.dna.features["body_size"] + character.dna.features = features.Copy() character.set_species(chosen_species, icon_update = FALSE, pref_load = TRUE) character.dna.real_name = character.real_name @@ -2452,6 +2473,8 @@ GLOBAL_LIST_EMPTY(preferences_datums) character.give_genitals(TRUE) //character.update_genitals() is already called on genital.update_appearance() + character.dna.update_body_size(old_size) + SEND_SIGNAL(character, COMSIG_HUMAN_PREFS_COPIED_TO, src, icon_updates, roundstart_checks) //let's be sure the character updates diff --git a/code/modules/client/preferences_savefile.dm b/code/modules/client/preferences_savefile.dm index ca51a27dae..7da9d5a1dc 100644 --- a/code/modules/client/preferences_savefile.dm +++ b/code/modules/client/preferences_savefile.dm @@ -395,6 +395,7 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car S["body_is_always_random"] >> be_random_body S["gender"] >> gender S["body_model"] >> features["body_model"] + S["body_size"] >> features["body_size"] S["age"] >> age S["hair_color"] >> hair_color S["facial_hair_color"] >> facial_hair_color @@ -568,6 +569,14 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car features["insect_markings"] = sanitize_inlist(features["insect_markings"], GLOB.insect_markings_list, "None") features["insect_wings"] = sanitize_inlist(features["insect_wings"], GLOB.insect_wings_list) + var/static/size_min + if(!size_min) + size_min = CONFIG_GET(number/body_size_min) + var/static/size_max + if(!size_max) + size_max = CONFIG_GET(number/body_size_max) + features["body_size"] = sanitize_integer(features["body_size"], size_min, size_max, RESIZE_DEFAULT_SIZE) + var/static/list/B_sizes if(!B_sizes) var/list/L = CONFIG_GET(keyed_list/breasts_cups_prefs) @@ -643,6 +652,7 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car WRITE_FILE(S["body_is_always_random"] , be_random_body) WRITE_FILE(S["gender"] , gender) WRITE_FILE(S["body_model"] , features["body_model"]) + WRITE_FILE(S["body_size"] , features["body_size"]) WRITE_FILE(S["age"] , age) WRITE_FILE(S["hair_color"] , hair_color) WRITE_FILE(S["facial_hair_color"] , facial_hair_color) diff --git a/config/game_options.txt b/config/game_options.txt index c3930fd325..dd49446ecc 100644 --- a/config/game_options.txt +++ b/config/game_options.txt @@ -620,3 +620,15 @@ BREASTS_CUPS_PREFS e ## Minimum and maximum limits for penis length from the character creation menu. PENIS_MIN_INCHES_PREFS 1 PENIS_MAX_INCHES_PREFS 20 + +## Body size configs, the feature will be disabled if both min and max have the same value. +BODY_SIZE_MIN 1 +BODY_SIZE_MAX 1 + +## Pun-Pun slowdown for characters smaller than this thanks shorter strides. +## Set to a value below BODY_SIZE_MIN to disable it. +THRESHOLD_BODY_SIZE_SLOWDOWN 0.85 + +## Multiplier used in the smaller strides slowdown calculation. +## Doesn't apply to floating or crawling mobs. +BODY_SIZE_SLOWDOWN_MULTIPLIER 0.25 \ No newline at end of file From e6fbd0ccedfd8143d57344095092d34e0f2498c3 Mon Sep 17 00:00:00 2001 From: Ghommie <42542238+Ghommie@users.noreply.github.com> Date: Sun, 12 Apr 2020 05:13:43 +0200 Subject: [PATCH 069/113] Whops --- code/modules/client/preferences.dm | 69 +++++++++++++++--------------- 1 file changed, 35 insertions(+), 34 deletions(-) diff --git a/code/modules/client/preferences.dm b/code/modules/client/preferences.dm index c2196fb170..f7d251f32d 100644 --- a/code/modules/client/preferences.dm +++ b/code/modules/client/preferences.dm @@ -295,7 +295,7 @@ GLOBAL_LIST_EMPTY(preferences_datums) dat += "[real_name]
" dat += "Be nameless: [nameless ? "Yes" : "No"]
" - dat += "Gender: [gender == MALE ? "Male" : (gender == FEMALE ? "Female" : (gender == PLURAL ? "Non-binary" : "Object"))]
" + dat += "Gender: [gender == MALE ? "Male" : (gender == FEMALE ? "Female" : (gender == PLURAL ? "Non-binary" : "Object"))]
" dat += "Age: [age]
" dat += "Special Names:
" @@ -346,7 +346,7 @@ GLOBAL_LIST_EMPTY(preferences_datums) else dat += "[TextPreview(features["flavor_text"])]...
" dat += "