From a87c667d2f4133028913bbdb3bba299ec671781f Mon Sep 17 00:00:00 2001
From: SmArtKar <44720187+SmArtKar@users.noreply.github.com>
Date: Thu, 8 Aug 2024 20:18:23 +0300
Subject: [PATCH 01/96] Circuit UI scale no longer suffers from FPEs and doesnt
get covered by component menu (#85653)
## About The Pull Request
Added rounding to 1 number after point to prevent FPEs and made the
scale bar shrink when component menu gets open as to prevent it from
getting covered by the menu, which made it impossible to see or increase
current scale
## Changelog
:cl:
fix: Circuit UI scale no longer has weird rounding
fix: Circuit UI no longer gets covered by components menu
/:cl:
---
.../tgui/components/InfinitePlane.jsx | 37 ++++++++++---------
.../interfaces/IntegratedCircuit/index.jsx | 1 +
2 files changed, 21 insertions(+), 17 deletions(-)
diff --git a/tgui/packages/tgui/components/InfinitePlane.jsx b/tgui/packages/tgui/components/InfinitePlane.jsx
index 5277f2ad7968..3be047f1a036 100644
--- a/tgui/packages/tgui/components/InfinitePlane.jsx
+++ b/tgui/packages/tgui/components/InfinitePlane.jsx
@@ -123,6 +123,7 @@ export class InfinitePlane extends Component {
imageWidth,
initialLeft = 0,
initialTop = 0,
+ scalePadding,
...rest
} = this.props;
const { left, top, zoom } = this.state;
@@ -169,23 +170,25 @@ export class InfinitePlane extends Component {
{children}
-
(gHi(> zl;|j>PnvHbj;~jIOJwlO`gDH)h{yWH7btT4?;PJ2c@W>FKAq#MjW5Ii^Qlkg_-f+| zF~GOgr~lylUtSd507~oQ7g>BE1{gi{F}jn$Z=U@H9Q$dEPo$+K&++FMU+6Pz&;I-o z6fOH9f-k=>?eas%_$4==zW9@kV|V9#{;FRyqig(s9l5DL=ks4I@I`;YSghu^v)%2e zc)J+KR~VnWef{HqTd!xc^UaQLapRjE-{!_QJHE}0Z+3i}8((hxgLTn!hc=`6`~C)#=Rl=C9++uCi_b zhQE08w;8_K`P+XC-|YNthHrNMHp4eNf1BZ(oxjcS&CcIu_-5yCi%wqFE}0BpkO6c~ z-ib`!26aD8ga1U&WZv%Q^~g6z!)C2SS=J`WS#DSdKv8*(ni6rDvP8mPj4}!Sj3GdE zeY}qFKdsH}oORnDK(%JTzm&91%73yxy}TG?YKgL&|7|HPARM&KEYUW-KHX^eEEbE! bGDZIfA(H~U<&Mq@00000NkvXXu0mjfcao%U delta 2234 zcmV;r2u1h76UP#eBmuyYC53;NWF}|hb&?rSG&Lu&5+tl=q=N-xH;oim7vyIa=jRdW zWMsu8S(1|oav!m_Agd 8883<2tr9jK~#9!?VW#URb?2* zzvp-hQf#9ID_dJ-ko_{pq=<3|mXx_{WJN(x;-;7>SQ#Y7icM^>KNNor-J*h41OHIi z=1qwRGia>MV@qekTs!NwY4e8nt{UZbpZ=I P7G 4Ir`ktsLC)+Br*v$*#3#O#8Za&|jz> zuvQlq;^5jsDFxlo(4b|vLZ`mO>ElBX37_05`uLG-q|&tr=>mUB9{}28K(uxXvgVfv zt^H@up4AS1PfafMo;-y+7F>fB%Vr9JKh9*!X6loC %=HR99 zc8Ivo7p)M(PYr(7oH>Z~^ nBK<)xuz>NX II-C;cYzqtYl;C{JA1KV;bE*;HWSs`qR2V;0|4Ng z_4ivw7+^kNO@#jnP+*DyqEFlh0I1#;#o^(naHN0jPrUi!4j89;fOZ2e4Ai=u5N&Na zNlo!Vx@$$HvHKWUEEbE!VzF2(R;DWB=l4(S$tC~@&9E`A?01XfD= B2p0FIXIZR3RDQ zRcU`>@*ID%LL%TN1241oAE fhiBpSzkKG5F{jz3<3pAS%LS!)`AT9wZ4?f(Pe zcizT@8#a$6KG5Hd;gN)t=J#^(XI=gG8J+UCWwZb?Yd-)C9{mpOG2rE=pM`5biQ$oi zH2CQjKO_=<15hh_9N=HW`1CUm!aa2qrLTWouyl!k>#CvKGcx~jqP<@ek@xZjg8o}T z8HKNM8Jn^3r-ILguV4J1Kf0zX&@n)=W?yE1Ke5?Uv3l9q_+0b3*=P6+pW!onE_{a1 zh0pN0@EJZAKEvn2PpkOWRM5S@d6Fly<6Ft#=Usxn$oIKS_--p)0QsN3s^)wGlj48d z4Bzbd_Lbltg}jBF$&xQ$FR!^ZG5(~7K@;Ii)}-WP390837#Dxc0JWC2CgNMl<-w0g zT;5f1zwdm4OUb|Tro8hBOpia-6}(GC?<%_G1AzMXLA&2mcRqpX@lj5+R~38~i^XEG zSS%KcC0J5+sRFz|UsZgiI pb(NwEfCvHiW9ba|+BDMN%=+S=#TyFKM z=u qnb9?JagfvWPo%kd=X=iO!+xon`@rA z@TX+}hM!qKq;1PiK9vC(!&hhkuKAe<|34cb$mFLpAWLWXvSvYr8GviPzBS)%9i0aD z-lwC`6c^?#+5yFvF%6!IEQWutSA3;i0PoLN8()Vp0PoLN8()1FP&yB!a(}w%@wE`| z&sV%ZpT%OaSS%Kc#bU8onV^9>B5ETtF7YCOyqC%F<1|9y t^ z3_m0aJOF&?H~@ffIESCL%j5k0LKz@Jl06-tz37`w@ zfH7y}P#e(~CBKfsAKsQIUGxI#nm23rJp m1R{6`;sEBJza&DM<~2JLS Tm{K3?Li6R$~B_ zCv)gv09Ej{7z3$3mPNGzRKoY-8w+2x0aU|RY5*PJt2BTP@Rb=r7x=0SpbLB@2G9w< z3Ipf_U%CNwgD=|vy1|!f03G4WG=Prqr5Qk1__7S3EBqj)g0+7?AK-FY+A#{>dk-4A z_j MEn$w=5VBMu1piDg$ zb0mzoFh715g{$+^m)3;OlGvA${s3_`7Y_v=+b* z-?(Mmro#94|79*&)nhGzjw_CY%S8Bo6Znk)7K_DVu`*Nt0+}Gpv>hECX8-^I07*qo IM6N<$g5!->ssI20 diff --git a/icons/obj/weapons/bows/bows.dmi b/icons/obj/weapons/bows/bows.dmi index 5e2dda9cef6fb2704a0993f7fe2d36f66605acf6..57acf92ae38740342c3b1bff2506bc4ca7038cb4 100644 GIT binary patch literal 4802 zcmV;z5 005u}1^@s6i_d2*0002idQ@0+L}hbh za%pgMX>V=-0C=30ld%qhFc604_9+@z2@xc5axoCYAg@3wt+t_3(l!#_-XeoIh{tx< zeD~ddLql>Z&SgdNONpP{SgAX5Bw4(}Xpqba-|SP21ebT==EgeexG#gN9s-P*G}d c1bGi zG_eENK{Y8@{5sQM*!Q_V?AKYZ_s2W$JM+%k?>y271K#)h&O4udX6Bih=Vc&h^O+?; zjn>aiU>j84OHemQc4NkL+h0vGFSE&_p8z#J4kQ5Jr$CeH`WqUx@ekc9_uv0@Smoo7 zKbY{RRZMe;tFg4c4G-9`G<(OqvklA(5LD<}58bkXfdK%(rcIl$YSpT-KLMblqXV_I zwU{?=9t>lK5D(~uzUBQa&zIi)s;WQBZ0d%kp#BTle|b)sd>B;dGh;d}STJ|og9m`Y z!OJ;6)6((^)~s1Gu>pQQKY?#`H5HqFI((VqK9%(k=4$-o=j?eYkszqh&wTjl4?W*E zyUtig0AQL!FpL=l0QA$p+JJf2b2Wk&`aJM?UH@@oz}{IAtb0C*S|P1SEH@14Q?UyT7O_*09_w_fU{@LGM=#v znU`5z-8yu1bigoX006!XpptbqqW5#y^#GRssxxQyiPkR!pG^J4w~j4NfEv?7KEh_f z>0W7g?ia8eJ$e+;NL2bnMWp`V;ANOs3`h5DH9||vE9mX*#c8V%)^s)U=&!%R_Jx7f z3D90q`gY*6^qa3ZYqEU$j{^xS+*9Bx<4YtGp;2RYOC%DZ4FLTBpv>#>7S;Mr3S-l$ z5}?HZZ3O7Q0IKA?mjuz?79vUz?RBgFy~aj*cjQ`)GIa~-+q#Eb|G^8vy?`(Xc(q0A zJ1r_9wDebwHvab-8*S-}0ML!TP!L2x-~>PoA&?+ye3yt;Ha6PU7YU#feItL6kTC$J z-7&%2L`DyQ699g|yj^8xVDt`wsnWOXIDwr5@E-8Rn26(En!vt!5a1pYrjPkP*s#H| zzEg9qFTo>a^F+yHl4N+mET46)FUk}4^z_i!fR;^{<_Rs&lRn y3sdmdKXuo zFcOWBh!9OSucuN!pPgXS$Au^|gTJCYVXoP(TYV><&xwAJqp=x*$ZqK7Z6aeiV X zrvreOUU~_Lh-+j5v2+Lt#4`1nME!yx3S%8vA&T@B1MBBPaknP0ZvwP846Fud@5tZ3 zXm|j~6>1To?-V{B{UE2uVJNwdXn5E*gwbf!yh+lSwL~sIl}$=;-KxX%3C89`K9_ zGa<~}Qk5&tCqmx|d_4O6`vHfqGFDPz8^UBVX+)z@v*eRj%qx=zU%K~`t?vXv>+iL- zwcOXpfbi4Df!SW_JAu!xzO(&+BM{mi6Q1g5mFoF&!6!rCDTL`uS59nnOn54s2A>@O zMCm($&yK$H9nqYg(5r5@*lpXkZMfx@Tbx388$h3if!POvQ%<(iyU}+7Um<;W@NjxU zH{eYL_$=GCYnS8CHi6w{c|zW`V>kLD;LE1(-g^ySwH>0dwoi$g0b9lHXGH2dwN0Bg zp}xM})ip*TbhLrNiM~kqCh7|cycP-`f3*U%@++W*y9+N(WnL>Y&}{w5Q+V`cZdzEl za3S^d^l%5JMFf$v=@+_2wji^}`U@Ms@dm34UCZj)GrL{}Mm%1x*i3{6%$S&Pc|sn2 zk)AJ?zR(GTNC>mR$J^x=>m)>^@j_@v-`Yqj8oq4$!p{Zsu9)N@wE zF{jM=F-iu;c#BAV5#5i|0I*w6SV-Rj^&qfsU 0B-c6{?fN9Mxv21h1O)N=Z&vg z9{^_EG>fc ;8_$J-)dzunzqsk9)pqnPV6D%Ix|e+VOlQZE?f!@sE?nd( zeCa?nF|6j%Plr&%J=8HEpS}jrqpsI$_}u6_UE<5M-Nua7h4eLm+LW43&!)(dtx59o zh=2xA+qj8QTU(oc5F!Ai{;hNoDKg&(EBQ97*5|c&2sN|*c)+tXCdF?qb~kJ+57Nf+ zAnjaUO4PTNPVT6noy$u-+ijv+pSQ%TQ1fK9LGdco6ze^DUB<11?7Xj(K6?L8ICATK z0Dy|yX5*H>xOwdV2l`IqvrkXq!XN$s064j1DKFfHp5}WgH*~2jA8)0Hq_oMIC7x4FQuK<8?jeX(#=?NEH z`^@ur_CI0(fWQ7q7|YHc!HYlnI{Ldl#9#i?XI$NjYJJ)80q6waOZcdND_xrNFZeSA zn5{1OnYJzpJ+h@>SN8Bj32NB9hYol2koEI|JMW w|V7v_M#J=RNfBLkX%ZUqqGVi#!2Pq`oZpzVlV448CMCNnWQU$%GFC z wF zm{JIN^hFi7@VNzWG}IF-did-D=mbLRCMwGpQN!jvWXByp)7C|z9|DiQD9lT7kPdaSF#{;0#F=4~zJ#>*$M15OnV|kFw17Y$4KqvZc;j6zx+-%ngeDRUl zwldH6;KS?r;Nu0*34~Ud#5@qDlRGMi`nFQOYm0s;Jo+Nw%hn~z1~6WQ*l4IHCQ6^T zR4;sx$^&2Kezx3e!7EBj**E@mB|?vGv9 UEGe5n^?z64uOswN2gBq9V{-z34&e@BS?Yul> (?IE-FW00%mIsViAvPN7iHX+d8Rj_ge2%+d zClICwi8q!9$qG< q8ZdcHD ztn~O@Ax~IYzKHA$RAqI;cJ)PgDw!TIUWM3bw;!_`7gVys;YAmm31Ok2uSx*j%+ypA zr|`)J&^!?454FhZg469#{Sx-)TfdLFGat*@9ar2o8!An;zKCvjI8b=DD cto|!7)Tehp6t{i+H+qVtkp%dpIx^1K+CpuKWge^lm zVJ7I4^RMcIHx8}SVCJj011tN0<)5pW?Vf$}S9l=!8jk(v|Kix54{@k|iQx8>IAG13 znAn{J$l69VnI<7)@kRrV-W)3O9`;|nL^9&D6AmTG_Jr2?4ppXF-%-3V1%|YQUMiAx zt|%>KxLeM(r3X $#~$P z@W$VN=@O+wX+fLmO^eZ z`WiqVTF=m3xZ1rLw=UnKTwhN@d}i?wYKCtJbUwP~Ufe$8H(0RYJX5K!0rVMs*RD5| zrHISaA8f7d^;H*q=4B#3!>2MoVJ>}Nc)&9+6HQxh=EzUy5BQ)kKVd$7!w>KQz~L1G zzV&>h7{2`avd=b1$V6bboY_ruky7+}^pw(j@N0fTTlzA=yGSXed+*NdCS~wh@cT7C zp nl#trhk485AUDN{MPNqL#Vk@7U;ZgD5b31wXd%t zEvw}6dh`^<%eIqWyL}P)2|d#<>O;$u3_jJ}zR3K9p6M%1PB_KjQ>iaHKcQ#(8osFo zpNjl|uJkp0Qwu(?0d%deBrU6kPe^HgPF{XO&-5qrIa@!&*VjJM_|4DB$xrB+zJ_md z>RS+~NY5rzUsYyI4WFPDCxrkC(bw=zUihX&nJhu(c-eN+@c9@(4WEWj8GxeGvO0xN z6$BbSMF1{)v7J;0nd4>KmBCjGp4Ybkh923X9KK8lHGDn+&`K=1u{=mJlM@zeDTZ#} z*8qkd*+Lu3gS70$cI9s#_glB`x03TzoRy!?ZtlG)cbI49b^?Ii=fAJhxk)sAFkPEc z)45@^X#llp0JUlJ4}is#pH3s-Lja2@Kb UV=Cz-_gF_$Pi2h%#h2QkGjW lzBdt`hE{J+0{2>HNKtvaOIJXc`EfK!XHx{YMMm) zKF&`!n5^xUq5ovHLGdcYRMkISUsfGO)juf1^Xxg2QnH6mw!TSb-s^6dZ`7GVG{5pY zQ|sHbpvcBANud)LQj1l=$Ez=L2#}a>)G?shxCSN5E4lP#4Rb`*-w@gO!vQRA>ZYTr z;8Ufam~YepXa=yhshe7~zJ~y6_>4NUgeh(OV%9GdYI6l(^Yb8;jjviiG2f`WHY3n% z4Aa`CF0)1JJ2AiKr{l?uW17q=>#GoZVrhWZS0QHoo7VR@LFJUlPnSF0m_bBF`a@5D z`1N;S+`|_IfZz08Z$=={gef-z^KAJ?w0_$47yuBBf5T>CzEL+Vh2|>(Oz3tPV_Kh6 zUmwfl06P(4btNe@4+ruO_(gmH{i3fACD|Qt+kE)B8c*wM0J$vvTg>zDwLYH(HEMaj z$wX+`VVET;z{|$>m%dJr<0#ZqsAzqUX2Db4`hEkNa~B1ysFjm0OzZ1eu+-VHOaP|3 zz6Ma6Qq!|wZ5lvr8bEE@G=SRtXF3qA+I*gY+P5As*_xzeYf{GmG=Sb)BpRW%wl=)q zFsuns-U0Z`2gF0D8NMOVS@Q9J7so3Ym 3mLp}B^D5>#duifwtu;yOeerheS!F%|w zlm$AcU2vWskmq1c=H9n>2(jTC4&bx@`5Wv$ze>Mtv%r&{a{2K@ n>P~sm_n5IzM3|#Ok21{=S}ssLoHP zJVjfG)se#b`x-#i`RR%QzElZoW*R>4yI?CnTyQ9*BtPBFKLL#%npOti)fs{2>xNPq zKCdSsD)Q5%m%shp$f4<*o8{yOv@_utoo&Zl>1zN{RQc(6A(WLBpb&iZcOWZ#8bHYa z=7KL5fU@6H;WdDT;L`xQ90OWWeHwi_R? IlJvJwaSP~Kur_TPKy4a8ZQ3+| c+I(gI51kCDW*tiat^fc407*qoM6N<$f_syK-v9sr literal 4501 zcmV;G5o+# 005u}1^@s6i_d2*0002kdQ@0+L}hbh za%pgMX>V=-0C=30ld%qiAP|OUcnYGcX{t5p)TPlh4)qlb6
-b7wcb+a?v(d* zcI7!q4_T5X8}~ya! sZs_2{9?_!hf$X zKXnBxS+Z_B000npNkl 9rVGSKLL54sk0)ZGpN%MY1Tl8KUUD zMscFp66b_oW}BsPiDr_qnMs{ Vqr_xyOzdGEdFd6G92=sn-_yzl2c@6YpG0Ro%PEDCBcer|+Vsq$U| z+#JbGXyZ*knxvl=*`gl>HQWzG0pJy&QMLaXqjr9!8)f0b8)1}BKKbZ^KaHa61C|<# z^-V;;x_QYv=5;L)UVxxN->7uM`uh3+0IOE5!rgb@J^CjAw6(RNqM`!Rr%#8bO^^}+ zz0fzJpAq@uyI)oQi^Qg`n+NJWk^GmZ7P=3E3VorCr xnywJA-pV$7MHwNsQ6vpyrW9U8xe0Z3L|82TQGW0441ljpl~Ei z;YgTb%`rz~5f%E0l~4L nLAAqh8pm=FV1LgpujgSHQso={5|1X$?w6wHf zN<}#7FDHV~eQX$l^73+&mzSfZr3FqQ^jg2KuMZs`e}tn)jtVPd8PZRS%F5+vYion1 zO#lEq2%uQBH=yeqn2i92{@q88Y>};>4n8;aqxbEb69qNIFZoED1; gvK_qY;*NG+5DJaYk$j0ZXEw&9d~(z-Q<; zow3(ssr2s$qQ-JhnyZ{&!r?HDm@r$y;V`WP=xKlwuV=NW*0)oH7*E9j%>k$epx*;j zZ1G;AM4LAeQIu%2Q~gI88tC2OYc;s3n@-= Y#JxKK%VWa$G2cfkSK8LMYxebBh)BsI zQ7jfCHzHt?&pOtZ6$v{#J85)4E5^GP3601TKi)E{FCzjv(br5y7e|pW90`+*C7NVW zPo;h;`%H{KZ;2vt@mE$P9Ba1gRNqeIv!frd(Aa`NWOnK1Z6a-f5IQitP6q%lyzl}L zme wGfw?Z9V6-}-sL!Lvf-=bMHw7K>?-NJP*7v>DS2-GeVa`nj!d2SVfT6%`ehuaN-Z z=l26sywtY?pILo-=K+TyG(9Ff)Yj~3 ^r z4150h=WTzs5#mZC5?b9mcA_r>zGV8&qu1bB(@QkQ@hMp|V56A*j7)vIwrbTX)YjHI zy2c2Ewhl1Z(U%F|h5C{fUehfeUsnWLd@ZQ%hV)xgiPuV8Xg2<|Qmp8^d1ztQtXb6A z*=c!UTE-%BGW~SdNVdo<(|>8>H>-=)>8@pT?TKBlfFLVTFVjp$1WcHiSc-&J^kqiA zvGk=*AY?+A3_hz}Zl+E`WSUh7&FC8kNoB*AOketY!B%%nQjRV2FCq+{&3fp7;q9kj zaJ(zmPPJoVMSld~V`dh)W%=*Q5{k4)I0B&;Gi@(z$BtdnUuL%w2@~~=&jG_*dtUnQ zT4n?z5=J5s06_62j%L}$bjh+g*3Tj{6A6=jCJNdd525VnmmSM2 R4x zh4x>g6cEB{k*P1E`?0$K>@*Ul(>Flf32f;bhHndiOT6&k^`na6NO)ACIo9lX V#8GQp-<8!j^C6&J5>{xDxKcZQ)$~=WH z9;ilvC06v~A(U|sl>$hm&j5PV^?D7T6Mef|e2KO}o3JFEJ_E?6)Hpqx0^8RxkxqUV zqyN76J@UIg1E|0{2d>B2{ZHVE1si>@?-)Spt*4V1BK?h!lBY?vzE!I(#q3xA@ebbm z_!9KKxs3IloNlNI2B;<&pmhrhh H?~M%5*loeBE= zv5GF${-3uKvhL;r`uM}IvHOaf0RTl;PQm3@O& PafP-`AVbzn5 zVoPi{o_nYkzkGBKK7MMK?WaSvzS~c}9zc8G8-31({dk}C6K28s8zB-U3(>RnIsD@7 zI{@Ik#y)ZU@C6rLw)$B-`MW9rz>lvDVgAwGSpV{k= bu$PtSEuf zZa0(llO9HR@`f2=_2V6cyFmM2{mqz>WZSkz0W_lX_9*ps9{>QHK6=8lCrh=ynJ0fJ zU$o~9lCsE?$@=}x6 hH_ecjL)_up&=s z -Ys?8<*&p4!IG8htYtbOPbD!h4iLXhmOE zQQ7!er*HP6Rv|pNwuowi0V)obQQZ?8N#7nyyGFOVr9&DlcJyUE`6|2ptkbvh%XY?u zbx&-hlQcxsQ%^O)0O{L9 w$GY%hNZ?Spxk)3~2LP%+!gR(;ER!FLoC zh@U>b*ffNldv;+ )Uv3+iCP{eGb%H@7cbs+xiTjGksf!5uUtZhG_`5ZEF;r zdv;-OdpEjodLFNBI}JLp!_&1wxAdEy1*vTO+|YN>@0;B*nR(4kbo*^lDh`%WO)x+Q z*A{s;4z#Low)C`uYOe-0{RxyVZ?zjGXY`%kh#3ft?J)y@bQ2vn05q#_wGqrDPInW6 ztk;)uBlFj{riHLLSVrZu7Ev(oGS30DqHiN9lQIBuL0`&===W;pib)G^!L*6@P`VkZ zDsxNU$Xys;y!0#E^`#xjf3J3~_ BIwiO zTa!kd!ikg7kFS(DtXiMVr3h#y62_lyPPNXsdQXQd-G~`|wk(c-Rw5xAn`;1$1>uLg z+L9ivPqcrx4FEUDzbCW$Y&ig6G6;?LJ5-r!eKrrqfXN^n7y1#VO}vLr96yZThQ3bw znWH=2bO%6_`fT2rXSrcY?^;9q9)8R88*8thIz_GfdxyJY0FORUa>4Jk?(YRKyf r(^T+EV#N9v(H_uDN7N?=3@Yj{BYViFnny@0;oDa z9h;BGfYqg#O$;BK3IL7#a6$om{8b3qp|80K-`NRy%911US0QAFzUCHuXA1M$FB%w9 zm6@|j@mCSBzG;1h`QhC9nt+k70;p1zrYv6H>#st{H2>3;fE$r- jy&n4r@ZdU z8Cs h}5 zLpE{>G?uwD589r`BL&qn<$%1@{3x-iO$5>!1fFOOD~pvw3+*3UkDM|;6N{{c Z#LXZ_67Pd5g2ybL2dADwYM z8VSwDQw0FgQc*c>2u*`|Shm5X0YB?|tDmv2WyW;{qt54#IB#aQ<@CW|eQ)$L_N};h z2dp~J`q`r&Kn5ETVbfYo&mRK3tbEq@QlB!nq+04pS6Dww^fMX2xUT}xR5SqVyRV;h zxnU9q$6n3OS>GLfPEN$8)HpW`8w1G30J5<$fNTsP8=F4>j5Wt7)*SQg9Nh2zD+Mqd z2~$f;3qGtH^kt P1nX`tpt`qCrI_uz^yHgO(Kc3ba`>^j1XVw~K98ykpCMI|FBAL^hr>#vUrjJT zN=`&Ot$e2qpgKRE-~BfYpKJh)Ctt?3tR4X;B2is}s^znwbj;^x|1HBuit_`?v}mcQ zgu?uIe)k^$7KK;PGkgAqzZ^YhdWT2KI$&aoHW}|Dn0@!asC)vN#7K%Tx88?f|HroS zvPIOp|9$kI`^wVxV)o|;EESbQ`C_#4RYg9(`tJljz+o3W`DM_^OUueC|Llakri%uK zlvMt^7lXE5 fab4nrTOby{S^V@mU=Wl0+?#4$4mcRiF}+NFgq>R z{OA0DY)XxD!>}=cYz!b98w1GZKMQabD4zy$1Y~1l0NEHoHZ}&3jRDM6JMtp&zE8#( z<$gJ`f#@U+QAXY$M?il>y 299^lwS_6Eh4F}?%62YB8Qaa2RyQY$Ta*6pnUk!rDe@^_$+n%44~ZN=g4QP+h+jf zMn6|x-OCdAZ0R$A44+bc29V)Xs?PvAD~oPl!SFfJX8`S&@>z?V=ZEt%d<-DNr(B-_ zv|glS#$@;yKsx|3e3JDU!0cFLt}c9rat=NQkl|Avc^N=+@TppAiHA=Wgs$o`fbc#o zt3?1+!RLuC0|@Wavf6|&C%b(H5Z = SYNTH_CHARGE_ALMOST_FULL) + if(nutrition_level_joules > SYNTH_CHARGE_ALMOST_FULL) user.balloon_alert(user, "cell fully charged!") return @@ -78,8 +71,6 @@ * * user - The human mob draining the power cell. */ /obj/item/synth_powercord/proc/do_power_draw(obj/target, mob/living/carbon/human/user) - /// The current user's nutrition level in joules. - var/nutrition_level_joules = user.nutrition * SYNTH_JOULES_PER_NUTRITION // Draw power from an APC if one was given. var/obj/machinery/power/apc/target_apc if(istype(target, /obj/machinery/power/apc)) @@ -92,16 +83,9 @@ user.balloon_alert(user, "APC charge low!") return + var/wait = SSmachines.wait / (1 SECONDS) var/energy_needed while(TRUE) - // Check if the user is nearly fully charged. - // Ensures minimum draw is always lower than this margin. - nutrition_level_joules = user.nutrition * SYNTH_JOULES_PER_NUTRITION - energy_needed = SYNTH_CHARGE_MAX - nutrition_level_joules - if(energy_needed < SYNTH_CHARGE_MAX - SYNTH_CHARGE_ALMOST_FULL - 125 KILO JOULES) - user.balloon_alert(user, "cell fully charged!") - break - // Check if the charge level of the cell is below the minimum. // Prevents synths from overloading the cell. if(target_cell.percent() < minimum_cell_charge) @@ -109,32 +93,30 @@ break // Attempt to drain charge from the cell. - if(!do_after(user, SSmachines.wait, target)) + if(!do_after(user, wait SECONDS, target)) break + // Check if the user is nearly fully charged. + // Ensures minimum draw is always lower than this margin. + var/nutrition_level_joules = user.nutrition * SYNTH_JOULES_PER_NUTRITION + energy_needed = SYNTH_CHARGE_MAX - nutrition_level_joules + // Calculate how much to draw from the cell this cycle. - var/current_draw = min(energy_needed, SYNTH_CHARGE_RATE * SSMACHINES_SECONDS_PER_TICK) + var/current_draw = min(energy_needed, SYNTH_CHARGE_RATE * wait) - var/energy_delivered = target_cell.use(current_draw) + var/energy_delivered = target_cell.use(current_draw, force = TRUE) + target_cell.update_appearance() if(!energy_delivered) // The cell could be sabotaged, which causes it to explode and qdelete. if(QDELETED(target_cell)) return - user.balloon_alert(user, "APC failure!") + user.balloon_alert(user, "[target_apc ? "APC" : "Cell"] empty!") break // If charging was successful, then increase user nutrition and emit sparks. - var/nutrition_gained = (energy_delivered / SYNTH_JOULES_PER_NUTRITION) / SSMACHINES_SECONDS_PER_TICK - user.nutrition += nutrition_gained + var/nutrition_gained = energy_delivered / SYNTH_JOULES_PER_NUTRITION + user.nutrition = min(user.nutrition + nutrition_gained, NUTRITION_LEVEL_FULL) do_sparks(1, FALSE, target_cell.loc) - - // Start APC recharging if power was used and the APC has power available. - if(target_apc && !QDELETED(target_apc) && !QDELETED(target_apc.cell) && target_apc.main_status > APC_NO_POWER) - target_apc.charging = APC_CHARGING - target_apc.update_appearance() - -#undef SYNTH_CHARGE_MAX -#undef SYNTH_JOULES_PER_NUTRITION -#undef SYNTH_CHARGE_RATE -#undef SYNTH_APC_MINIMUM_PERCENT -#undef SSMACHINES_SECONDS_PER_TICK + if(user.nutrition > NUTRITION_LEVEL_ALMOST_FULL) + user.balloon_alert(user, "fully charged") + break diff --git a/modular_skyrat/modules/synths/code/bodyparts/stomach.dm b/modular_skyrat/modules/synths/code/bodyparts/stomach.dm index 4bb48d18b709..163bb9469ccb 100644 --- a/modular_skyrat/modules/synths/code/bodyparts/stomach.dm +++ b/modular_skyrat/modules/synths/code/bodyparts/stomach.dm @@ -43,7 +43,7 @@ ) build_path = /obj/item/organ/internal/stomach/synth category = list( - RND_CATEGORY_CYBERNETICS + RND_SUBCATEGORY_CYBERNETICS_ORGANS_1 + RND_SUBCATEGORY_MECHFAB_ANDROID + RND_SUBCATEGORY_MECHFAB_ANDROID_ORGANS, ) departmental_flags = DEPARTMENT_BITFLAG_MEDICAL | DEPARTMENT_BITFLAG_SCIENCE @@ -59,10 +59,12 @@ /obj/item/organ/internal/stomach/synth/proc/on_borg_charge(datum/source, datum/callback/charge_cell, seconds_per_tick) SIGNAL_HANDLER - if(owner.nutrition >= NUTRITION_LEVEL_ALMOST_FULL) + if(owner.nutrition >= NUTRITION_LEVEL_FULL) return + var/static/obj/item/stock_parts/power_store/dummy_cell //this interface requires a cell so uh, here you go + if(isnull(dummy_cell)) + dummy_cell = new(null, SYNTH_CHARGE_MAX) - // I am NOT rewriting this to fit with TG's standard. I have like 70 bugfixes waiting. Feel free to give synths actual cells if I don't i the future - // ~Waterpig - - owner.nutrition = min(owner.nutrition + (40 / seconds_per_tick), NUTRITION_LEVEL_ALMOST_FULL) // Makes sure we don't make the synth too full, which would apply the overweight slowdown + dummy_cell.charge = owner.nutrition * SYNTH_JOULES_PER_NUTRITION + charge_cell.Invoke(dummy_cell, seconds_per_tick) + owner.nutrition = min(dummy_cell.charge() / SYNTH_JOULES_PER_NUTRITION, NUTRITION_LEVEL_FULL) diff --git a/modular_skyrat/modules/synths/code/bodyparts/tongue.dm b/modular_skyrat/modules/synths/code/bodyparts/tongue.dm index 3f7f88666f34..7fe20ae9c08d 100644 --- a/modular_skyrat/modules/synths/code/bodyparts/tongue.dm +++ b/modular_skyrat/modules/synths/code/bodyparts/tongue.dm @@ -33,6 +33,6 @@ ) build_path = /obj/item/organ/internal/tongue/synth category = list( - RND_CATEGORY_CYBERNETICS + RND_SUBCATEGORY_CYBERNETICS_ORGANS_1 + RND_SUBCATEGORY_MECHFAB_ANDROID + RND_SUBCATEGORY_MECHFAB_ANDROID_ORGANS, ) departmental_flags = DEPARTMENT_BITFLAG_MEDICAL | DEPARTMENT_BITFLAG_SCIENCE diff --git a/modular_skyrat/modules/synths/code/species/synthetic.dm b/modular_skyrat/modules/synths/code/species/synthetic.dm index 5292cd9b0bb8..116a7fe100a7 100644 --- a/modular_skyrat/modules/synths/code/species/synthetic.dm +++ b/modular_skyrat/modules/synths/code/species/synthetic.dm @@ -17,6 +17,7 @@ TRAIT_LITERATE, TRAIT_NOCRITDAMAGE, // We do our own handling of crit damage. TRAIT_ROBOTIC_DNA_ORGANS, + TRAIT_SYNTHETIC, ) mutant_bodyparts = list() changesource_flags = MIRROR_BADMIN | WABBAJACK | MIRROR_MAGIC | MIRROR_PRIDE | ERT_SPAWN | RACE_SWAP | SLIME_EXTRACT @@ -35,12 +36,12 @@ mutantappendix = null exotic_blood = /datum/reagent/fuel/oil bodypart_overrides = list( - BODY_ZONE_HEAD = /obj/item/bodypart/head/robot/synth, - BODY_ZONE_CHEST = /obj/item/bodypart/chest/robot/synth, - BODY_ZONE_L_ARM = /obj/item/bodypart/arm/left/robot/synth, - BODY_ZONE_R_ARM = /obj/item/bodypart/arm/right/robot/synth, - BODY_ZONE_L_LEG = /obj/item/bodypart/leg/left/robot/synth, - BODY_ZONE_R_LEG = /obj/item/bodypart/leg/right/robot/synth, + BODY_ZONE_HEAD = /obj/item/bodypart/head/synth, + BODY_ZONE_CHEST = /obj/item/bodypart/chest/synth, + BODY_ZONE_L_ARM = /obj/item/bodypart/arm/left/synth, + BODY_ZONE_R_ARM = /obj/item/bodypart/arm/right/synth, + BODY_ZONE_L_LEG = /obj/item/bodypart/leg/left/synth, + BODY_ZONE_R_LEG = /obj/item/bodypart/leg/right/synth, ) digitigrade_customization = DIGITIGRADE_OPTIONAL coldmod = 1.2 diff --git a/modular_skyrat/modules/synths/code/surgery/mechanic_steps.dm b/modular_skyrat/modules/synths/code/surgery/mechanic_steps.dm index 35309a626700..cb1e15266ada 100644 --- a/modular_skyrat/modules/synths/code/surgery/mechanic_steps.dm +++ b/modular_skyrat/modules/synths/code/surgery/mechanic_steps.dm @@ -8,6 +8,7 @@ /obj/item = 10, ) // 10% success with any sharp item. time = 2.4 SECONDS + preop_sound = 'sound/items/wirecutter.ogg' /datum/surgery_step/cut_wires/preop(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery) display_results( @@ -31,6 +32,7 @@ TOOL_HEMOSTAT = 10, ) time = 2.4 SECONDS + preop_sound = 'sound/items/crowbar.ogg' /datum/surgery_step/pry_off_plating/success(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery) do_sparks(rand(5, 9), FALSE, target.loc) @@ -52,6 +54,7 @@ TOOL_WELDER = 100, ) time = 2.4 SECONDS + preop_sound = 'sound/items/welder.ogg' /datum/surgery_step/weld_plating/tool_check(mob/user, obj/item/tool) if(implement_type == TOOL_WELDER && !tool.use_tool(user, user, 0, volume=50, amount=1)) @@ -67,6 +70,29 @@ "[user] begins to weld [target]'s [parse_zone(target_zone)] plating.", ) +//weld plating - Act +/datum/surgery_step/weld_plating_slice + name = "weld plating" + implements = list( + TOOL_WELDER = 100, + ) + time = 2.4 SECONDS + preop_sound = 'sound/items/welder.ogg' + +/datum/surgery_step/weld_plating/tool_check(mob/user, obj/item/tool) + if(implement_type == TOOL_WELDER && !tool.use_tool(user, user, 0, volume=50, amount=1)) + return FALSE + return TRUE + +/datum/surgery_step/weld_plating/preop(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery) + display_results( + user, + target, + span_notice("You begin to weld into [target]'s [parse_zone(target_zone)] plating to open it..."), + "[user] begins to weld into [target]'s [parse_zone(target_zone)] plating with [tool].", + "[user] begins to weld into [target]'s [parse_zone(target_zone)] plating.", + ) + //replace wires /datum/surgery_step/replace_wires name = "replace wires (cable coil)" diff --git a/modular_skyrat/modules/synths/code/surgery/robot_brain_surgery.dm b/modular_skyrat/modules/synths/code/surgery/robot_brain_surgery.dm index bffd2e715fe4..ab7827c176a7 100644 --- a/modular_skyrat/modules/synths/code/surgery/robot_brain_surgery.dm +++ b/modular_skyrat/modules/synths/code/surgery/robot_brain_surgery.dm @@ -28,7 +28,7 @@ /datum/surgery_step/fix_robot_brain name = "fix posibrain (multitool)" implements = list( - TOOL_MULTITOOL = 100, + TOOL_MULTITOOL = 95, TOOL_HEMOSTAT = 35, /obj/item/pen = 15 ) diff --git a/modular_skyrat/modules/synths/code/surgery/robot_chassis_restoration.dm b/modular_skyrat/modules/synths/code/surgery/robot_chassis_restoration.dm index d80c68e3e35a..3d530b8a070b 100644 --- a/modular_skyrat/modules/synths/code/surgery/robot_chassis_restoration.dm +++ b/modular_skyrat/modules/synths/code/surgery/robot_chassis_restoration.dm @@ -8,8 +8,8 @@ /datum/surgery_step/pry_off_plating/fullbody, /datum/surgery_step/weld_plating/fullbody, /datum/surgery_step/prepare_electronics, - /datum/surgery_step/finalize_positronic_restoration, /datum/surgery_step/add_plating/fullbody, + /datum/surgery_step/finalize_positronic_restoration, /datum/surgery_step/mechanic_close, ) @@ -18,8 +18,8 @@ requires_bodypart_type = BODYTYPE_ROBOTIC desc = "A surgical procedure that reboots a positronic brain." -/datum/surgery/robot_chassis_restoration/can_start(mob/user, mob/living/carbon/target) - if(!..() || target.stat != DEAD || !target.get_organ_slot(ORGAN_SLOT_BRAIN)) +/datum/surgery/positronic_restoration/can_start(mob/user, mob/living/carbon/target) + if(!..() || target.stat != DEAD || !target.get_organ_slot(ORGAN_SLOT_BRAIN) || !issynthetic(target)) return FALSE return TRUE @@ -92,7 +92,7 @@ /datum/surgery_step/finalize_positronic_restoration/success(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery) if (target.stat < DEAD) target.visible_message(span_notice("...[target] is completely unaffected! Seems like they're already active!")) - return FALSE + return TRUE target.cure_husk() target.grab_ghost() @@ -102,11 +102,11 @@ target.emote("chime") target.visible_message(span_notice("...[target] reactivates, their chassis coming online!")) to_chat(target, span_danger("[CONFIG_GET(string/blackoutpolicy)]")) - return FALSE //This is due to synths having some weirdness with their revive. + return TRUE //This is due to synths having some weirdness with their revive. else target.emote("buzz") target.visible_message(span_warning("...[target.p_they()] convulses, then goes offline.")) - return TRUE + return FALSE /datum/surgery_step/finalize_positronic_restoration/failure(mob/user, mob/living/target, target_zone, obj/item/tool, datum/surgery/surgery, fail_prob) . = ..() diff --git a/modular_skyrat/modules/synths/code/surgery/robot_heart_surgery.dm b/modular_skyrat/modules/synths/code/surgery/robot_heart_surgery.dm new file mode 100644 index 000000000000..380041e01dcb --- /dev/null +++ b/modular_skyrat/modules/synths/code/surgery/robot_heart_surgery.dm @@ -0,0 +1,74 @@ +/// Hydraulic Pump Surgery +/datum/surgery/hydraulic_maintenance + name = "Hydraulic Pump Maintenance" + requires_bodypart_type = BODYTYPE_ROBOTIC + surgery_flags = SURGERY_REQUIRE_RESTING | SURGERY_REQUIRE_LIMB | SURGERY_REQUIRES_REAL_LIMB + steps = list( + /datum/surgery_step/mechanic_open, + /datum/surgery_step/mechanic_unwrench, + /datum/surgery_step/pry_off_plating, + /datum/surgery_step/prepare_electronics, + /datum/surgery_step/hydraulic/repair, + /datum/surgery_step/mechanic_wrench, + /datum/surgery_step/mechanic_close, + ) + target_mobtypes = list(/mob/living/carbon/human) + possible_locs = list(BODY_ZONE_CHEST) + desc = "A mechanical surgery procedure designed to repair an androids internal hydraulic pump." + +/datum/surgery/hydraulic_maintenance/can_start(mob/user, mob/living/carbon/target) + var/obj/item/organ/internal/heart/hydraulic_pump = target.get_organ_slot(ORGAN_SLOT_HEART) + if(isnull(hydraulic_pump) || !issynthetic(target) || hydraulic_pump.damage < 10) + return FALSE + return ..() + +/datum/surgery_step/hydraulic/repair + name = "tighten seals (screwdriver or wrench)" + implements = list( + TOOL_SCREWDRIVER = 90, + TOOL_WRENCH = 90, + TOOL_WIRECUTTER = 35, + /obj/item/stack/package_wrap = 15, + ) + preop_sound = 'sound/items/ratchet_slow.ogg' + success_sound = 'sound/machines/doorclick.ogg' + +/datum/surgery_step/hydraulic/repair/preop(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery) + display_results( + user, + target, + span_notice("You begin to tighten the clamps around [target]'s hydraulic pump..."), + span_notice("[user] begins to repair [target]'s hydraulic pump with [tool]!"), + span_notice("[user] begins to repair [target]'s hydraulic pump!"), + ) + display_pain(target, "The pain in your chest is unbearable! You can barely take it anymore!") + +/datum/surgery_step/hydraulic/repair/success(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery, default_display_results = FALSE) + var/mob/living/carbon/human/patient = target + var/obj/item/organ/internal/heart/hydraulic = patient.get_organ_slot(ORGAN_SLOT_HEART) + patient.setOrganLoss(ORGAN_SLOT_HEART, 0) // adjustOrganLoss didnt work here without runtimes spamming, setting to 0 as synths have no natural organ decay/regeneration + if(hydraulic.organ_flags & ORGAN_EMP) + hydraulic.organ_flags &= ~ORGAN_EMP + display_results( + user, + target, + span_notice("You successfully repair [target]'s hydraulic pump."), + span_notice("[user] finishes clamping tubing down around [target]'s hydraulic pump with [tool]."), + span_notice("[user] finishes clamping tubing down around [target]'s hydraulic pump."), + ) + display_pain(target, "The warnings, but your pump is as strong as ever!") + return ..() + +/datum/surgery_step/hydraulic/repair/failure(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery) + if(ishuman(target)) + var/mob/living/carbon/human/patient = target + display_results( + user, + target, + span_warning("You screw up and slip your [tool] into their pump, tearing part of the pump off!"), + span_warning("[user] screws up, causing high pressure oil to spurt out of [target]'s chest profusely!"), + span_warning("[user] completes the surgery, but is that oil supposed to be squirting out of [target]'s chest like that?"), + ) + display_pain(target, "Your chest burns; you feel oil flooding your chest cavity!") + patient.adjustOrganLoss(ORGAN_SLOT_HEART, 20) + return FALSE diff --git a/modular_skyrat/modules/synths/code/surgery/robot_liver_surgery.dm b/modular_skyrat/modules/synths/code/surgery/robot_liver_surgery.dm new file mode 100644 index 000000000000..4d2219c8167e --- /dev/null +++ b/modular_skyrat/modules/synths/code/surgery/robot_liver_surgery.dm @@ -0,0 +1,73 @@ +/// Reagent Processor Repair surgery +/datum/surgery/reagent_pump + name = "Reagent Processor Manual Reset" + surgery_flags = SURGERY_REQUIRE_RESTING | SURGERY_REQUIRE_LIMB | SURGERY_REQUIRES_REAL_LIMB + steps = list( + /datum/surgery_step/mechanic_open, + /datum/surgery_step/mechanic_unwrench, + /datum/surgery_step/pry_off_plating, + /datum/surgery_step/prepare_electronics, + /datum/surgery_step/reagent_pump/repair, + /datum/surgery_step/mechanic_wrench, + /datum/surgery_step/mechanic_close, + ) + target_mobtypes = list(/mob/living/carbon/human) + possible_locs = list(BODY_ZONE_CHEST) + requires_bodypart_type = BODYTYPE_ROBOTIC + desc = "A mechanical list of actions to reset the reagent processor and purge built up minerals." + +/datum/surgery/reagent_pump/can_start(mob/user, mob/living/carbon/target) + var/obj/item/organ/internal/liver/reagent_processor = target.get_organ_slot(ORGAN_SLOT_LIVER) + if(isnull(reagent_processor) || !issynthetic(target) || reagent_processor.damage < 10) + return FALSE + return ..() + +/datum/surgery_step/reagent_pump/repair + name = "perform valve adjustment (screwdriver)" + implements = list( + TOOL_SCREWDRIVER = 95, + TOOL_SCALPEL = 45, + /obj/item/melee/energy/sword = 35, + /obj/item/knife = 25, + /obj/item/shard = 5, + ) + preop_sound = 'sound/items/screwdriver_operating.ogg' + success_sound = 'sound/machines/doorclick.ogg' + +/datum/surgery_step/reagent_pump/repair/preop(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery) + display_results( + user, + target, + span_notice("You start to descale minerals built up in [target]'s reagent processor..."), + span_notice("[user] begins to fix [target]'s reagent processor with [tool]."), + span_notice("[user] begins to fix [target]'s reagent processor."), + ) + display_pain(target, "Your systems disconnect from your reagent processor, avoiding unnecessary errors.") + +/datum/surgery_step/reagent_pump/repair/success(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery, default_display_results = FALSE) + var/mob/living/carbon/human/patient = target + var/obj/item/organ/internal/liver/reagent_processor = target.get_organ_slot(ORGAN_SLOT_LIVER) + patient.setOrganLoss(ORGAN_SLOT_LIVER, 0) // adjustOrganLoss didnt work here without runtimes spamming, setting to 0 as synths have no natural organ decay/regeneration + if(reagent_processor.organ_flags & ORGAN_EMP) + reagent_processor.organ_flags &= ~ORGAN_EMP + display_results( + user, + target, + span_notice("You successfully descale [target]'s reagent processor, restoring factory settings and removing built up minerals."), + span_notice("[user] successfully descales [target]'s reagent processor, restoring factory settings and removing built up minerals."), + span_notice("[user] successfully resets [target]'s reagent processor."), + ) + display_pain(target, "Flow rate restored.") + return ..() + +/datum/surgery_step/reagent_pump/repair/failure(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery) + var/mob/living/carbon/human/patient = target + patient.adjustOrganLoss(ORGAN_SLOT_LIVER, 15) + display_results( + user, + target, + span_warning("You adjust [target]'s reagent processor out of spec!"), + span_warning("[user] follows the wrong guide for [target]'s reagent processor!"), + span_warning("[user] finishes adjusting [target]'s reagent processor... wait that isn't right..."), + ) + display_pain(target, "You see errors flow across your vision!") diff --git a/modular_skyrat/modules/synths/code/surgery/robot_lung_surgery.dm b/modular_skyrat/modules/synths/code/surgery/robot_lung_surgery.dm new file mode 100644 index 000000000000..0f1037bb74c7 --- /dev/null +++ b/modular_skyrat/modules/synths/code/surgery/robot_lung_surgery.dm @@ -0,0 +1,75 @@ +/// Heatsink Repair Surgery +/datum/surgery/heatsink + name = "Heatsink Maintenance" + surgery_flags = SURGERY_REQUIRE_RESTING | SURGERY_REQUIRE_LIMB | SURGERY_REQUIRES_REAL_LIMB + steps = list( + /datum/surgery_step/mechanic_open, + /datum/surgery_step/mechanic_unwrench, + /datum/surgery_step/weld_plating_slice, + /datum/surgery_step/pry_off_plating, + /datum/surgery_step/prepare_electronics, + /datum/surgery_step/heatsink/repair, + /datum/surgery_step/mechanic_wrench, + /datum/surgery_step/mechanic_close, + ) + target_mobtypes = list(/mob/living/carbon/human) + possible_locs = list(BODY_ZONE_CHEST) + requires_bodypart_type = BODYTYPE_ROBOTIC + desc = "A mechanical surgery procedure designed to repair an androids internal heatsink." + +/datum/surgery/heatsink/can_start(mob/user, mob/living/carbon/target, obj/item/tool) + var/obj/item/organ/internal/lungs/target_lungs = target.get_organ_slot(ORGAN_SLOT_LUNGS) + if(isnull(target_lungs) || !issynthetic(target) || target_lungs.damage < 10 ) + return FALSE + return ..() + +/datum/surgery_step/heatsink/repair + name = "Tighten heatsink mounts (wrench)" + implements = list( + TOOL_WRENCH = 90, + TOOL_RETRACTOR = 45, + ) + time = 2.4 SECONDS + preop_sound = 'sound/items/ratchet_fast.ogg' + success_sound = 'sound/machines/doorclick.ogg' + +/datum/surgery_step/heatsink/repair/preop(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery) + display_results( + user, + target, + span_notice("You begin to tighten the bolts on [target]'s heatsink..."), + span_notice("[user] begins to tighten the bolts on [target]'s heatsink using [tool]."), + span_notice("[user] begins to tighten the bolts on [target]'s heatsink."), + ) + display_pain(target, "You feel a metal clank inside your chest as [user] starts to work.") + +/datum/surgery_step/heatsink/repair/success(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery, default_display_results = FALSE) + if(ishuman(target)) + var/mob/living/carbon/human/patient = target + var/obj/item/organ/internal/lungs/heatsink = patient.get_organ_slot(ORGAN_SLOT_LUNGS) + patient.setOrganLoss(ORGAN_SLOT_LUNGS, 0) // adjustOrganLoss didnt work here without runtimes spamming, setting to 0 as synths have no natural organ decay/regeneration + if(heatsink.organ_flags & ORGAN_EMP) + heatsink.organ_flags &= ~ORGAN_EMP + display_results( + user, + target, + span_notice("You successfully tighten [target]'s bolts on their heatsink."), + span_notice("[user] successfully tightened [target]'s heatsink using [tool]."), + span_notice("[user] finishes tightening [target]'s heatsink."), + ) + display_pain(target, "Your internal errors clear for your temperature regulation.") + return ..() + +/datum/surgery_step/heatsink/repair/failure(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery) + if(ishuman(target)) + var/mob/living/carbon/human/patient = target + display_results( + user, + target, + span_warning("You slip and barely catch the [tool] before it falls, failing to tighten [target]'s heatsink down!"), + span_warning("[user]'s butterfingers barely catches the [tool] before it falls into [target]'s chest!"), + span_warning("[user] screws up, nearly dropping the [tool] into [target]'s chest!"), + ) + display_pain(target, "You feel a dull thud in your chest; it feels like a [tool] fell into your chest cavity!") + patient.adjustOrganLoss(ORGAN_SLOT_LUNGS, 10) // better find your wrench! + return FALSE diff --git a/modular_skyrat/modules/synths/code/surgery/robot_stomach_surgery.dm b/modular_skyrat/modules/synths/code/surgery/robot_stomach_surgery.dm new file mode 100644 index 000000000000..890f095c6383 --- /dev/null +++ b/modular_skyrat/modules/synths/code/surgery/robot_stomach_surgery.dm @@ -0,0 +1,73 @@ +/// Bioreactor Maintenance +/datum/surgery/bioreactor + name = "Bioreactor Maintenance" + surgery_flags = SURGERY_REQUIRE_RESTING | SURGERY_REQUIRE_LIMB | SURGERY_REQUIRES_REAL_LIMB + organ_to_manipulate = ORGAN_SLOT_STOMACH + possible_locs = list(BODY_ZONE_CHEST) + requires_bodypart_type = BODYTYPE_ROBOTIC + steps = list( + /datum/surgery_step/mechanic_open, + /datum/surgery_step/mechanic_unwrench, + /datum/surgery_step/pry_off_plating, + /datum/surgery_step/prepare_electronics, + /datum/surgery_step/bioreactor/repair, + /datum/surgery_step/mechanic_wrench, + /datum/surgery_step/mechanic_close, + ) + desc = "A mechanical surgery procedure designed to repair an androids internal bioreactor." + +/datum/surgery/bioreactor/can_start(mob/user, mob/living/carbon/target) + var/obj/item/organ/internal/stomach/bioreactor = target.get_organ_slot(ORGAN_SLOT_STOMACH) + if(isnull(bioreactor) || !issynthetic(target) || bioreactor.damage < 10) + return FALSE + return ..() + +/datum/surgery_step/bioreactor/repair + name = "perform bioreactor maintenance (screwdriver)" + implements = list( + TOOL_SCREWDRIVER = 95, + TOOL_SCALPEL = 45, + /obj/item/melee/energy/sword = 35, + /obj/item/knife = 25, + /obj/item/shard = 5, + ) + preop_sound = 'sound/items/ratchet_slow.ogg' + success_sound = 'sound/machines/doorclick.ogg' + +/datum/surgery_step/bioreactor/repair/preop(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery) + display_results( + user, + target, + span_notice("You begin to patch the damaged section of [target]'s bioreactor..."), + span_notice("[user] begins to delicately repair [target]'s bioreactor using [tool]."), + span_notice("[user] begins to delicately repair [target]'s bioreactor."), + ) + display_pain(target, "You feel a horrible stab in your gut!") + +/datum/surgery_step/bioreactor/repair/success(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery, default_display_results = FALSE) + var/mob/living/carbon/human/patient = target + var/obj/item/organ/internal/stomach/bioreactor = target.get_organ_slot(ORGAN_SLOT_STOMACH) + patient.setOrganLoss(ORGAN_SLOT_STOMACH, 0) // adjustOrganLoss didnt work here without runtimes spamming, setting to 0 as synths have no natural organ decay/regeneration + if(bioreactor.organ_flags & ORGAN_EMP) + bioreactor.organ_flags &= ~ORGAN_EMP + display_results( + user, + target, + span_notice("You successfully repair the damaged part of [target]'s bioreactor."), + span_notice("[user] successfully repairs the damaged part of [target]'s bioreactor using [tool]."), + span_notice("[user] successfully repairs the damaged part of [target]'s bioreactor."), + ) + display_pain(target, "The errors clear from your bioreactor.") + return ..() + +/datum/surgery_step/bioreactor/repair/failure(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery) + var/mob/living/carbon/human/patient = target + patient.adjustOrganLoss(ORGAN_SLOT_STOMACH, 15) + display_results( + user, + target, + span_warning("You slip and puncture [target]'s bioreactor!"), + span_warning("[user] slips and punctures [target]'s bioreactor with the [tool]!"), + span_warning("[user] slips and punctures [target]'s bioreactor!"), + ) + display_pain(target, "Your midsection throws additional errors; that's not right!") diff --git a/modular_skyrat/modules/synths/code/surgery/surgery.dm b/modular_skyrat/modules/synths/code/surgery/surgery.dm new file mode 100644 index 000000000000..b9521de12c9a --- /dev/null +++ b/modular_skyrat/modules/synths/code/surgery/surgery.dm @@ -0,0 +1,53 @@ +//Blacklists upstream's mechanical surgeries for augmented people in favor of our synth surgeries + +/datum/surgery/advanced/bioware/cortex_folding/mechanic/can_start(mob/user, mob/living/carbon/target) + return !issynthetic(target) && ..() + +/datum/surgery/advanced/bioware/cortex_imprint/mechanic/can_start(mob/user, mob/living/carbon/target) + return !issynthetic(target) && ..() + +/datum/surgery/advanced/bioware/ligament_hook/mechanic/can_start(mob/user, mob/living/carbon/target) + return !issynthetic(target) && ..() + +/datum/surgery/advanced/bioware/muscled_veins/mechanic/can_start(mob/user, mob/living/carbon/target) + return !issynthetic(target) && ..() + +/datum/surgery/advanced/bioware/nerve_grounding/mechanic/can_start(mob/user, mob/living/carbon/target) + return !issynthetic(target) && ..() + +/datum/surgery/advanced/bioware/nerve_splicing/mechanic/can_start(mob/user, mob/living/carbon/target) + return !issynthetic(target) && ..() + +/datum/surgery/advanced/bioware/vein_threading/mechanic/can_start(mob/user, mob/living/carbon/target) + return !issynthetic(target) && ..() + +/datum/surgery/advanced/lobotomy/mechanic/can_start(mob/user, mob/living/carbon/target) + return !issynthetic(target) && ..() + +/datum/surgery/blood_filter/mechanic/can_start(mob/user, mob/living/carbon/target) + return !issynthetic(target) && ..() + +/datum/surgery/brain_surgery/mechanic/can_start(mob/user, mob/living/carbon/target) + return !issynthetic(target) && ..() + +/datum/surgery/coronary_bypass/mechanic/can_start(mob/user, mob/living/carbon/target) + return !issynthetic(target) && ..() + +/datum/surgery/gastrectomy/mechanic/can_start(mob/user, mob/living/carbon/target) + return !issynthetic(target) && ..() + +/datum/surgery/hepatectomy/mechanic/can_start(mob/user, mob/living/carbon/target) + return !issynthetic(target) && ..() + +/datum/surgery/lipoplasty/mechanic/can_start(mob/user, mob/living/carbon/target) + return !issynthetic(target) && ..() + +/datum/surgery/lobectomy/mechanic/can_start(mob/user, mob/living/carbon/target) + return !issynthetic(target) && ..() + +//Disable both normal and mechanical for synths. Makes some sense on augmented people so lacks a biotype check. +/datum/surgery/revival/can_start(mob/user, mob/living/carbon/target) + return !issynthetic(target) && ..() + +/datum/surgery/stomach_pump/mechanic/can_start(mob/user, mob/living/carbon/target) + return !issynthetic(target) && ..() diff --git a/tgstation.dme b/tgstation.dme index 5ba84973eb2e..cc1e68e0d1a1 100644 --- a/tgstation.dme +++ b/tgstation.dme @@ -8417,6 +8417,11 @@ #include "modular_skyrat\modules\synths\code\surgery\robot_brain_surgery.dm" #include "modular_skyrat\modules\synths\code\surgery\robot_chassis_restoration.dm" #include "modular_skyrat\modules\synths\code\surgery\robot_healing.dm" +#include "modular_skyrat\modules\synths\code\surgery\robot_heart_surgery.dm" +#include "modular_skyrat\modules\synths\code\surgery\robot_liver_surgery.dm" +#include "modular_skyrat\modules\synths\code\surgery\robot_lung_surgery.dm" +#include "modular_skyrat\modules\synths\code\surgery\robot_stomach_surgery.dm" +#include "modular_skyrat\modules\synths\code\surgery\surgery.dm" #include "modular_skyrat\modules\tableflip\code\flipped_table.dm" #include "modular_skyrat\modules\tagline\code\world.dm" #include "modular_skyrat\modules\tarkon\code\clothing\head.dm" From 77c81a60f5d5fb479681c936b6dc258be867b191 Mon Sep 17 00:00:00 2001 From: SkyratBot <59378654+SkyratBot@users.noreply.github.com> Date: Sun, 11 Aug 2024 16:27:08 +0200 Subject: [PATCH 47/96] [MIRROR] Automatic TGS DMAPI Update (#29247) Automatic TGS DMAPI Update Co-authored-by: orange man <61334995+comfyorange@users.noreply.github.com> From a201dd238f3ad61f51413e3d76a45439eec84666 Mon Sep 17 00:00:00 2001 From: xXPawnStarrXx <53197594+xXPawnStarrXx@users.noreply.github.com> Date: Sun, 11 Aug 2024 15:27:22 +0100 Subject: [PATCH 48/96] [NO GBP] Fixing medical bounties. (#29252) * Update medical.dm * Update medical.dm --- .../code/modules/cargo/bounties/medical.dm | 29 ++++++++++++++++--- 1 file changed, 25 insertions(+), 4 deletions(-) diff --git a/modular_skyrat/master_files/code/modules/cargo/bounties/medical.dm b/modular_skyrat/master_files/code/modules/cargo/bounties/medical.dm index 4ef9b0d1620b..5b61be31b2de 100644 --- a/modular_skyrat/master_files/code/modules/cargo/bounties/medical.dm +++ b/modular_skyrat/master_files/code/modules/cargo/bounties/medical.dm @@ -1,28 +1,49 @@ -/datum/bounty/item/medical/tongue - description = "A recent attack by Mime extremists has left staff at Station 23 speechless. Ship some spare tongues. We'll accept cybernetic variants if need be." - wanted_types = list(/obj/item/organ/internal/tongue/synth = FALSE,) - /datum/bounty/item/medical/heart wanted_types = list( + /obj/item/organ/internal/heart = TRUE, /obj/item/organ/internal/heart/synth = FALSE, + /obj/item/organ/internal/heart/cybernetic = FALSE, + /obj/item/organ/internal/heart/cybernetic/tier2 = TRUE, + /obj/item/organ/internal/heart/cybernetic/tier3 = TRUE, ) /datum/bounty/item/medical/lung wanted_types = list( + /obj/item/organ/internal/lungs = TRUE, /obj/item/organ/internal/lungs/synth = FALSE, + /obj/item/organ/internal/lungs/cybernetic = FALSE, + /obj/item/organ/internal/lungs/cybernetic/tier2 = TRUE, + /obj/item/organ/internal/lungs/cybernetic/tier3 = TRUE, ) /datum/bounty/item/medical/ears wanted_types = list( + /obj/item/organ/internal/ears = TRUE, /obj/item/organ/internal/ears/synth = FALSE, + /obj/item/organ/internal/ears/cybernetic = FALSE, + /obj/item/organ/internal/ears/cybernetic/upgraded = TRUE, + /obj/item/organ/internal/ears/cybernetic/whisper = TRUE, + /obj/item/organ/internal/ears/cybernetic/xray = TRUE, ) /datum/bounty/item/medical/liver wanted_types = list( + /obj/item/organ/internal/liver = TRUE, /obj/item/organ/internal/liver/synth = FALSE, + /obj/item/organ/internal/liver/cybernetic = FALSE, + /obj/item/organ/internal/liver/cybernetic/tier2 = TRUE, + /obj/item/organ/internal/liver/cybernetic/tier3 = TRUE, ) /datum/bounty/item/medical/eye wanted_types = list( + /obj/item/organ/internal/eyes = TRUE, + /obj/item/organ/internal/eyes/robotic = FALSE, /obj/item/organ/internal/eyes/synth = FALSE, ) + +/datum/bounty/item/medical/tongue + wanted_types = list( + /obj/item/organ/internal/tongue = TRUE, + /obj/item/organ/internal/tongue/synth = FALSE, + ) From c514ac0f59cf96c24f838fc0526a5900f8cd12aa Mon Sep 17 00:00:00 2001 From: Waterpig <49160555+Majkl-J@users.noreply.github.com> Date: Sun, 11 Aug 2024 16:27:35 +0200 Subject: [PATCH 49/96] Fixes jumpsuits being overriden when assistant with override job (#29254) Fixes jumpsuits being overriden when assistant --- .../master_files/code/modules/loadout/categories/uniform.dm | 2 ++ 1 file changed, 2 insertions(+) diff --git a/modular_skyrat/master_files/code/modules/loadout/categories/uniform.dm b/modular_skyrat/master_files/code/modules/loadout/categories/uniform.dm index 5c0428a78848..7cf552af3ab2 100644 --- a/modular_skyrat/master_files/code/modules/loadout/categories/uniform.dm +++ b/modular_skyrat/master_files/code/modules/loadout/categories/uniform.dm @@ -15,6 +15,8 @@ else if(loadout_placement_preference != LOADOUT_OVERRIDE_JOB && outfit.uniform) LAZYADD(outfit.backpack_contents, outfit.uniform) + else + outfit.modified_outfit_slots |= ITEM_SLOT_ICLOTHING outfit.uniform = item_path From 09655d561898bca1f829232be464d6f3c619a004 Mon Sep 17 00:00:00 2001 From: SpaceLoveSs13 <68121607+SpaceLoveSs13@users.noreply.github.com> Date: Sun, 11 Aug 2024 19:57:56 +0530 Subject: [PATCH 50/96] Fixes Screenshot test with bloodbrother (#29255) * Bow Update: Fletching instruction manual, bows using projectile damage multipliers, unhardcoded bow sprites, hot pink death * fix screenie * fix --------- Co-authored-by: necromanceranne <40847847+necromanceranne@users.noreply.github.com> --- code/datums/components/crafting/equipment.dm | 1 - .../screenshot_antag_icons_bloodbrother.png | Bin 2397 -> 2393 bytes 2 files changed, 1 deletion(-) diff --git a/code/datums/components/crafting/equipment.dm b/code/datums/components/crafting/equipment.dm index 9bc0559c28ab..b60e4167d696 100644 --- a/code/datums/components/crafting/equipment.dm +++ b/code/datums/components/crafting/equipment.dm @@ -284,5 +284,4 @@ ) category = CAT_EQUIPMENT tool_behaviors = list(TOOL_WELDER, TOOL_WIRECUTTER) - */ // SKYRAT EDIT REMOVAL END diff --git a/code/modules/unit_tests/screenshots/screenshot_antag_icons_bloodbrother.png b/code/modules/unit_tests/screenshots/screenshot_antag_icons_bloodbrother.png index 72e63606a3a02d3725041970a50ab0a6d6097ad6..e48d264ab5890032972ac2345c010f6fa1b59380 100644 GIT binary patch delta 2263 zcmYk7dpr~R8^>L8D@N;Jgvky%<(6C4!6@pe+%LIb+KIX4vPftn%w=Ubgjo_vhPllp zOG1sp+`_QAUu%-HGLrdKe!pJ7??2zy_n+_cdY;ew^Ld!SabN}>O|&pGb%-LYc?8-x znS-Wq#&aqNPm%bo0aGO<9Yu#Bk+1^~YI`sF4|<#{C!6) +BD=Zf~*_qL??Q*&hq};RpEQ zO%x@B|97E(JqO@5H#i-i7qSn(g(dy<+)PR;HYo0Chm47gdX7V+L zI0Q7IRhiGgxgSn}9_=U!Auz+k>PFDT!{Zti#yih!CkrMf+X1pH7+coslLb|JZ W z4m6?`57LYjZi(s!jsj?Vgw0Pzb&(J|2c7Of0r=gjZEf)9WZ-%P@nLnOyx`8bf2Ma# zBJIQHo0d8zI^Dc@pByp05k|~{mbISh-sVa7742?mmTA}q!Ru+)I}&akT}24#?N6|| zUr5ll|K1rsS}dU3<=GMs{RkDX%;*^wBU7LBV8)<_@Vt0az<_9YoUikO13QW1WD;8_ zces6f`)hP_=-}LIZ}iT%A7O{^r;sZnOPQeA?=FO|E>oqKTs^;`+fZibklfjB-+!#p zd%%zxB1kDO&0#YOJkfmW$NWp}$4*h{jK|J2>DJoRvd6mox(RYW2U4T$uNpWdTdCD` zAO#p$!UVXE-dCqL64TgXRiM3tLqi5$#BAaf0dd=Piz$~6nR+v8-nO^tUk8yzeR-Te z=mCt=LknMu>QUkgg)3z7|Mn1QOBYtS88GS>XMirQ$w2Pp)fT-TJsr2UJL5o;Zi$I= zvOTf6g7(*+dhk_R*+XxuI;v+BAlcu1+B~Y;C|YuY_-OtPxnOC2&Hrin*rLK~Fhu`d z>u^lTFBJt@Lxvo#Yf8=+u-dXAsg6&B^^Z1~l@Vl{uI^~pbL7v+a8Icf@d+dJ#(d0k zxd)V6`rq7Np!lIztWO3_B7v+-$k{v{8#wo~h>v$qnPvcu`v%~Y4cz@&R9P$4Oo ziB4j_K6&U`s?qe6@FsUMsCbwtJHSUuK~YQRGKa lH|}0(`i}ugkjO2%4YEEb^;}lFdVMYn;}m;uDNXZlq5@zih Ol!n1y@$PB^-Ik3yc$gDg#4xpyAlRV_4n&-Ii>DKn7-e+orJ*_ zxzJ{jL#KsQ!%>Zv-##J)5rR+?ol4)UH&W>12ixkU5&4t%CYN$_6E;7; SPaCG-O#U1k9)Y_p((@VEFVbLs@9@EvV)| z7h @~nse?+t_E-PR39fEmyhW~=e_BjK{|gUfGMxyHchz3VX)QJBF9{xa%z=h_6n{| z89*G|7sq*Vz-JvhtfI50NgK(i_jxGKQk_c>70T>P!xt0bXWl20FpAp>?&ooCCjxz- zl%n8yhO|L7@#V$qBc8S!Y6oAA*?9Q%^HMlHc4yqM)=e5+^-y$mzP3C${95lrv;>@b zR|-D#iv<42SMNMD>;FBQX(!god_3p>&d+amqEx q(LIkzy1q^W$*VWnCfKI(R zQ8(I-0UZKE-h=haC*FYI#yB6>iL4W&agCm>rfk%11nuauA-^ldi-*3`@v2N7ub;+I zMF^sQYV2&YXkkIEq;7=zE&c0qZ4VP7 zMnYlXFfUd!&zP7IX1dPcw##p-#aW+R<`b{o(PFhF=&MOiiy*C!tfNL~7lLOnmuYUX zHBZ91IM_?yAz6u>-vQeD$fJFofl4J&=}wN$0rZ**U3-ACZ}3P)Ne3+U__B4nHP4#E zGdiY%4d7dA7ugc1p4*)}>CyO?p#-DO;`xUe&>2xOHy-8fMcc_||67hrkb3UHs&ui- zjdQvs>UF7gs7!M?er-DJ|H!Y9^P5)tCSg_&M0PPxpqC@t7v9~kO}`erjRF+D%02t_ zQuTxi)w_}#ZLL5be-=T|JhXe19AcHikGMadr}0%MR+=`g1YmA9%z|=~&Dzr6AZ;lk zmy}0FC!w6%j_w!sO%}!+vhf={Cbs4ms~;4thG|Il>z`wgVp~hU05SR5i?Hy*+AZS& z^z)Cd-Os#^Ik_`cEISG$z++c;>ShzJ1_fb3!+N~-OTO3s@tispXlNx=&prKpKmD|n zNakR%tgG|EkuFKiB;-dU-(s~|EY!tHT*-?Pz!e-wlifIk&1^(jeJQ8LN>=1ro(ghP zdFU(*2H>lK6eB6MnQvo|E)%SmF4_$QU_?|PIofje+$F93i2G4PQRE8pw!vVdJiKX~ z*In{ojl32&r$nEeaY5|fk?^U05Inj5)g^ID%dOS=_D5S6ZnU^U?%IrrTU(GPUXLk4 zia!cg727@cTEesW5y7d=zS@hA8F~Zzbejm<^&ALTv^$?{gX9|VKo_*AdAoO?hMvhL z<0R*&ce2h6$(U1ITT %wl4syYHIgDz@F?3NLkGl`8m}0aG}C9&-6nklwY8D Pz8?#7D>Kqr?>qkiMk;2! delta 2267 zcmYk7c{~$*9LF7na^(oabjmSjx#pa5JaWuXhKUF(k8=;rF$ (IzT$ z6y_?qMo|e{dKz1E o{z!gN?NZ8qe|#bv +1Vav!+L9>e7ty@Zo+agL^9qbrIXWJ^Y zNJaY;a;i4fb+sQF0$hv;KwycLwdoWkq7)JEp09tuFfx5Xd4D->XS@8?k CUyFT3JW~j)YJVZTd6j0bOc`i4lSsA*43HfQKZ}~& z^cfKu6pOwT3=cZtY CC$CRK`o~v&E*N^*=L~q0I$r{iA7nT#&+=5Hq1qWw!3#f zw;o$oX-rJV@2%n{Tf~3kqgzb*LPC+P7tqD`{@0 z2S<{Cr9bATi4r@t&-C#g^%)X*6l$u4Nvs~!ovLZuG|4hwWhyBP;HXQ*{>Dblk!`3B z5SFNVxF+(GX_rD#p2014T141e4UO!dB!srPRy%pWz)=-JeGUAjv yrS~W2bE`jfympT)B(FgkYhdk zIBSVPF?iXX&3A=+Kueb1U2zCoFk;LiNM-Eqc&V~a>HPw==CJuzgTZ~IE7&>vm^iR0 zx9ZN91m4=}EP_!}AM{3}URYc#C f`5nj~Otijgj(P4Ze|rkO zkP(X4^@gcCGCRpa_1tMCt#EHIaqp*wQG^?nEoCd&n0oc@5|uqky~a_M2h>eSR`ZKp zT8-CVB{uCf@RSds_aDdR#Ls-4J%;}smmhSbfo3V)-Ea3GfSS6XIr9qgZW7uDFt#%Z zV`Al=`tN`mgh^Cij*>(MV_vfP1B(eVC0sZk>goOK+IY#HM8L#o$UC8`@IYEub@)k* z}|_f}CQf%U)_h0}-zN5p%*B ziUJ%IH`8 I&S1iS;obRzap-k z!8pTg7sjxG!?M9b%O_^J8#E0$Qa78MG4B8su6ZcyXsDxIYJ+708(`VLbE|np!beis z=nfAXRhy2FN%-3znk#vfX(Iu;kok~vzHTo?G39+oq~g)&tJP`q%u8f()S21VN6Mhb z`Bd9Z_CI_oCt^y#qRjBRlM8=~w=qnCz1WYf@f&%>d=1QZir)&r%x1;mk4JDRch4t% zFGb7qFMPrr*$cgwK)&c#L<$)7aOK095461EUE&O?Pnjdwg(f2fO+s=sI86_>B~tLP zI7|Pdh4{$uM-P2rQhcmn|5Cp(IO6uI05U9z-+y_RJRuf|(4|8MvA@>TkKAc4o5P=w z`A$;w?^@#re84~*CzbXrfOR%I)$K@BNl^p9AV%kol<`fgf#eBIv kO=28J|69mSMlZw0@+ORKI?jQ03uzcRNm4% l58{YnFsozK7TH+!Qw^3izv3 zm$u^xU>YtxN8$X&g1|ng`RBD)eU zEP{!$^!n91}g8-U%GX-4VCX@du=Ig8 gTU znXyGy1oqsO+!U-_d*lN>X3OH~rNy&j zl~q9@`u{vyjBkiKO gvmlHmvIusz|mztH8BtrVS zJF2Y@9Abs6xoQ$}G^l(^eDGJ|AR=zPJ1%_iaO-kj-=OkE_nghrp9I6+kwEA7fu3)1 zRj=GfWyU@^Cpcf`o(EZ~N(2tW;EH;O3p5YdyPU0?>|}2XWnuYdI)>L+9%ZNawvU6Y Li%sou|CIj#7baG= From d31441396e3e516c41c8f9a8397c3685cf034ce1 Mon Sep 17 00:00:00 2001 From: SkyratBot <59378654+SkyratBot@users.noreply.github.com> Date: Sun, 11 Aug 2024 16:28:12 +0200 Subject: [PATCH 51/96] [MIRROR] Ore ore ore ore ore... sounds. (#29259) * Ore ore ore ore ore... sounds. (#85738) ## About The Pull Request Closes https://github.com/tgstation/tgstation/issues/85615 #### Applied to: - all ore subtypes, except bluespace polycrystals - Sandstone blocks ### Video: https://github.com/user-attachments/assets/7fdd322a-4f57-4df7-bd72-e6400382b58b ## Why It's Good For The Game immersion. ## Changelog :cl: grungussuss sound: ore and sandstone blocks have their own sound /:cl: * Ore ore ore ore ore... sounds. --------- Co-authored-by: grungussuss <96586172+Sadboysuss@users.noreply.github.com> --- code/__DEFINES/sound.dm | 2 ++ code/game/objects/items/stacks/bscrystal.dm | 5 +++++ .../objects/items/stacks/sheets/sheet_types.dm | 2 ++ code/game/sound.dm | 11 +++++++++++ code/modules/mining/ores_coins.dm | 3 +++ sound/items/stones/attribution.txt | 7 +++++++ sound/items/stones/stone_drop1.ogg | Bin 0 -> 10969 bytes sound/items/stones/stone_drop2.ogg | Bin 0 -> 12363 bytes sound/items/stones/stone_drop3.ogg | Bin 0 -> 11793 bytes sound/items/stones/stone_pick_up1.ogg | Bin 0 -> 11584 bytes sound/items/stones/stone_pick_up2.ogg | Bin 0 -> 8500 bytes 11 files changed, 30 insertions(+) create mode 100644 sound/items/stones/attribution.txt create mode 100644 sound/items/stones/stone_drop1.ogg create mode 100644 sound/items/stones/stone_drop2.ogg create mode 100644 sound/items/stones/stone_drop3.ogg create mode 100644 sound/items/stones/stone_pick_up1.ogg create mode 100644 sound/items/stones/stone_pick_up2.ogg diff --git a/code/__DEFINES/sound.dm b/code/__DEFINES/sound.dm index 99bf5033e975..375395019494 100644 --- a/code/__DEFINES/sound.dm +++ b/code/__DEFINES/sound.dm @@ -238,3 +238,5 @@ GLOBAL_LIST_INIT(announcer_keys, list( #define SFX_PORTAL_CLOSE "portal_closed" #define SFX_PORTAL_CREATED "portal_created" #define SFX_SCREECH "screech" +#define SFX_STONE_DROP "stone_drop" +#define SFX_STONE_PICKUP "stone_pickup" diff --git a/code/game/objects/items/stacks/bscrystal.dm b/code/game/objects/items/stacks/bscrystal.dm index 410724862f3b..297954103898 100644 --- a/code/game/objects/items/stacks/bscrystal.dm +++ b/code/game/objects/items/stacks/bscrystal.dm @@ -21,6 +21,8 @@ points = 0 refined_type = null merge_type = /obj/item/stack/ore/bluespace_crystal/refined + drop_sound = null //till I make a better one + pickup_sound = null /obj/item/stack/ore/bluespace_crystal/Initialize(mapload, new_amount, merge = TRUE, list/mat_override=null, mat_amt=1) . = ..() @@ -60,6 +62,8 @@ refined_type = null grind_results = list(/datum/reagent/bluespace = 10, /datum/reagent/silicon = 20) merge_type = /obj/item/stack/ore/bluespace_crystal/artificial + drop_sound = null //till I make a better one + pickup_sound = null //Polycrystals, aka stacks /obj/item/stack/sheet/bluespace_crystal @@ -79,6 +83,7 @@ material_type = /datum/material/bluespace var/crystal_type = /obj/item/stack/ore/bluespace_crystal/refined + /obj/item/stack/sheet/bluespace_crystal/attack_self(mob/user)// to prevent the construction menu from ever happening to_chat(user, span_warning("You cannot crush the polycrystal in-hand, try breaking one off.")) diff --git a/code/game/objects/items/stacks/sheets/sheet_types.dm b/code/game/objects/items/stacks/sheets/sheet_types.dm index f50b9c66691c..e1ceacb0a1e7 100644 --- a/code/game/objects/items/stacks/sheets/sheet_types.dm +++ b/code/game/objects/items/stacks/sheets/sheet_types.dm @@ -943,6 +943,8 @@ new /datum/stack_recipe("paper frame door", /obj/structure/mineral_door/paperfra merge_type = /obj/item/stack/sheet/sandblock material_type = /datum/material/sand material_modifier = 1 + drop_sound = SFX_STONE_DROP + pickup_sound = SFX_STONE_PICKUP /obj/item/stack/sheet/sandblock/fifty amount = 50 diff --git a/code/game/sound.dm b/code/game/sound.dm index 01eb5d66ef44..4b2cbe931b5d 100644 --- a/code/game/sound.dm +++ b/code/game/sound.dm @@ -473,4 +473,15 @@ 'sound/creatures/monkey/monkey_screech_6.ogg', 'sound/creatures/monkey/monkey_screech_7.ogg', ) + if(SFX_STONE_DROP) + soundin = pick( + 'sound/items/stones/stone_drop1.ogg', + 'sound/items/stones/stone_drop2.ogg', + 'sound/items/stones/stone_drop3.ogg', + ) + if(SFX_STONE_PICKUP) + soundin = pick( + 'sound/items/stones/stone_pick_up1.ogg', + 'sound/items/stones/stone_pick_up2.ogg', + ) return soundin diff --git a/code/modules/mining/ores_coins.dm b/code/modules/mining/ores_coins.dm index 5d9809a01f79..e9e8b3a7c3da 100644 --- a/code/modules/mining/ores_coins.dm +++ b/code/modules/mining/ores_coins.dm @@ -22,6 +22,9 @@ var/list/stack_overlays var/scan_state = "" //Used by mineral turfs for their scan overlay. var/spreadChance = 0 //Also used by mineral turfs for spreading veins + drop_sound = SFX_STONE_DROP + pickup_sound = SFX_STONE_PICKUP + sound_vary = TRUE /obj/item/stack/ore/update_overlays() . = ..() diff --git a/sound/items/stones/attribution.txt b/sound/items/stones/attribution.txt new file mode 100644 index 000000000000..9095ff55594a --- /dev/null +++ b/sound/items/stones/attribution.txt @@ -0,0 +1,7 @@ +{ +stone_drop1.ogg - https://freesound.org/people/kernschall/sounds/425035/ , license: CC BY 4.0 +stone_drop2.ogg - https://freesound.org/people/kernschall/sounds/425035/ , license: CC BY 4.0 +stone_drop3.og - https://freesound.org/people/Benboncan/sounds/74445/ , license: CC BY 4.0 +stone_pick_up1.ogg - https://freesound.org/people/kernschall/sounds/425035/ , license: CC BY 4.0 +stone_pick_up2.ogg - https://freesound.org/people/Benboncan/sounds/74445/ , license: CC BY 4.0 +} edited by sadboysuss \ No newline at end of file diff --git a/sound/items/stones/stone_drop1.ogg b/sound/items/stones/stone_drop1.ogg new file mode 100644 index 0000000000000000000000000000000000000000..a645ff7eb689f58ffe6e3474216c02e285d08266 GIT binary patch literal 10969 zcmeHtcU03$x9Ef#s&r{$=m7uqXbKro>b2oMkty@LV@;t@|kK)RHOfT$1&C4fq( zq8=knx^xgkv7ll{#d G3%-hX%2Fl%P-J$wIVmzg~ioI*le0T=jL z0u44hp(iT_VM?(01F`;LaU2jA_1aI8m`&mim=kB_--R<128}8-Zu?4Dum4La;NE0~ zhA2G44u oIb+KLoGgMP#bdxMp#B1hAe+KYLnFOV%` zI3b;u30r&pY4?CjH~4&x#f@T~mH%u6Hr9cFz6Hl87bu2 85bx^dK!(a;ACLH;+4#e=@kx}DH1CciN=KUaT$<14 zG(Xw&pY==9gU_70v2+9sRH$N#A8XN7 vs38_=h$Xy10-2YG^EIF%tgQO~s=<`vp#Q#NL;JM>7SiSI7{%K$YIu^`?N}85 zhKBnAWK%2&)f MQofC=Ni{An8oT8hON7 z%*Hv)LaN|s tyLFoF>+ zTdt^+Iy-qQ)9tM0)w+_i8y1Wlm3s`?QfsiZx1w~cEN+x2T*lb!B}$y-Z>*buU~ FZAiA)LGXA=|p3q#%SlQFst5Q%elXh0K^{U$@zn^YVx4(S!7Um%|BXj<2#8m+w zsP{Fn{LP2}2llV-gN5woHz(V7E(MX4$LBAlT&-NBbm)|5QH6fLR+Un2o{eqY31^a= zCgV`b#>x=@q>62L@n6k`D{p#nRbiI)AhLPbU x|b9290E^#n_A}$f$_Gd`mvLjUY)ci5=9cfuiD{hI^-WM||7(KkA)T zMHdNmsE!-xxEflJ-N+vCQIs=>7uwT&<_ @$rRP`b=z{+eIiXoKC0R8YS Q<^rvU(9=L_3y>?1BDooSNMG)af-X7OJ~41}FV zJ4~V>#hwO04uB_B)l)}BCH(U-nU 47Zm@CmPg#%@wjmyihE9_IdHFZ8T#R5&|B!`6 zJ7C=${^yeZm&5;R;J?)X )@|e;gG6DvTdcf#e|e?{B(DkO07>FpvV}7lgtf7@!7G&hrCM7?h~= z@7esnL;pn}jEV%{B;8ZypyCi$UH}DKh!XOp00-_P@>nSthnS1=bqZ*88Ga->P#uWz zf~A8}LlbD1Cnm*=FnWIs%5KuSAP7o=GF8w}SN#05#A<;%AE0$3v*=-5(D4GPotL9_ z<4{|asB>t)EkLLN_Cu56 ck zsQ^xnLo3vW@?=Nbff5L&$q0n#%8N**5KI(GI1WK1RWuUrd3hX^f1HCzU;w+R?W{;g zJqfoBbxQ;G631NUH6e8q3#${)YeIQzcwyBhq|E%zPwgk3|Ec3xAIKUUMX3*QY*fc& z3PPhvNKt8=e3!|5+119;|LkGE1&;DxcCsP89}bf1;2hs5Apo2X0-$}x?{I1ny@?GS zbX=VCGF2b01?60P%2i@Gf>v7o|LOiPDl~^G_Vb2foa6Vi7bE!3Tg!jmU;cmg=DZ>r zTit=|Xc{+`lA3GSpmt6=k8i6yO9H?JAgfzu=s#DZ724WL<8m-a_0z>(S&g_1eK@0P z$}3V|<_?CxvWn)FrPcNbG7toVmg2QfNSQ(N%GPO 2}Eyvk4O?w42v}#<;DdfN!T4z*fB!fOFSEyH(s@L~fHlRWO znOBiS*B2#M9f&vr@&(nv+`2w5$Z-UMa&mR1X>p^x0Bd0au h7;E3<8;G$x+bB1&rE$smQW<_R+Fn9B@6)q|y*|m|jw02D--5{M zlGO?EbfvXU%{9goU-fgscQeAGU?WAZ+3N~Ry?ZVwp!l}kT+>@|66%+cSW4P60|PW8 zi-LkQ*UE|~IV; ?sTOpY6XPab=4=CgCkNFvnRM-;FJfI`0yAS=`Q&l<>ki z)t4?LYA>o1oi$^_z@Fb%AMqknYuW(sVbXTlbx1<({{4t+J%g?Jk&SO<;(uIL`QEt& zajRuG!3d;chN9(*SLE842th_e52Dn9>-O!)cn|BjL=x3rvcya(`_y*CdrH!$uk<`L zaG()sHO{*2I%cKB!vO=I8tVMa@{XGx){(+~d#$_TB#sd7FI*P~rs>07t)d3cWkh+= z>B@1TPP!-NchtCM^nHG~7J8;NF`N<{Tv~19|1o}hRER^jikq)%)(JUw&?2ijtabI* zm{uC)?3d8adcN28_x4Ym*Oz l+*5#FKk>oM oQj+>To^MD3fOYFmln*7o7o$;E35?8vfI7QJYjLpx&YaC$@XL-9uF^W zT)4NbC>cpjH<>kyD4=e;hA#?TVG;eDY{CUWp{Q?s+JptDTMcBc4$j>;5S@60c}Vc( zhkacij{TxUMGQnmF4lXz*?p%-5nv1YPN4tXefgmU(;F;(byi|0it#GlUiBVbKS=it zi#!3~<2h-1N4Q0+@OI$Obm0}_t1|G{De{vhRU@N0bgXIpLzmo@HJ#GA;3Tsazws-b z_7k^+eV>NEvX_s4fmX44`AUJwVzWkiIy1bQ7*Es5Be6ZBN1w7JC0(RTXA1nr=U*R0 z5;AY#q lN>HTJDv}xfn{(qEhFh!#p-!?mRX})C553PN!56fLL0vv-7nD zC;@di5Y$aA>=gk(Z?8h|XJx_`BpWDYxIGcyaV}k DrP?~^}?w7)5!U`1#gko`FXt2+5G2@#%l9-z3Q@?4{H}rg;$SL=*8j6 z{@LMpR}ra*>6yIhENwX4*x)@+au%!CR|uIAB_-n5TMV4|Qn=8owNX5HE}G>wQ_`!3 z0fMwy%=6Qqa6G=>$f*GQY(RJKC(v0-Nq}ePOH!X!bUsQUmEhtFIW>)XQDAzF^g9 zhwf; U8BV0&^Y_Qkdt+XQ1>LdI*8cXJZS%CZN49%lu&rhxRVJa3 zXG!V9pNBQS`aFDLoSQj5Jo2IO?T3{tGgHr+Mv Xjl=F(z47PZV8&(=b?Q1hdPAa$>;GpXl; zyxMucIuG>!F3xmundua!OBf&U|71K=7n(6MI^jl7+9ld`A3rfkc~`#HEaxnp=d8Gx zRi~xg3p6r!WM(2p=>&wfwmtx774IlBWh<=g1<`LYyds%zWi$qJub5m3P#gd*UW``H z>)Z8DJ)^I7cNU|ku}_+=Z~Y+tQK%2_!S$)&{frLK15`escOwExEfV3X-39mnK)jUS zjgo4kXN&Pl0PaYmq(N$PtmVb#o8jL|L}cT{g-CnYGL v2(_|ps8SA%oQ%v^p+8{ji6YCF)6*}$Gvtb1UBl40>IkuoQQ6$oz9wK zR`c-a_Ntlj`8pb2RFk+Dh{}8|co%)rHuT59V*DScKPK#txvYP?-lM*C!i>^DF*G 4If~+gXyJ0aL5)+5xvo-5NMZLTpsJym&NbL-eE0)ROI3#4k635eQY~@ z$lPp|u^osS=@8kLEcxnyaea)hfH%<(-!C`l<}OGTvIzKg#b8eqk6e3lNcx*wKT=-t zeMX7i)Bo~W|MbJ7bsnt|2GsduIdr9$y;p9?#iccyzd7iuUv*J_r@Jt!t+|-&n_JCd zJ*h1;zd?b&xQlu)pLxmiRG)%Wh@!Mry!6K(6uoaxPt<9>KHi;_cyk}y{tx7y)r)na z0*5p-1wgsoW09x6KnBV{)17?9j;Fiz>IiTL)}GXiAmHzD@%8)eA?*LXb;0}5lw>1f94SD_2g;b l@`ju%^~znpU8_3)`}g$i(rJBeYlG hc`ukDjjkuez~hJ{(c{7 Q%E2M+3kNLcbPvjTr74(epRW7cgcbH~rSNGQ9Ke~zL zMQaWk`%#B!<;w1Z#XK<$wT)e{RJ94k +%sr*=Trug@^2XN_t|ovk0X*$465zRFK-9NTuV57Sz++qA7DJ zY6@1kVeW1)jOZmLEXQ~tY#PWkYx{g#6j*-T3$_}HPDoFqd$D~|-mqsnOD1L*Wcm}X z_pu_$p1jZ_L`4?!`j@vt)G`lgO4_X`iKn@r@y^r~m_0^F2`jq>e;IVXT-^x~dEEMw z*>-j?{KN&Gz#sE26xkw!-W@UmaM|2#w77|GiHn(2=R(QEMb@b=@867Z?=$+506LbU z+seL4A_qjCeF0g9Ik$dg3l3dI1Scx~HvJ}sa_Hf!ck}0hc71wp{9->Vp)x|3E9>Qr z?1Ep8h1vqN(GAMkl{bo>c|WG6@FOE#LbFFehgRQ`x5AhACrefDPN{nmx&XajMk}EB z&@P+(;+NEO7izElz;uKzzXd2v(%nmQm+iwQSLx-y`w=e9td~DJ^&ObV;+JBmaXTM$ zmp-D3G}(;%YbbRpr4Yi!6a21`<{#ghdd)ZZ)!XT`xf;qSn`NnlUw2Wz=VN3+Q4aii zs-;`$m-=;+AQr}E39tD`usgM(%zv7ve{e8MTQ>R3N<)kL*Bj~;S?-=^r3K6}*)nEV z&zXNsFkD7?zUrN`)y8?e{j(cQR7<|n<@+|O$A}KkqKDExJbfBWIsfd~%{|YaJ^S4J z$DyX%$Nk9eva?ZC*QC%Ez%vj-EUs?A;18=_c9|f#5 zo~CnwL5R07qeH36VK28>fsj=EBoqvy3DaesO{b0?Fs75U4{B-Ls{_D1`)Z-u1o^$+ zyXek(mXoRL9 Oa o{xaBV3-K zco`x5s6Sh}Rd9`7%LO7aM84P<=}UK)d!#d7?=>0b_BDj_{H_B|bb6mXV)`eW9i4n_ z8%23;BBD$&p+6-#G`7Y#eqW1R(%a2{r{LLv+jv{pcwFH8F!n {5cF@6cAIy4f#>1D~j?XZI&(DoAIyR8{r9&J@qh{~kE$u=fOJ z0c!yiG1>e@RbqSM6PBk;OVz&Ix-V2QtjDz;#k*zw&)BO;Rp}Oso z#i__HW>hyWifHn&0wMOLD#>#;>g(21>t{f@j(|Ltux1_lc!5MB;8L4(+tNP6;Lz?A z1RnlYtQyH@nVPCPm@NM3#ng!>Jde>=ir;Z9EAEr3JQO#uJqMFH`6=yT_rWU+OrmqV zJ98I01MITZ+W{q;<6GD8t4jp)M#i99l?PcSK z&7UqDtKP4^q}tu$ezmp#{zoMJwPElTH*0IWkE%LQ^Yjz5ajY>S%BET(p&um*am7YR z8jN2bnS;u12~|uL7}HLN&3mm{)y)fX4{1}mP&Iy1dzrzETGeb8G8+Ka-Lsjz7?r%P z(JWkP&IwO<#Wc$v?I8tz#EE6KJYncZ4lT{RawyigR8+IG{F4ukF-)H8CR*}^5`bN! zRNQhMtkzjHN0DkP+YID~r`(1siZw
FZt2M@Ha)!G$&64a#tDa?-%Hv0EH)#wuz;YV4)Pjv`dsqa18HB{C4yWt(T zuZ?6+HO$W3%<{6h@JE8jSMT_MG-Yu6Gd;Ih$aJu=b&DG2$GNB`I8I_tcI{dR#)V@(&ZjG{J>pu>^kCy*~E6jY+k)wB25Rt%*kQ8|8YY zTZ!0X)+BvTJ=*j1v}+0V`u)>))Kg>r7+Se1={TX!_c`n3-6?ddJTK|0ZT2JY*Nelt z$+@+A)Wv2J;tI2_S_5m$jU5@y5|chom^5j(;6DSa&^gCoZdy6F$SD@fsLr$jQ v*xgy{mFN}!er?Bp&}I@Vzo&T9ZF^HQW0*g=iS^>GWIuW z?OVU;fxqN)&i@7}K12P^@A`%dwvXS>&9q^AGWt@?JJX&FEi0x~z#C1_UKZQ$;$oLs z2dWUnYbNr|tn(+|uK${-^Xrdhx>r#m;ci)E$b;y$nWN3aZYL+C>g~7yO&>E`(l=xj z|L5^T_OE3><9A_R{qArRZF2P0u=s+%TkuteufMi4v$KW40ujoo#w%zM$pnG90H zm2DKDLR;2zc|pdLQ8I78n-#G3sZ`pG)1ox3z9(lrdPVN;ly&cQL76p@RU>K*v&f9P zUQ7H(+OiT$f>LajXZvHd<$}SzC$Gjm 9CSMBDGua9N*_$Ve0KV`-bc!wK{9(I z$kJpIp{hp5eox`t0^CAjYnnc$GBa3bAnhGa0=5skjq7au(JgvZL!KggPgL>Lg*~4o z5M?}oFm+_NzKKJHcUKdyjj_XT-ETxw!HE^totQG`PzL@Jma22xCS^1(+rkJOPp|rO z*d2~!<@U7d(ib90t_ofMbM)uKR&LNd}D` z2SSP#N)0?)6`T6+`7U-&i%+5#y4 *@2*4Jxx*G_#fil~SVY-*MaA%|$VtJ>cP zJ@f)wZ#iPLgJ$+~2C`dSW{z|Vxyi=SJYF|Ie* zM);IlAoH{rCyRr~N9BBd17S<*QoxrImf|eO?-$6jIf2slI#ZdNwo;e=Limgp^o%$* zX#&RwspkzQ+eKr4&qB2bhHL@HldFQ}x)g4wkWGDeF3R!O^C6KG$-Npd)5pua;Q2>Z zywKZ#9&7IYSSN0;t-FdP<&RRss&C(#2V=`3id){rSlPH#Id?QL zupRS@++aHO!jXd(Z4=cA33r$T1%uD*y`oDPnQIJH&9K zGRR&?)QK>6zwliUlyc<{N$79lUdXZCng5jCnGkS9X;m-b*Z=u%C5P$vQh1QU-Y>*= z|FJM1WT2nB?JovMW2CZ@vXat4B|K7&RcQEGs9!>|r4ctZ*azRscm&sV)dd7k$xFky$t<7% z0D=)J2~OH=+*44=2(URP9yW%$R2s&iP+yVAp*)5>Yo`3P=7NRh)B5Tx&1Z65)4H74 zu2~Z^+=8t~%QaT#Q{ht@PfGtZ?7#Mb1iwX>Rm7857q+{6ihNyR7`W8$Z6N^)xJ}?_ z4&1mMKG80IYewqW8w^oEbw??kxNnW I&c3Lzmgu` z#-5;w4$MRc*Dn%Kz0A8`1624G*Zm*Wo1E|U-&ca~m;yimWjPuuJ{l@zK$02_!?695 z@E8E k`>MdSS^g4F*n$JOFhmKVCFkQ8Zl~K4r{RT>HBh%U{CQOrHf|B2P+r zMnv2|I=|UsHu@cVa4vbe_;Gz79PFj$mdJMZS^r+|k6F-NN~Z=i?twE>S4sl<*qy=N zXV20Xx7c@K|8716P;YL_h>@~HWPBE@I~-Mqy0ACmJkNy++?agL-pnjR6Z%<8l89_= zMB=ZVBLRTQ`^$>|Zho2aZ!4~$r74WdbxtZzV0N3P8&jIwZ8v!JxNx8qV^l#a&g_0% z9^Rs16j0l}=%84eOEQtK{q0epQjwn7I; x?qiN=4ho+Qu#_h+Gi4dO68?IdWqueq$-~xN!2n8`eLb1AtCL{pFLn?iskz z(z6!2?7tQKx95byM{~q)=17@#NSV)KZoR=DdyAhDFd*X1tpuHC1S98!ysXrm=TyDs zY`hktyzcaPIbMz@_xy2~-)^(96!|Znv+E*gjjRVoH0J;CoC>+D`|4Se#xyB1O(r(q zC$*SfRQ{A+#qn>R S!%GXX$>BYv z0bUkhGXy>{izhx*(2X8Vkjk>iPfk{v*8V`2)%Ads6vEP0R?prRc$`1;L7f|dh zyJA=KHNo&$`i_|ZNGX7EPd)!pY?WLZm_Id)hhiq)>J#DSRyNKB5A5@wq*lol*ERI- z2N~V|6{5i8&bRm ?~aTICXc0hK3eSka7-h4pJ_$RQVRy(Hp=>Lik0v z5a}$OvI}bfqYHGG$i{go&x_&*&g*Z%Fj@Z|i&Qi;JnL^!oB+TC>Q0^)nRRn_)PVtj zO$G!&GGLlF>pNg#=Dn`~xM&9&NC9mj!_5R&%jLnZ%TeiOrfY=qB#{*4YdLfkr1MBR zMzu90WfN>|K8XdDM>C-#Ye*z{7Jwq54*uE0l9HR4fj3~b=aK6^sqsWg*97;tG@Kt* zivZIbI^1J7$H}GPz&zQ) zx3tp&EtL4Je~DWVU~KNHt6UZow=u0Qwp Tm5M@zahn1xBo~#w)~Hb!<<2F>
h6WCBGzSVQX*b_(XxJX?*_HoNq}%GQ@VEOJpxh(9M0$6_H--}cj)ee#LYrG8 z^+HuU0}OP~-FQjG!Q{c5ixpMFt7{~ml>NV(KZF9#q455>p{QlJ{pp2r{OhgdKkhI8 zFMG=l0nOdE0AebMi9n`isx(QJ31+bhi+1n>Fm_PuIw`m zC&8G zZVC=oTQlzvh!eW4!B$z5>yRejb01U?2m`m`;KYfl&2>n}_8>|EQJ~fWK$wS$NjC@s zw-SIc=>uWy!-#-P1Gy5%U2H(Js{EsH)Aj`ikEU*!>I~X0tf_kuol8<4fm?ySVye=} zM}$Wc?uo+%{=rXst*{_*0B8%6o|*I!2hecXy)rVf3%TJ_EC4}U9Uw>}bYw+rgxspx zh4)f^DW(s+LxQF^vTI?xc15Z|go9>=r0(9tYGA(*I$(MU>P*DrZ$u@PMj8ia>>@yR z(zWxyXUOel!Y1^85Vg6vq+fGkzfxrID!QAg@`JXUO9JO5fjoZa&Y(azKpwvkCg7D7 zuFL)#kxK*VYX2ZWM&SB?5FjIPncp+O&Ta~xw@bU*`PI^Qd*JYQ`x{XUG6I3WLA#8= z;h*(>G0G(={2qeGFVpVnC#irPvQTN!f*yq{n-PBbEO 78#gv?)-x1+ zTv4-Z%!cZ=H}yj5j2oMjCBo!c=}8$1wS^b*btei*T<(gvhz#6OjYrnHqX_WGP6PlZ zK4k$IoRE;f1*j8@vY`M6Czr$x0|H?`s+v&|Vx}%zrUn2yDU-aZDZ@xyrKp@j9TR1k zCHWLEHoa_grI)gw$!U7nnN1g_%bRE~PJpnhtKUnOU4KOtE3L4yentTK0Dw5K2_9c} z05rO)=)u;jPXIfg2udEOp~LqJtp !7B1!zy77nNdvoyw7M$D>Tu%`L$noki^h^1jH1grP19`LL6cn%?z8>!HT^Q-v1K< zQ^{Z)cd>i5aN%r+Q@+~*Ilyne(pIjaHn5htF|0X?y+$zgHR-w1Q`{yKUc+GG?$w2R zk#{{c5*~ayPu}|U8SrvU+~AXl39sH*jfE|pHI3{NY`mdq(Ap~eK2&_ft+(Z+8JyYw zeu#5smBC>9jfT 2A7$}`+UY>Cnl`Nl~QZ8@t&ivJ|8CBf+D`T0uLsM zW#Q|{Gv>`Z^pt?^{_&7D!+W%A(bCoPO;RbHr|%5+jo)6I`Qm9dB0 pW8NopMOLZ(kEGOVxmL@fvBOcCu_>B(zjSXZWg? z;@4cobJrW@E$L@STY>{>n+qI58B+JB0W)-w5o^`s!{$m+uILL+l8x?>^C#=ouFc67 zI9L2wzKLq?a9wUTmXcKzY_ynHo-?uRRS+UFvkWv{V;*SQ-}WG@Dqzx|{j7w3Bg?QL zU(Rzuk>`AoU9z18?97X!N2(}s%Vpx@e(Ntwtr5Xp5t`PmQFO(01)D>S?q$moO_f!V znOB5MHVwKjT{X17q$+sPsNfMLDP2 ewS Q!<=lyh!;?cU0s15lf->OSzZk$oxt3r*@gNOw3?Xh5bbac^@eyC6}#l- zl4;-l&*$+YnkUO=M5UwLVYPhb38&i|qE^!s5_dBA>t-!H=3LQzZuVXFI!^HzgxJ|i zAqSf4NSYVL%gc?}x~$hPWF47=RwoR*KF^tz_DZQV;e$Ag!lctUslY0ZIfsALU``=z z$A#`i^IS@!H7+Hx7A8oZvq`GN$J%bd4M}Y5R8)7HJ`8Aj+J8u}w@uNr8Iuco31vDC z0s21^!01Ts;aTpg-ka`68K}4(a)Zz6=NnCXsX$IhN`w^;Tl~u|CSE? fBO`ys zt*70QaZ5 fAI~Z)N`XPmvT+WV)7a@L)VNKx_vNMFBn>(BkOy` z;mp(Nuj8kx78dl$$sJ?kLly^SYmXpTdWex2>%2n0I=|a+rFU_cGXtI;oB26ol=69` z|Hd8F%L9eQZT9ywhJMhyyb;NY>kjDl$)37o1#epiZuZ37#TZ@r_BClzY;*1iT)x>} zu49I`$TE*bbi{#u#Qha5nL%wfc(WXAzJ(M?hxH9iG#D*EEdDSqwQNApRHdOfE!!)6 z+W>U>)6~+uBmg;fEg45k8H8}F->vA*NzflU$c$6H#eHd6GvfR;K}R#Xs=cCU-LCA$ z+D)PWrS3kjMSCucw<70}we-|y_Me2qqt?1IuB@x!Fa038PhD9(wZd-1yFl%_p>fzk z=rq@BG)22?5)MVUVm$91P046yO&EA{PSeKlz zGolCBmF~GCuFUedqX^=6A03>Oh(5-#kd^i5S?uT=30P_te2Z7xYhQRWF6`5w+d&z2 zYDR4vlA%%=rm5UnIXoc{aKWq~>wa4L ^a?8thwToj9LgST9_q(u%jN9U0Q1U41S?F{6O)uE}#-m-u zAXFS@rbJ7#7|)SF`i&1Rh1<2|FAkqnM%Nl3c;3Cc( )Ivgn !=kv>GJA0bDo7+f^D3*B z%Dmvr34r2sC1+~Yk;WIaI&I%zSma(O4+ZudQehTh59bMSsy=2GsC0f`+g!_IGp*&; zGlxy(-#^GM*4X%1_}=;W3VCG7*R?QW9HXJixZf^bi>4E+t6IA_hujm=U 8m>BO%zAaU`0j;Nk+l9_{~^?1Oplv+j4Yv#@Fh66~7U^!CL(AB}heQ8L?< zPIxv@^N7Qe3kgsKCobmz0C{TY^~V<80aI&*{@}zw3Y791yssi-JXnF0RJbL8#~tr9 z^2q!2*0f9BBcCVCD(uI-o;`#@H?Gqt;3?K-wR*>Bf;ZnjsToG+WLAi&ycFfs(rM@P zDCKiU?g7aF%}&+~9H%!;XQ^Nj5MIQrP-@;M-D0aRmi`h9>?!j&N6Ph&w`sQB!QkcT zLMN?Ti(MYe7CLHRPWZh45PICQ`Cur;QKwH|5G&-WF+u~1#!hpb(v^JMW{VX&xqkan zs9MHCRAA%Fb-(smle3N(?c w(TPoIDy+zrTQ}Ctie`%uSD!P4d`X^EKpS%x+SB#CDO`Jz zdyS4>Jahd@X`!$n@nh}<)rD9m+e_jj`a(OlA0Bovd{+&{8iE{)pY{VU1`Z$WT31YW zvHNssHtPH8(!OB6R=<;hXXY;=rNhGEeEvQs?tQ50G2d3uy*QgZD96H*_Nq6 <$9a;(#@esnyPjgmE(~(BhQ9f zW+BrcF4G8cj@~> $cddJnYVb1axX# *Woz1FKI&1TaDDO2yTi84EdfRG zU#B8U{G|0pxYWoQx3cF$ZfYuf9ujd-O;;^Slk1zeRe>k@Jj{^1%mOsAHuYfapRI@r zrVkg_*$s5Kqqw)526>w+nS=4v1Quui+Ju>|@ebQqc0p>-a|((hl(NuUAMiS&G%pTa zeDd`StnFFFbCv43tex 6}=WKK2!8CHzfTT)fWq2CyvZG z_`LPk?X`^7j2=o`&jfE_6=)1D30Jmrb?fY9HbhIW`K0awvW|N4AxniZrrz550xZ9S zqjy7qQjoX)O+QCRne{;7#{O%wi8f;ApLTxmetXJ>uUm5XfgY4A%M#-m5?^#iWopE5 ziRnqc6!7Dm)LQP)!*^y4(cEJwTE2WykW4wmpUTD*SbaUnUTnqHSVe`2;!z?2uf`@D z=`}as`FU>nu17}DyVE5&8+5uz^Tj#$(e!KiC~};bck@_1Qr0T5uxGzhB6IH{M4#g_ zWd|wRM#UwJ)QJi+^F Lu53him^4xv47EC>vRR~EoALqu3Viak%n&OQD6y@` zk~5lT7AEvJh}$LTX#(d%`EHve45ZI1UJ+Rk46E^A4kc1J+(!_F=nkaOYzEG+`53iB zG=RmUOU>eJf;fSaCj=2fk)?XiChmQG$ql7L@o|{;%@#R`nR5tm&w-ls#6ck?#pO+s zqDAz(k~z oJ<)JR zQv!1^;~+pdB#XYKR+YKf;4jn?v*cB5%->taE`qN1ocyf%BuZ;lsqel|2sVEi;dAkM zK1bk@Pk9C9Kc6W-IByf3msS=zv5@SrFyoL~Tdqs&Ug-|j(LdfJ$FaXG4rMK9xxynY zdRD5LLT%4GSg&;rmfI$3WVq}=OaT}$Tvj>{RmLSF8J{_V;Pc1owAliSGP2%xmlsGD zPOk;*Jtln8SnptTS8EP6s|qo*3gl#UUc<~RxaIh!%o^X!hoFrtHJ6|a-b%<5-q_CA zv#2mR!!rHTgwW8t+l4cP@Zrp~sAWIr5!;bWQ~8J-xBH7@V`Xzs)7C@|KQQz}oV 6pXbV^N4Atmnvk9|X)2ZLdooho`u$R+ yp-*8ppgF;Igu^|pNHRCypOXrc f(Fxi1J`sK*DmFz~!3Q@i#jPFBmQRkG8K0023eefP@SPP>M2T zRnk8gQmpKG6QF76& 7F^M=G}-j{zQ84%kV~16J14~pgpE(r7SX-TBD6;h%F8V z_S^MdmS1lO%xCq%v>q(GZwR~p|1!;s3BwQ!wJk{`ecdB^+7={BqJ^1`o(@4r4}6ob zI`-4V;HV)u)-fU3{ {r%2I!I oc<) zJPmA%46jN3XqxgHi2 z>rClpK%_;CX+?XD$nm}*ofHgqbh z!e0gkOjZd HdQwicvE~+z`~RL3HXJ<*iTH9{hzA`o3cC7%#v&( 71!{W$#0&Q`&dJEgNK(se=3|9k8q8y|NmPB>eXbz1w2ZS5eyQ`%I;w=`Q(I&vi2 z-~yo|jrq$fHiox-;yJGA*SCBSh*u2i-JYUeRFF_@x-WNgojr3=Yh#Q3$!GVypO}xM z>1ba_DK3&*O1YnF?SzBX1i_@cni}`<{F&u$NnTrfCL^D#l^=Nx8VoB5DvL*qJQZbL zs6R+6PR!9m$Ytbg(X`al`5 GYU4_&tOOHnZ%j~Bb>{1 z&U_1 8spH0}A&qq85{ z!QQ1BDQ1*mKOK5`aXyHH-K_Vz;}HeFb2fh5QF}9vUnUFTwFPS$tQWV1;R=E2RD}+E zdmT-~6;)Fjf57q3Cr4U>v=h&q@p{|Re-`2foYIKi3G%8RDK~TaXfvh3X;%qflAL;iaJPmOdM_uCJWUG?$# zon2x&jt9EhzsGB)A+f9l$W$@aEG-3x>JJ9Fi@tavI(SapmUxQIciA8~W414D$?gaN zcWrPYU!N#5gb%@URVR+dUbKEK+co^6iQF=NNUyK5BBrzfE9oXCK)Ka&K833KK GY`uN;UmOsVL#~6=R-HtP!fMGOO>r?5J;ly1Qs(cCQR))Id>N636zM zM-=%H-Ju~L9yu)evFaXZ=$WK3_d4iP9u2o|$8q3!53WxW-y{UfWvEUhOLUH0XMMkU zd;}vBW&QPs&MID8C08VW6Em~8ZabvV%-eT}ZsPuNh?A_>@nHV&4S1-$q)c}~uN(ty z30P~iZZMgCt;#NKt$nO0Yg%>U(qGF*fHiSRONf9SSBFwi+Y=WhmW!Vxgvfb{I;2 z$>Gcwlv6o&=bi#ecCVI3>r}Zx-it$+GvDeTFU(zF+j4_LR$m`5$W2rlg?V vp4hQ|QVeJT7|wL%E5qloHXqhjA1Ad|f97KJNvb zSw<>k2lN_8C!Vsv1+Ycqc}|x74xLqPZ mZGRpUEnw*EJx zuO3rXb3=DN55B*9X|7AOJr*s(wW;=VV#IpOqPkb~>XhrEv~MdhBgfyZaccVUyWVQo zRDHpR*dL3vBPY6doC5&NUI{NJ-npW1H5tiTbK~_Xr^_49tQ76-+w22Jq?vOJY;IiP zA=bS!;dn&ir+UGs(_#KBNqocxmQ7VBza`p$563lh6$V=HUKD~6>U1G0UYQdfmrd7W z%D1~oKfSI+G-MUvJ}Am|Yl7ceUTcr)f{g~*ySdI^p=vKI^~&ne%W@ ZPB?UU)9NE{YwAv6Lvuc3oCBslM}wCeW&^Vs)ydiUv^ zyZslIez4~|k9z5b_FBDuQ{Y(~^9d4*fR|0E+i-KtEzg{emE+E5j>9M3Bvzj+8W*_8 z_}HbeVPC8GSWv$Q`<=pkCXlblu_I{>u_9cTFso;NQz)$3bq_rufp`IY%_t8P>!}Rt z!g>|gn^hM16+njcT?oltQl*#k?e%8)&81@koSvfu`aks7j+yOf_kHUf)vWw3)T8#q zyN4zJgV%Bq^pWWH>`CSYQq{~B@9W9>dWB{rX$8&0-SUFBfTWWv;{9b-(t|64fb`%p zB2ifyC0YbldT#KZlgZraHM44X@xp+Fl;7Td8w?jZ)S{rT+%94F6;mZtamA6&*ViFc z d<9?m;qws6*@6vV z8X0A@moa!biC4&~N0Z&?4L5%45ElSsH@_bRUrv!zkW^WA;1sU)E>~N|@FM=f@|$N( zc VdCpN-BLqTCyRb2FcU-vGZ|BlzQbMhrFH}zE>h7!$buh3>UMKej@nc3<$5H zA*2*LahuWoGSTIw*W~O-aKp88OVsZGbB@l+rYc2GcCZsgAHCe-#WcW?UpxDPZua`e z;(i|6;0(Ff&<7Y!!y)~lP-Zai%fM>iQsVJ!nXXf*gI5QMaYY+EJiQkPuR?JjhP8bo zlqqRWQOGuG%9YiH))+Hw;tMke30YLrr)14KD9{EqY#PL{f=@KjQBQN=7ZavOS_8<+ zxwk0nOYuOH`pD*AIWa_=GjW$Zx`}9&MoxpYkmu@#w2-YgTMhMhYbcoV`$z$oN|PQ3&!Qg*_T@&Zuq-F-IT3uJmcyT&$DR9 z&!}3^PsV;U>u-0w!<4IPs^+>Ja4%x>qH6jc Rz9=%4Hhw9*+p&C2kh*DsY^^vBs7a &fINFcpXy5Qyp&y?v*1r0o!C;eT;;FrmF4nz3le8*3AmqJ~KQAxC z#3jCSgn=Hrx5ZTP^^=OAkM;mne%oMm!upZ%4mp7oFzEHZV{^L7dbr^kj}&mgFt>s9 zvW%m+AQ37L-4h|-T8hZEy>VnEPkw@RLuaF+^e5X`k6XpYHAfw$6Y+icbJC)<*;Nkd z=&B{*v?^;(zc(Wm?vas*-qdP`1+qX>opP4hU;WslJxzkIMY5C?LFs&0sebj*VEOKC z|9tW8vyiup_upACRhwIX@qF59k$j(#u-=fSXnk2I;+f^V@B7}|>NhUyL+-lL?tS}d zKMYx}3ctLR^2H$Jb^kIWvF)2plNbRanmqZe$N47nQ_5Qr<%njNBK$qd+dY7*^%D&N z`KFYVApA;}t)%|-mWk)eOrKsUFNu6bk{WVf+_HD_siuwZ40@hEF&=lV#s2MlvX4vT zJY3P;$`L0rudI5D&$L^oon)gwgVM}(aOfnt5(j#*6YLy@JyK`&VCF5NggGS~tI^EB zG {=1dD5yEeruDm|U@!oK%&7j?^#9S!f%c}ur297N0uK#Y*`MMT=^TnRNbinIaE zk{QVWvLF!H5Dffr&nhcnobf$2`LBY6w=r cMlOIo3wi%R%`9Gcz#g?pe06FX?eb z(IS_>d4PL-ne^1mJ9kkV2eOz)MCN!EHpraq%7RaMc>J?G!$!JXgL(zl)}*~Y&Gxvw zxP4yG0A@Q;ShC@|mK4J&*iBTC2V*QGm}!gCHh08K108EjJIIXETJ;pwJRecg_*|cQ z^2z-lAN@#4)!MhZl+gq}oN17aHN#$t4ikILo=6Onfw`9|Px@O;6tAZ>HFYgM*?|CU zn2E-qa=C^f1^Cf?8+I~dY~qT&eXC=EEjbRx6c{X&&w4)xd!labaUJS@e2C!ZTeCr; zx7$tuT&`)iW~U$BI=}5^O%`Fh=k6M`4)Ds`Z>qGdH-r=cNVay3u}`0`|J5#{}2 R^VCNl;bo2jV*z`n{{@LYZSDX7 literal 0 HcmV?d00001 diff --git a/sound/items/stones/stone_drop3.ogg b/sound/items/stones/stone_drop3.ogg new file mode 100644 index 0000000000000000000000000000000000000000..650dbf8749754ccb386765551208e8d7c9f32333 GIT binary patch literal 11793 zcmeHsXH=6-x9Agkm)=2o?}RES0YV9(g(6*A=twW32qIlTO6WxhBtmF{fE4uw>7caG zv7jJD6bslz?gRL~=eyrM>zupRS@++aHJLTD_ny6<*=1(W#N6B43LpXg6npiP&bP0K zOAvlYWKgKPZ`cutB);blNyrItC&c_{=0D|VCIlQ^kaH4c)<68Wl0$mJ3JOx#`3C#Q znTL7{1o*n!9t#jK7En@9QczG+fC@;U(4G+ z)w6{FR3JnVDKHp6m2Cq6i~!&&BFT{FWh{xqR7qSa!WbR(1{KnZFlmFF9vO;5e>Vb9 zPc{G`1L7s9v#K|Y{U$WLImNR=D>Z!0)Ncz=rdzIRP(S)C=5Z0 QWuCPnE !xR4@Ai^nYJ ^IYhA9 jT*@Z;G+u%;(w0m8yQrPP z-gnQk-6zyXuzzjW@S6;Im5L*hHT;=b28g=r7AP)p zTzJCq$^`%*k@47z|89<5`NWHBa?_>8B;|8kae08u}+Rckc8v>d`5JUM!;mdU0m^ zMnzbYhLJz6ecnMDhe07EaVHT48dbnE8%Du(93;s_p<|M_!KnCG!+j8$Wa69tmpb{8 z*OFNjtkX)eR?6Bo);8xO1MLeVR_-M^FGjprh<&k;d4VJO-yQ3p$N|8hNj#28jC+RS zaM^V;UFs79{~b9Ytiw6Hqd6ibts jz0l&5;iXuBK{?EjzUC8BWuklm+U_xr&1#8m3o%2ajuAcuGpml z@3fM-;)?A$EX}_~j!*jSqV(IT>6@up5@`j#X(fa%Y`|F4PWOLX|A`#KP!X_#kpmAE z`IpG)RpiwJqp4NKbnj%1+S8yy!{HqNY5)M}&89Os-bXA^vU4bvIh3r8wf27 WAE&y1s!OzApFuP}Kq``csj0boJoiw-0s+}@YvV{$d-w9ehW+ZDbnlese zoqgrt#}{UOBeT)d2qxPxgc5vRO9^g!R6rFMz%UHqH6`UWAq6Avs2CFgQ&z|mmZMVy zEWOiE9TsgJ7Wm2Vf7XJ6pq6A{{lf+nG;Ix;hW?QSO6gUG>p;Pi l{)1LDH AvXK|_G|D%J|J1} z)YFN6BwEBo-$zh4!him8@c SC#DPF)q6I05P*ad{fgI~og0CZhCyCB6 z;ar3>N9qxb0G=)+M?^Nx3;F1HUvOS`lMJc#$(XB>KzP&LBs~s*3Di m0zL4RDP{h%BFzeD(xgm9p1U*qGDM=iSu9Rp# z3TA|>K`9|*aRn%H!TelAoj?r=B}op%^QnVBJF2AQ1~T9inC*FB+#hRfis&K~H_F18 z1#z5UdQ->hag^g=auvZm*$gpS1j58|o*-RW9!e90F@On2I7m{1LFsOlg@O4;IY
fcyLZU !efVIIne zb`S ~7W69Q^UehUo(Dkf7@g9eLQ1U!iI^!$3C^NIbfU)leNHU|@O)+KkKNZ$wpME@}*% zafATHiQ;BYW=I@m!ic(m5I775bv&2qI7J4pqDPr3Gw8b*6gV#llyQ 1P&Ag0#86k zg23S)e#e3^D5;Ynxc!nI?S8^ivIAzyO f+_9002vU%$SxsD4 Qd=4CfM=nK&aK#UnYw`|B%R2R%vDZMhBDw0KC8| zxP2`FLPFT$wXF}|0BR;KK}kgo7}GIY75D}KMyUAIRG$rXO|7#!y7~r22&9<>xV=G+ zPeL64LPd3Q;XE2sQJuVa^okzO2aaAmj*i7qhlF%71Gw&al<7H`fq@}h-^R+^+WOGz z5UsDH4?|fU>K N0)sGae1g_r- ^Z)TG*Y@WK0 z0-Ixi01vu{JuF(^=3psNrME}T7n`D&Wm6Pu+612?FTB0FYihguM(q`$|B;0|bfI)8 z3}_I{B+YN9eY>Kl0Z=KN((yBpERydP6Mx(7)q=11;%sIcC68G_ncw(1-MjQz>_UWW zO8J8Ti_;38N|}K(dEw5?HImc$@Xi(Zhh>Z_JS4WZZJV^Mi{#)6Z}5c;!#RTMK|lvS z+u@^Y`rt$OLycC^5^wVRyw&P#yqlTbm!vngH#PQU?Zoy-;(}0D2yxj{ubyVbF?}GN zm3**7G~4=^a`&Dnt(B|z{TQJG#dA9Kt *qDHlL-+QAx9bn-t#wGFH~bY`+bAjxN~OX>-t+UF5@&h7J!GCnT9^U^;Y8@ zi{vZU#z-ELk)O_!pX3Ns89^;h)3~5400wyKzN0RdWk|03G#b>F#PwkPUetXSqAlu1 z0C`e^VjNM1)m*7MQg)z> 0_DpfdcXc?h*w z<^x@k_mLfA8hPC2!=o&FgaKPj73}xNhg5bA%3a}^)!FoyvGuzyE>o>?@VGZqS)tyO zkL^r2ocLv|Pj!=$DSb!cJxUlngp}mRR-MQao>2;n*(Dr6ga696J~x*pW>7fQWG}|; zWx6@vvm^h0yW${xTkY9$*Pu3e|6@wASiG*oQwdh6!P;2LV-L4d@w00KS#Ga|M{k~r ze^O~NbqX?U*A-`em6vxk!9gge{eDtZ+*ZFi{F3aChWF1d{h-_RT5^s0&ZxeoK=M>@ z=@A~0l$X%_-UsiPv#Fl+C}enZKCxV%D;>7F wB)qz>AhZdAj50a z&E(a47(&p?H~&J$;LxO4m&Kc}KLa{oEG>45bZ{mnc=a@g+dZr#l_iur)4-BUo;LmW z=e^&*KJM^!OUu fmz)d5ZB_;NI>!$dPky8=;(i=#*FT~7xrWCr`FOY3)}?PbayjEBP-*0i zg?gGzb=&RT;$jv1k4k@#dRgGC3O!rn1@scBcp~JB)WEc-A$N|eO?k5 QpS-Ie6vnJ5XDHa3Dtllq`xgRC|q2*I&PptiL%ZVLj1p->@a=$*&f)v19xI9w>b( ze{=j&@`0RKdBiqGVTd!ZEvGJ7B-?8S+{Tyh%imoy?|TuaAnzo{o5wNyymoqYXMc6M z@5SKIi(rPu0pmB<&kH&`%gx_ %8sSwTw8dhRSeboKu5>@QX#9j(AB4^SDW^S&n_&d!^s|0WYVp1X}uhhScH z;vZ!!PBbX?;L-4J(fAd-A$V>w6G0UHD4ThR^inQUSdD9L=jxfiptSWnL%z9r&N*3x zPdnh1N}EZaCYPVSol_@&aZ^+C^W}559|}T{0>TBgsDVBOwhPFJp6f&7`LvS$LMHJ6 z99J= |gHwn1V* z4V6^526GKQDNW*fS-Gu{#9CFL>KIqdJPRziU1wsh|C>*c5{a7ER67LbHAS<|J%NPS z41TEO5?^?5O|Jj;>8I*?YWR@|Q;L?xd)Kp5H>a=BvwmqNF(m!6<6$pHC*sQ0%Y03& zn1$1s3J|0hrPWH;r{0by`@$U3^Dv(oaCr*_wq(=PbL3U1OeIDQbW^3SvvwJe 5t)GKKPAn_%i044pUqdUyS@Br@VGBVLhbv;S~%kyc{yr z_3*~lfYV%TRM$oCMs@`)eu#+JB~O+D?Wca7ozRJR=x6r_KcD8U1@cK7NRI5`g}dHV zk0k4hwygH(AsdBAL(8%E%bH$X%F}J^RoS7;gh6KcVoS@nV@92VCbsxg#n{{$1}G~r ziWKLZjIXSBkunsxeo7VFXDp=}tas@Cly6X1nR59O@!WTUkx`c`wddI`b{AluZ_rDP zOj3US*%_KA7p)l;aqOo7w?PTk`xBHO*5x~jf)ovE*$VVs6X8zUY$!DdPc&AnhYy^BdI5bE%1Owb|pmnllR`?DJ_HPIRk}* -Sa z+|^3L?kEdaA{s5{iH{1frm1#`n4730NMdc<(`n34RjDQLzMYIs5pmXUqdvc&`9R*A z_d#xT!jy++67Dh0H}D$2Tqx4Xj*W**TsEz^rAM~N0vS^SdfT?i3o%oc=S*48&OUbX z;%Y#WM8^aeOTfz8ZOvPwQ|{qHWo9pb&WR1lVe{??K|+6#i$^T=$lt09YQ5;T_B{p` zXyE3sI}G@^(p}@i2KR;Y*pjl#`V&868>nPFAPSKU5;Pv(B}L&*s}zZO6^~lqs-rw# zH5D;a_ZP8S)KeMX7|!v3WOCilviI8aY<1?PYrmsglNrj9fKbd{qPCPJ2SJ1?aWS>e zGJItWVQv1hTRNf=i55p~BK#awZ00B|mH5}m6o|p6W|ir5&iUrAT;tp5L%%fOV^zKr zUd*a*D86N#QdfILjXRH|*ENwFsO(dWXX1=j(Br8Uk0bVe`V0Nmw%2znshydV4xo@- zm2gBGb^q)nv}Qmr;4yMcB3+l?ZSFmV@D~R(r0iA#!}@qqk5` aXLqzMms=E(h*C+K-H|D)BlUCOj^q`lVyi_sNXa+X+MgZHt4m zf}bH=ad!*i)dFbBbirh9xbkSf+G4bSsY>O}RoJlI>yUE;O~!6FJ*$3kYc5%|;ko4N zDon6=XIL55OuFAzzNum-qt0+k$+$Sp@6nrhk~5O%YqQ%$m{K2ur=qm1T*JHME3c_N zpYpLq{%G)qF+rFkU)1kLDE19ko3Au!6FzXp&s?rU*%}Wt8zE*I1F4U<9d#i1DVw zGxK|5hKs-f*X1}thAlY#)Mx=uM-2V6x>mpgqPFKEQ?2_;mJE7;%1)&64kO!(CaB2` z>v=S7F!z}CZAPVE5%5Z`cyh9aLXDne#`mx-3CqG|qtiNUB{WXgB?cMDNIdOKlSnA9 zrtUW-Zwt6G-J&fvD`;C2a80=PVQXj3vuWh9ND {GWpJ(yQ|`w`9j&|0NR-_(PKH)j4?JVm1l zMM{AV6>?Coa;$VgF3$)hU@5((e#g??p^7`l^tYlrJgLS}I-mRIUHC^C@@VwOvH67M zk>sl-7&k2|h%>DjTVsJno^z%~qzr-HsM?x+#Y|el2rnm^93otVN?fj0&>*tL3dPrn zM8C(t^!=iOGHz^!3~t}6ej>Y{>~ZIgdzf&Ml)m`I=afXcpqTORdSuj+?HqdY9wKwj zZ#Hq0K0HBwLj#|jaEM% OAuL*3zj$@th0QsV(JMjrlV%&^MZ*GTE(JiJ2_MWO1 zRc6amOm0cUWn*86kej8m8?907yMzB7^J1YlX*~Hw7zM}x{ Ixoff=bn z{|zVqfvH^W@j8{Etq+01)+*L0JgX_mwcMqN_ZKl8UXMFY6DNkul$U?{IinvmEH*Z~ zaYg46*z|^sT%H1n5WviSkXeo|apsLti_qc^lng^+va14MJ 9*Bd9%^ znS5|Y19 Oe1iRa1$i6^!KDmuG<;&JV@fDLho` z=CQDQReclw2Yo*-lwDerahrR&X8z@2;a9)RYE(5Q#y>X~O7&(nrp}C&zp&au%%_J@ zTUwYDSzX(wjdY86<*IMa1C8cd&IB;T?QL>>H9wk5D$XQa>jF;8Cb}*^7S+N8Ws*aP zq7N(}+nycy$|Kqt+&OoU<~RMYskf5rdVOdb@Cnh1$qzRIiBl>!wO`-yRLfq6ay0wI z#Qj*$BHx>;cBtpBRKH(xuw3VX3p{-z(b9SZy7P49nck )G0Q6hH5&sGNp> zR`wWwQ+}?+oA0!+Glc~Vu{g*=#*^D=E17Q%2#Zqn+8Nw8TCjg+bQ_=}`9>qShY-nd zaHJeQb9mryPW?T;bT_% c97emOmZ4}x1zcZhjRdr$pn%m-2acjZRRhP*mR2~7JFZiN@#z{qdFO`x z%x!AfQBS7= =Wn}>QUKix5xthXVL`<2Uh1KWi@(_AN~_qQV>1HV1l zw_U0EHYL6`sxGOZXXql{(PT P;(KO&0|=Bkti3=v6L0s|?8@Qma@!?l1Osb`qaH z3k3xDMa45$%AEr5YXU#_Cm+*~r@~qP`epl&j7CzJ6uVa-BR%@y4zp&&_(-*#0w;<@ z!ati@_iN)q{GN{xU2qG8k;(;Vr*Q!?ARmC|sR7}qtVBGgxS4av6!!;p zX@8CwM6|it&aGP5AdKVh7daQ&IsJP4_W5w-bWlq }i!}k318Nx)h9~ z)1{j2Bc(0yCdxZC>DEdTtqYR WyAB+ON&jmjsmk zMz&5hoaKx`io=z>nDn*10d9!;z0e`&Ow&t?xQ>yrGgcb`j!{G5^uI{5Jq1%oYVTYF zL?AlW?3|hFHz?d-R2L-a(KZJ#+`}0&DshK{`Cy$^+w08f^UFnV;UXo8d=e!<&mI}} z)bEtHwS%QfkTTLd`iwL=I_BVR>KN&yK~?U?(|6}B8VQ7Y1c_0^!kII4)j#YmtEdn) z>sTCl+HVz0x99wj;zQO~mt?TBZ_ivE5Nf~U(9@lo-s|q~&?1fzJzcoz5`#g)L%xnQ zjQb=-CfP6PH+Zx{n6jqb2hVpeG<7;y2ClA*6!Uw-jcV^W%vs(pe*6x3Z>fAQl0w*u zE6NEg&S_>)XNmRjds>%d_WD|>K>sw?=h3rXhQiJ<1UB0|FSZBe&B{7e8$x7Lo}+m2 zafgdzVtz%Ep(Uf+RDcAG%P^pi<9E(j%6tZAuq`PNJf@gY8R^B~z|vsf>Z9Dd9PSha zA>O_$Tfipwu7GRB@#EcZ3UOc8JeGet)8c|=!I#%W@{yc^4??2+EV@oC27F`5zJM`# z+dwVQAg4zYaTDp@r+XKMGg0NluAe7MjFcDXX=k=howE={eV``)ohtJ*H&S{e-8jZ2 zK +ah9eCPg|KEK>I zRR!Hk^QFUK*?U4sqMj3y==+)~@2t5hQCpt2s{R3MilMYJ>Ze`rx>=x-ok-T$ zSXh2&aErn_Ll#d@{bVYQdk#4N^RQ)C%1~_0Xod7{#w~&mqRvAKe6W5;H;_?xK^`l2 zULkK{B)}C85F0P-Da^R|2VB}S