h9T%67dV)A7ZTuhzHw@8^nOF69jp&zR?r$R}p>ToQaW z$3O*Yc8)BZ>z~uBkt`sh*IFu~WVm(t`#+p3%J#n{R`PaM=*pLqz<>F?aMfqme$|*= z_n;%7_#tQkGHQXJ@uM5l_uKC$+sYJ<+%KK<)t?zRa~wZ@Qd<1NTVQ%C^$VAQ*yq#0 z59c4+=2uT_ZR$EE1unngk&|47d8)VM52%*DA=yj{ccM^zv^CtcZcSMBYlz_!`IVX3 zMzZ5K$f%uK8mOL`c*;Y$@G$Z_71qOVT0ik-EltkkM3!?$yh@7}gh_dp_c$t9A-a`w z%5aU952CKwEx%h)Lx^fRLaGv)3S^;bp7C@RNZzDD;|-njNg-;+n~?XmAD-f+LrLVM znSIoK9NqWxbtcuF>A9ceS_KR~sbj(`XY=KJ*4ea3oI2kt_0!CWnn#W;3;nu{Oo;+5 zhG1q&f*D^{SygJ7K$jKav0*27Ea-QY>)zYc{L?1Z=laK578-BzsQKCN78|P$)pJdz z7WZrc@%D5^`eUj{iwD7#y`5NKwZy{uujyz^MsF0AP7Mhn=8S8n|G*}9s~9VP`rq(J zU~ba0c^vSw@9Tal$=3SO%1JNzkk0?>nVMN;?%cyDPr z1z(cC4GXtpE1TXoG+H5IA4;F#FRSx-<}rRrM;m-_L0>UL`yD@>>nQBcakd>%3N*yT zfQH5%-(8=65cS%=AqeF+TF?qUBh1VIwfuF^msp?qv=g{Fp3xJ8^((RIPJQ7(=k_eK zPbqC;BaeOuxu&6|ur> %Kqyc|+%*V9;^K6f4(_B}FfHA|BWVr58d-=n5ny=HVNEcq(APo{mt6wNs z_`<3S*_%4o(QlhYmW22gukk`f=L4M)oNt$Tg&SVnOYT2NWtgtdAjVDifBdZ1B2=6} zjyl3LRxx>Hc(;|_&G@aTz9gjSWx@Ha0fK;QPNhYZ8TZ1BmU@o>vsm zoTF8amTx}N1nq*%Tdt2ox2t{ODyE+vOYK6nb58^lqfSmZ2uBl=YZ 4Fr;>#AHKhxC^%o6!dJ^A<*s6XHSF}SEIs(-@=>!)o z1YEO+CAlw`?!QOt{0f=EQq{pz+m}meaT?@xRBxE~>M^K#I=;r{y^66H*xvr}wBiW1 zPcxAlZ*N%G(T$>ey4bVeO>IFbPQQrU@kSo0Vi~Y8CB9gT7z|G{NO_82e1{n4<hg zY8pAF6xyh_@0M3@;#?Z%>u5 V&iL%La43TWV?N{T%(m5#0+u5vgdtIL|N})&uys$a`+t0Qn zR*ArCo6gt*78}F^3Gd~bg^~L0S7g4l?wZ2*)8QyeIGZYsV>Jz4qR5vG5n-wax>CCH z3dTt`#TiZ6oNZz|g(m%RNEloKXR$I?p5#4qK !iYck1%y4yK^3GAzrmT64lKuU^0SKjrhq;&{1YqZ0nY3LC_GRIF=}{( z*}3! 8`u#JilbkoR5 zFA>xsnUmEDwN!V=Wxw`ms|D|V?dnsVj=Z-sb8*#3vGM+qv~Z|C8}kiPHQ#eoZE{#a zZW!}J@-iB;!wH_@A5n*{YTGX?PdqDzGY{|$SX$<1sU*uaFa8*F>jYgg)X6BTRMco% zfYrq$wq<_eJ$Pd;Gq _Jqo-pEo zMz>H2@yP25sSdY$EOzH&dF!=P>S!#}#~Z3#G~%-%Pixpqf3z#O5IT rxDEZ#0 ~ib_NOXj@gH~07wEczt2p;uQ=jcDS1}P^#}W4)-xJE88IJox zP`T3mn*` ORrr2H*3X|to-EKSPMj>Yq2}k z{`gnj@(XY7M_}HOs1xM!tHoyhUF4aive8+BoYv}PMD}Cv{RKSuJ12?hA)ip2_7e-7 z=i*`xGN$UBudkk2XoNaH$Fo*Ll`Qw@ut~%te74ahnTec!+2!s?(y3~xKTMu_-HxYn zR8Fv3o3M2DMKEKtlQ-LH;d<8)a{#SlweFzqd)Gun_gcA7EF=@_5_Lm5Govm&r4QGM z;Tgx-+wB^k)sCusTN<*)va2X}=0b5!PS00f JJ_3GQb5_hYfU!_cw0d#MwW1e}DXyc?D zvW8oJu>bZ=NXt+aEZ$=HpkkNAWAf`GPT%fKEpf63m1PQtj4E}Do7$W^3vyrY(X2QK z3s_quoiMEZX+ja1W~oMv(cbo(^g3jxzfN3NhkaW*Lwij^Gd(a8E8F48nsMx$4!4P1 z hch+8H}3@)bv&RkNF7V=BwKz|eZ}sIzlEK* zH1oUr{C!bSRv<;@PK&A(y^G`xUpbaT0Y|mwm43?i-Fe;`m(L$y0zos-q4Jh@-7&PU z@ULz5q8y0!e2NB~% <6M9OMoy&odIR7V>QG)~;y5^2LJyjjz<&4o$8pmNx z&Cdm 3LW2q zZ|4o8l1z_PQV`CIch)p^de5rVcJ}%zquKGgwMk->nupcw*C)(vk3vot#?H)%XDrM< zB91>QGHHtPIZqG4p0F=a?QwCU|4Elo&-%_PQ&-=GCi&{Tl64@Jg8h_x4*qEMLVldJ zpQ=bm&iE>$Re0O7?b~$9?uV`Q=cfKY#cKbkZ@Uf8`qfGN@(|{Zu9R1 t!&&-VM7ynf(|9zeKnT!`{;K2m0vgInhU*aqTt~(-{!ok=IzZtCc^R(d1(QG z4&DRtU( 5V{qfa4 z4f8^xj{OKo 1{`bu(hZCYb1`eyV=iPJEzn_6iBWpD|Xs)AR^ zLvL5mp!{wX+h#_v-Kwxn#TBZ!74dLE@H_wLYcG=H#Zw&2UzizRz0B4~OnzS2&7?Fg zk_M8=g*g04y>O>YTsIc~lR|)ozw1dn^1Moxauz(zjUdvAxTap7CFNHtl>06(;-~bx z@qjDg10F%9xzoaobJ?8Th}mFy|Cid*)>kxSd7GPj&LqE;-X`J4>>+3h9(hSk`d*Il z^#*wFv6&fJ%ZPwh3{@*sQd&0U&{mU9GS1C|ur^a0om7k (mm%Gf;P)k_&U!+Hj)Pq1~8pfO?G4w0>qL0j Whi{4*|MAq2&IUjaB9((SERaO8J55=xDVO9y>|f!R8PitE5mf4D^hG!n!1E z4?icD_IFeP8GZasBr&aW7%d$5B{F~NasISDBuIom*yV8+I`5%2?)-`~l+;pONI~s+ zFVtjonjb5fj`AAil57e4yE9{x2|~BGYafPt0Lq3Un07vjZ?obdU#aW9NyUJPJg4 R=CD(Pej{HrM|143gMu%l;vtDP~Bl1x~ z4y)}e+Zby C7De(?q}ntpZF$DfskQ}*h#E_>O}b1NF_jg5a6%?Evl#nzQKYwPG!;X0hN z @+uSv(4*R{d-&igYUX&OnQCWa6YwhM58 zN~m)rdRB5{V)862AR%Ut_IXp0xYi$bb^l$LSTeg!*3>+O_me4Y1C|pZJohS!m`{d0 zwis9yd_Qgd^l?y4SWiye1Z4$fluG>c9#3P<^AER~tw2-nQmUp(I YSo`28swk)OQ>=1F)wrb&MBVUNuscbk-wtY%3k7-B!zHzgi9W2W*hLHW{z z;7;@Hgtg*VM*f%7qBvgt36qM~F+Ce+j5$i+2rr|$OW!wbFzA4}v2uRJ>Npj*5K#h0 zhU3AoD%DSUmuKU=3O`*qar7>zTzOEfnIj@X^06v%kK>oXC1Tzj)Uq?gc^Vze)p60B z&fOTB)Fa}c>jlyh8;8(Z``EM_&mEC_eeyZ|Lu&r&G^|Wv=iS@yxv5-qO%1rrGk&@) zT28F{d5!zGL-0$ScpGb+bTpZY3=UFUdL=gZ!}7wKw#3WvRVf~+25jb?`;NKI88knr zAZao_Hwpg|LgyV(n&O0kOK$5$oGw;Us613vESLD}NaC~jIQ905n9h4I>oVbot(BhI zsd}>XN&VGsk~ir0w5{XoP09L8?d)vTWo>2hg;-nDu0Kqbo5_}lkC_GvTnlnp!HX|; zv|dQ Xb6gJL@_7GK-mkVhz8x)8&Bs)DsRr$k(e*CsQYVNVw~Vv z$heQ49gVDBkFE|rY6UEQI#TK|4J0V^4=(@qguAYSodT&*9x{i&1AFvyxIVjZ2uY`f zX-c7rY (gDofg8iUwG3}~2{R6Crpp_x_5(-^r zesZgj3uI#CL+MA2#vbw_$ry4=p2uans~$DZt?w^hDYg4d@K|N-M6~!)6rQr_Mp{)= ze7Grzl1mM^?5NI}h+tP`@`;^>xj5*f1+qQXH8u5kC{TehuH`H|HN NnVB!J6o~UjMW_7vhb3zr;9yNjQZq}lz|D4{5P^tjCBUy9Y-=F@ODFi z#ZJN3KT`@_!_>q?HD4rgJ-9={@aX_3$u)fOWmj_$Y(3o<`9A(WY=@$7rA$Ipgu%7s zPq!&HPR9aifJ!pt6h=_?p{-h;Gb+x#ypb4@HN_%lKK+w_Snoyx9=Ky(#;k4<+J0?# zl<3(O3ue@j2dhMYvD_whP(YY)pufp%uqS{Cc5D;7CplbUrTx-U$|*V)D 04bsJ13yVWy^HSxY`YcM`6p$Z3^Hw8lMWpBiO-BErp{k0 zvsGhh-6O#v{=?KDw5#ILkrvvjzNqmXCgRYMNRD-a5$rnE_;Q1amnDMKt;sq(X}RZy z_Lsm`lbip|@6+L@jcwJCs*O?^E1%sqZ^~CCki M>l!j)HY($BM-k}Hfr%>vV3Y0-=Lx7>II{ zeFic3N>I|4 +T--J44rZ}lNrs^ ~3fZQ|5WG;C((eSK!wtX|}!5{U=2Dg}Fv6YB1f$8=}_U (wcizYIS%Vs-x{fS08rFSv5`5_~SzEF~ux{0B_5OzoOUUBVLBFz_&V^?`MRF^< zliBQ)G$D4Equ`TRmm)qK`Y5=y5_MReuZaA+qd=COR_y0Fstk|yQ4*x!u{z-e5ph#2 z&V1k6TH@*Lh~88G@G@jtZQG~#y2R)4*6PFacI#Fij9wEH=`*ji$E!@gjlRsOc}lsx zW_Dt wmfx0<=4Dmn@U6_uavsu!IRchntY;? zBtMIuV|!!PeApvLTpHuiAW)&rc$7PBe-r!j&p){hsZBfgEuAiiB@DS_-V)I6eiSrv zmiws5f!k`A_aLNXTib=0ns7i=w@_G0rSx QP$AbG4^pZPwLI%(Ssa=xf+tN@)^9Dn}Fy(cP2Cu(b-R zPP|Rn-zfRS( IG)1#XVyxem>vd?(r54^X ;U8%GgFi-Og9e_^No_O!Sjg zRVu`hCW|?1e=^wTaZm#fO-NP?mz`5NHy!Xdib>2qZ$QyxDu-jTEi6!i8D@z`${Yg0 z 7+!LnMA;t@vk81Jn%f$*6~YRDfnYZG65J>?!nn?W-(P z ?`x7~t%Pv*4vZS+>0zX{{ zSJTE+Rv*uBdk#NK;L5*<@^zBauXOWoaaz5vS+%xelqbk=wH>iRmiZ{3mF8?tW9+R| zLn@=tiLE^PX`O-A4Xy>Jpp5fx>ViJg_p#>~{WdQ=-nZKv?D{^&+9dm3F04s$bhO{_ zKp O=t6{+gjM~EbJ7-X z^`%A>nU)~#Is-isp!s!F5FhB9qyT#3eUPM*P=E^c>lw(RL1>#ze#PrF!yx{OQp(tg za2OYs=zzyCT}PRB`cg2n!bZ_s$zc 71sC;5L6-<<=UW%T{03pDt6 z{4J+(OT5|2cZR3c2g%RQntcwoS`6yg>Ey-MQ1{Z`=f!m^Bv}mo*g6ZH;_Emv{WRSk zd(v|Vv3Kpb0M9STT&W`ZV@nVQ?t-f8KM+H+wNnora6l%C1y &(XYSx8` z3=pcmcMIls9koiZZW;d7m>|c {41umU;=IgCCUD{$w@9ZcpxjtM+)-2NT|wraeSU<;5=+~lvGJ|kmLIj z8hev}*`inD;~TAayU%|ZjeovRC-8KDA13kCT$HJhJGn!q6`S#fQ@Mea>j+xkV}t4- zY14bm-n0=C8!X`UW-&FetDq{@>}w`c5+m7e(c{b8H}uo2=Y9tj+=M%Rf#-9XDdTUj zl21i?Oa1okda4WA^m><4NOJd@%^Rq;lYBBZnmjRceKk-nzo_dtdCr(Ne&aE237Kuz zjkCATGPZ_E7-^D`ZuH+6dr}H(y*PMoIf_WrtZyXmlIdWK|E%#Ud_$F|E`dN0HOrRM ze#YcNTd$ExzdA_D+~iO&RC_g9 T^^ }>2ffPgl~0ezrFJIM=Y9={ew>!;LrH!9)@kUJO5?bG@`F)p9q$84-Bz-l1 zq|m0MJO*~pBO~eY`1&6s?!ZK%H@$27bhf3g9Dc7Fc1t^lB*$s`y}oyxywBoDkKq7u zk+siGREP7%(q;MI;PDYl)(+F>6_0&IN$oRWGZ4=E;Aj!k)=L2b{uy9v9WH)yvL3+7 zz^YYcV}<+C+`2H&P33&l+NUq~CH6ic=nPLeNrAui!`c{f29=r7Wo-M?7urA*@Gvfx zn%4M2iSk1-?o>V0L(*aOi`QD)gkzUXLGF|R%XHWa$De-b7jEIb8NEj~^NQh1Lc%l4 z8Z9N=4(YoO2k4-`|44vt|8ltf`@sf}<^eh%ZygN_PF2?9bcWLn Th7Lv+zI}yL3 zgr?%eb7s7@v@xIH5~f@Rx|tV74;({(wYO8g!nh|GZFWfZbal2#MoOQEYlF6Z{se5T zUsH`3f7H$go)fXONc7RAulEU?a}a2?k_|}0rT}>xk?c^KpqdZPQhPsle6{NK&e9rG ztVU%qZ7(J{K1|MwLDAVcr8_X^ O#%!xwZMWIR;;ld b6$0wjkW0>XKn@Sr52{ybaRAwUA*I4VfHgyB3dFJ`%BiF^c@S8%y@mH*VUvinI Xg9t$QcOP30H^0Zqi~2W8JOTY5itR`9 literal 0 HcmV?d00001 diff --git a/sound/weapons/Phasecoilengage.ogg b/sound/weapons/Phasecoilengage.ogg new file mode 100644 index 0000000000000000000000000000000000000000..a988dc23785fc008144a45449366fe864c0a69dd GIT binary patch literal 14739 zcmajG1z1(j^FMwm=>}<}8>LG@LKH3~mym9x>rw)Oba!`mgLH~CT)G>iyFo(vAN2i+ z|M&NMzQ6PA*=Nqq?#%AYYxc}pE(#_lN+5X9Ki6lXzr>sDf_*qjI42vZftmed6Wp89 zf4Vrs{UI9Q6dp(Z`+6Mt$mu3?-@$qF@c+B|5&jC|0r+ZWwx-V&pe9t7W(KN%#8XLA zadB{QaPV{RP%%M_jT{ZltWBsSt)0xEHr7_g)(*^%O5l+G%3v0kP=y1b04gEVaj1B50HVozL`Bz27V?+o7A%Z-aP{VV! zq|Ju~O^6x8p_zha@&W}^$ia%Mf~emw84RuSYw|6uhneY7Fx8PjfPqA%sQm~akCj0n zwLdXX1&~Ags0&h|Xe@=9-e_EXR6ep?ySXv)Lc4`I;X->%HKXF_>^0+HS ;`5GiODZYLsQ{Ow_6H~987IdXCwKKkKg|Yr^#(u9SwHP-KYe2Vf67nymFvgy zXX#XMpiEl9_;u!N8q(|^g4qbZ{-y9Bqeqiap+?g%N9RcAe>5*QOQ|z0sk0iaW*e-= z_|pY&F5=^CK$&LA`Ts}xs2*?p|1P4YeJmhRz?Qvs !!03-^HlpNc}* zx}iMp?0I_aUjgNv!<+tC*`W(r?0-4o(d{6RC?|Qh9eF=s4G8-Ll=p+Z@Ql6O3}A{! zi~R4G*B`t93!zT?7;o;0!X2sq$1I+JSmG=c35>s*fDVCK8&t`o$>&3YSjn52MFc4m z9YM+|jEzN!DStd@IZUz+_>y@bsXH@iG}(Sw8Y4OHFXe)lf?QTK4z!VMr(*Sx=mY)C z#*>kY=G1_(>Z8e9g^dIN6%?DoSlg)lSKdFcDAGwC?hsr9Mg+~LSTv$)1JsRC>d_GD zW843Pk0{_b{aNCkG;b>R@FxZY)cMpglnxPCF`1lw%(;|d;cvl3KJOtUjCl^;e^yQf z0{P g_{1c%A%mqMH{I}yy=tgiU#{R2}oRTZz(F0|S zi(QFZSVdXogOindg5yHHpZ2Wd%8dKUOqec_|NjKmzas|(1dZ>Xn2a?D)?MyjvYa76nTFXolG^I+&J6N8IQs_<X>B9ELBq4pS| AB|hy5UgHTB<0&WO zxjJLbdUy4@e*)%j*sRPr{#WEYh6s&d__|ay;(sD1lPUa%Ksc>*G@W`hgG; d3o;Bgw@I?lwq>rPu~C;lT!j^K|dK9!j| zUPT8LMHORpWfgTNWA$s557X{409Q$Fj!;FVPG#=WN+sTX%|S)`gYn$8iuzLz%^AP7 zEB7_xN69l&jsRDG+E~BdafQh&*~~n 6*V E`O>a56fiuc-B2ESJhR3Gm*y{K`dR#b6Ziq&5K0Ib7G z*EwDD+OOK`WqaA(03cxer{IVUc_T3Ft2G(W)^pDKT3;YM&m nOfamjwQHEU<- zzPO@_yLO!M3ct2Gk@X6HxaLe)cJW>l%U~Ozh;y;WhP;`BTzi2JV5C)-p}QOQU89az zEcDpj39Vl_=2T#y_C^5MfP2IS{(xu}H7mTQ037HE^)`VL4of$c0}f=5Dp#5F3AMdE zxSKroJ=mN&c9NxsN;zD*FEs`aY|0!v4nfY!dk?nAik*g7ROL?^98%>z1)H(Qj%%0~ z^-OAn;u_*`ZRZ*dOQYu1JTd@L+nKpo;^4eo0vRy7DhvQ}&bXLVQ7)d6bWtrJDlhk` z44AWyK+~FYnj9FBi>E2g+(V#b#om)l+d~D2>VH)JN5^JjEFdb$CmIYci;IT9Qez%P z`GkX|nd_p#vcRms;3_|eh9&28D#Vf(m=z!@8f?klqoFBV>xiR){%2NYwW=28Wj%m$ z`aEJ8a8>P73v13TQm|Rsqw=Eer<&n_awQAi{Au$?hNhM9bh16TY +KrFp?o5wOjM{mb_P! z8l{gqWPmq>eMIA>DzNK#B7j6aQH?Vnw~)uM6$^w6OPk?9VS+5E;xIwRBB-o5GqVaz z428aSSdf{yds+~MKJTdv3wyV!1v4|S3U(mx_!G8I k;ouX;v7J)pb3rvOmK&s2iO_OeX&@2Qhl(*Q3!!)0PiZ8AW-3m z0}LSF%klxLyx8$a1_ZoI1++2eIXp6AA!r~Fi!G25RVo_Udq-sgdnP={<#Eph3nFL5 zzGd#Aij9T<>VPE`K`{W^b*nxyVl@t^0BBh9I^h7Y>d}w@mvyUIlvC$T8 `9~ r4b@{Di{S zpLr+O7jRFO1Xz%X9zY2*GXNhTqGL6{N%jy33w>Vv xO=KQ8y{_p#MKzNQ9}ZSg 4 zZgMV8PR{2{^z>Xjv*S~f!&9@f^Ai)}3$vpmL(7OrGG1$0^LOKAx{h8LAhi{pUD^r# z+p~vP*q`1zyDa~Fo_O~2fI$e$&SL3~dByMm!S@nOZrc;*lq`}y+qJxnwLq_6WvJ;Z z)HQZDsMHi =W zUXmqPzyP%%qQU$H^7C{>Xx9%!t()K^6AZoYKa5fOjN;_al@MZlBc|2j(}vO_UzoOc zWQiL~;?Z8dcGi6f)xAaMkJ_yOxJkFuwU5m8Ne_R>Vm#hX@darP61 zxjM-A(ut0i!bq*96u$w{DvBGV=%5qkR5?yO7) $K5)lP<~@+7MXi!Og cp1vj9sig_{MN2xVg7f^Gt9}yyX51BCDXvj5LLefH2L*y&P3gj+RGkX_)Uc z#$t5mx?Q!a0A<60;L6RH&zJY#emD1)xqez#b~d5lvT+R8QQE^p%Q+Z7TRdjNSlq_H zk-Ud0$h)J>8@oM)O8I=eQ`(`WrPaq-Fj1%g^UyT)N{l`$<$=*&*4l9mzfUTx@r=y9 zrq%m+-*5-Hc-n5wu#=y`r)wdOAmD(PCWoEMN|oWmt+q q6#+CS9T(oy zUkwxe;dJuhnXLK@f^+#p+x>Ck!|&Ew&e>`gA?`2@zNlIi##-ck;`yI@g}vRY3W07l zbDzp2crhKyjgw9cEHi@qw7 Eu8@h$-bshIi<%Nxf z{(0KsjM{`cKg2sWHvc_?man`ZkvnyC^>mF_q@r}L-7Ep+TXJ|qD$uGn^Sv@Deh(P@ z+|W0QMD6%Nr1ERNg4NxgbQ>edYpY}7;m?ixb@9!}My)%E!gmW3Rko-d6uum^`m(ie zhi$kwzu5Q3UVn|qE|oHVIus1`IMqoo&JOLgzMhi*z!j3i G!K7%n)^DY@U? zoiuK|@PGO(iOoj+z@R;XIPNuO@pbF-E7B0>it1&oZU@hngQemE^ZX5$vskB !9 zO=GjiGxvjEu*3Nj+t9;VJTRA@XCw5Nyi&eWx#`UuOnh2<)Iz_62oiY<>v-A%r t;AZ>^t>NLm)_uBe-(*(_;TnsM|M^1i;QGksch_$oN1wOW-aC_eOQcsw z`jkQJ2OV9R9XPL4rjxrXcg;wAJXAXlTal?qwmvIgDn^}Xyd835 3t& z>(*_AtoJUp254rZ;RY#>Zc89+l*p&3m-4z{8WKF>#d#MK83e<30}_O@^ei_Eg`cNb z_bZ-%wWic$s#UazqVD@%jE=~A+kvh#+k45O&R%7w^sOQ#S>Pu7ebyHT`Zt8X-(qYi zm(_bdDK*I(PqKkGtgY64v;8g!zS4PjN{+0e; 4b^ zVLPKG{UY=*G>wokEK7amI`$inFS>Fm;(R{YE#xZjGCFBs7JQ(ldsRi_dEH3?6HcA? z_RQGX45U1ht`2Z>-CJ%i;j9_@tVdFroG8qEB?5>J8Tm0ROEU8y-^9M z&1DjbI @)zGqHv1Ki^vi5sqZu5o5N0Gzyt<}tg zEhM^!weIK3O%zC=U;7K;>ql%mrHse1@+v6`_<_D*=^6+DH;6%sC0J>%!!hal1l(rC z$j74?(3$V$EKlqSm(9o=#AFG=u~QOFb+2_c$v;~mDzdV>Ic`94B< zQVrn{PPkI)-<-9X0w-ysXS@w6xJg*LM1}BZ%O#-gGaw7 z@TH)G(XTS#LFqv}HAr%xh6pWL+`@-vvh!77zRmhzul$hsed)3Qi#wXn-3n*?)+2%h zzYL(Q UGm_N(RgQugfpyTYIcLwj! z2|u(F|KuVu%ERsxrCSZ(3Vvy!k5@HOFeRJCT@7nvm@v~t2BFp4n33UOC=!9Md3V9J zj_`i9$%n&dW`VSZh&2*4y(G11?iNAy?kby~9j-H8Vxk81FMj(N=uy}tQVm<$$S*fQ z%lle-jrj8C$3)HKv`uex$RKE0JvO`B*BeyBSno*Q0_v$th(~wP`H}cNdqHH@A3bAR z{wD|H-RYoA!G{>;XO_QSy7}V!8)tr=$qsK#Mbr-Z938yOY9P<*krpL+tx4tb@>!DG zam(` j`OU ziUEt7j0D!w?#Q}n_8}5Vh=k)iVO}~{mgQW}K|-MP OHp z>p z=MiR~-jJ&HQ_dO=GVS;$HubkKyU(=z@*8V0eJ^WeLqi8z-a9CLJB|UGz|W zy8leemC X4!3qK}uqIl5zzv!Jb?)04BSEp1~&YZbpwE)XN5 z%Dc*Ef5S@tqQPS-)KgcRk4U*NE$}@yVpp5D6qbp`1E(=$nwJbD!g^?paR!%zY&~y4 zLC5!ijkk#7)p}y?xYs9e`E;5Z0)>?82My(C&CNEJ(7CO~k(5C@qUGrHyVrlEz1r zqp;#@pQ5N_aA_>|{RLyY>5E&%+xYfQEjS3&u53n_1XpuB%k}b`AZ_c~Kzx_7aF1}> zOxK<7#-i$Qi`K7Y$q>^pc9hSE%YNtJu^-g~e7|_U`BkUv(Qh9(Yo4ETs7(sgTE}Br3EOtqgc {X|h(y@Z$HZKD$-WFNvJx#Prf zT$FoI2b&4HxBc?qy&k2jU4@XPI6h3#8c3>pgkW1^Ayk#>>0P5)N>4+M|4L4Rrd;ov zGRTAM&;VSCF%0Uw+_bS&6BJEh$kEDD sTZ*Mc-)6qk{wJhkcGPm9@%AiYc*p#gw~Cd3y}~H#{`v{rq^8 z^l7T`Hf4wMfojm;^i+8Ymg F8J3%B$p?!n`g5t*3fOQ5H4x zFNG|qNAAY(Q-XB%OATaev*8je?yrYXm^oE-YYDkLa+pp=`rFep+V0J-RI_c8^LCM) zeI}k!@$Q+~>Kx*^5_^!DW7zb=y|EP*iWLa^DT-gUe qL=libiPdWN7;%e8SfYig@b#Oa;bHd$Jorm*}yIK6_}O^c~6U)D}Nq2 zpwB9)C)H&udX*#mzO~FmehO-6GcfB>kjhmdl(~r`Mr(QLYVUaFd`sAm^oC*N3JG`hoT41$fE(Tu# @@nv0#uIs)AK&K=8dIfdgj4sT$&ufx2!E~$G1*Yk?K z8`^sL{0b=NewHrW^;ka54eLZzUU88z&NI#G=#yldIn(>8Muxr3-LA`_%$xe&(0k&i zh*Eif{;?H@JZCS6lI&0~G; pwAHDlB|X z82RB6VUfI<5g~mMIsxZv144gO{Q uWcg8q7UGT8xd>^Ay|{>jdx^0ec*u{%8b)HJ z+P)5);Wau`*PKFHaw=Kha#+7eOT#+gcdm5mNRoanXPadb@BTwGMkkF}n)ppBvI6RE ziF-90A5KSk`{kS(vV*OU3KuP_VL}*f1oA(}9`XM<_CNs0{c`*${IQwo@yXT2ndODq znZ=pK`I+gt^p{ppFjqHX<#Gl+f@y@8>BOFafn47kG+9d52g@&eKP_}^HqJ2XpQ+z& zb(JA*4a8itSA}LOUbdz+a =fP)0hGz!)eWq@%$&(Z&za@9loK6i?qcdniY(BsGmsJDnyUMHlO} z9^G8+KX<9m2Wn%ra>YUf!I~RQII7?WCcHT@BM58xs%5=;1)U=f-R1l5%)W>$YHAa| zLC&_9{Lbl2_A{05Ew0=}!LNQcLwR8`*6^=C)INkZGdiV*^;#-#kP!cDT!1S$rOtYT zB!-gm)h<%-jzZq2@T 7bT6 z>k@p#ZL4s?9d`d7x%J`6PjP7ac?)pKvCKVRo2;ZMTq|7?1T $894US*ji-kdPKPWEIxMOWf| frzns!Iz6I%WP0Z9sTVY)O~Bs_Z^H zN$8+8PM+J-3N9qvUTtNzb|yv@XPVwH&5PZmx$xgW5MgD{-;S1qBW@GQiHZ Aiv)KA|X&aVOZUa6S zND@iZ8%K_!wbFY-9%byPM&KV`{OSiugZW;I2u7wB+gd6LHb=zo#HQx&j>^5zQ$!%x zQqE$1VlRBo-Zt4Jxe)YK)+EvabO8s`+}}@Tmb>_!?J+&om#PkDds9 3AnwemA_etb@k#12Cp_3@D}5T1Y}GaI{2y!EDCUhd5& z8(F`7Wi^_IY=fqrgOJAli@IEAD@QQ#ijN=zQDvOFALZI=N`hY*UxTF>c|&t$5>te4 zm;GhDEwni-zQ+54hCIrrs$`0VdLwSj7hh4pzLktSnkoL|!1F`%jD25d#dNR`C4U1E ze~FwIrQ(~9HomEym-xvZuU+{-9xvsfSOg&1W^6LDThg~Ujy~&-pzJa=vp9PZq@y;u zg5xx+Ivhv=|8a!EYbz5T{-k_VR?-QsSIQkO3p&&l13slqrh*$ G_i9bjC)9z3N5{kkZl7e1Sjx-DxwfHrZps)ub(&CK!ozqE% zWDfV0dR3;TY!&L}13LEQz=I3UYYw4Pyz23bi~Qv$@wW&%FWJiz$k2>rVa+8e!4>xC zmESrLPt0ZS(Ofj-nQT{Yh#p!~$JyPABKQVxwFSPk1=}jyPC6S#h4z}OloBj7Eab|L z-shAk!Yq_?DbWZ`)Jaq$Q*fl~%y_c5(Kc=wwZ=o>=>)7^_wFltE3S#s-c)$;NNHTv zVxj*Q2j@H!JL&xX)7Ah(y;5c2N#}aZN$ABh=}A>L6STeFUNQR!E18^SSkho@>giEp z(b8GHeU`_hnsmQ;ie+1!vYY!H^tXnmDs4*c=mp-YUm!h{Q~gLQM=7&SDh~9Ug;x)Q z0CZq8Xh|h{fKR0_xA0k|MD8XY?y`Vli)Sj~Ue?n8M74J;XShbu{AJ*^4`IcRZ)3yn zpv~{OrB_*_w1v 5=z)9$}E}2Z$ajJ_=!T6cXeGOvQ z$%i!}l8WvZ!6O7HBvzmH7(%TNr!tA_toe0Mikf@3Fbhips~7RlZd4ucHYw+$UzmWM zB&|U@=#B=#wkGfmL}Ysla@dLah70+@C5c{QnhzO#d=&xB{affO4_3OD3SaQ}^tni0 zUADw2D!F>VeW*85){r;)K7vM|khxUDvr89;1&=E;km-E=b3na-B2yZ9THKYAc$3vr zRskX)oWMH7arn|}v42!fT;ADMa?=5ks3WPm0Qwa(2RbzxKAd;bkv*Exa$Wu-DaSEd z$6Y23Aw|wWREHNbvSsvA9&xvrCbG)`!JWM^zv*=ze@$*o%GG-OO|FKU&(Oq;Nb)7e z@%*a1_M*p^b9m4)I=f?V2i$7f=7doQVo$$X9NM;nDBQ@z=fw-pC7%rURohv2Q?ZKe z!IZd$Px)_iA!mkuAP2hb;AT5D$pn5T-` PrN8c>XzAWjS|(u>w8 zhA-wzgFjCPGCC_PTRu}#a=#dv &O;I1ND--jNH+o1dea1}SVd0o0!nf(!zg7k# zd|s6?Lv4bx)r{OSibBi(f+@agiQ|-aTPe9o WBt;ZZ!#B$^=q~uH-_{SZ`U&SoFIt2dUagGh5WOanf1{&mexp8JncVffge>tFs zqenK95wLyb;xO^jJ~93HK{LP-V|^;6GbN@(<##gwM1g(y8k-0&<9VGK6p{B-5rme` zR7_f-ZbGPdO!un2>z*YCS<6yOdj7nwg8zLIyW)me`wf;$emaTHWrGB7Hhyw4uf%A+ z$|{w3n;gTI-9YMZtcFd>4LiMZ!TKEKis1Jz#5Y3 J^<*%l6ES&7s1?joaWe9?1Kk#!OJTfMO~;86ZRHgVio#TI%R;;#gG1oq z@bBzMSF^`5Im_B=G}z I^=JTYAw8}hpeiOmmc zrR%qQQ9&nX;Lz5M=9m}XsUe)#wC>51?`+IsgJY@DWqN9fvJAtg; ?Bu zSaVNa&gQfE^t)g3B`tQEh0*E-W=8Qr0LQ-3iNESa1h?;lWuhC;jULjiHu*CVm`j5G z;AE9_0?p}k9PceXKU~A1@NX7I;M^zJ 8nl8V^`O2xsO3Nd+Y482 z>}4zl>~k_=qC6lSE-OM#$^`A>+wq1BBl3JVQ_-MKqYL&b*_x>TP~hGt$eGH!R9Ewr z8^PSrzw&y;Ej5*-L^!mwwZVx(Z&C~EqZQnW5PFi2!vr3>a@-G6 jAhG4r;|P=UN` z$T$~0JJ3Qa8$;sG3g=i34Mh1;&J1{om73h8XwGjFz2;QaR8ftWQTjH5bzf&nYFMu| z2$RpS(OjmiU$Oapxdc-+z~Gg(F>2NS+MX1}@l11ra!vivx~Q`(FV}R$UTsoZU*TL@ zc~Zzi0|%EP-obkwjbWRwXFb;@>D}x1$c_V@7u#|EQiBm_x2m4?4MJ=WM7z-s5{?F+ zf L)Fhw7k4uJFcm1iK#V zWzmonx7DR=JdKpyGumMX9|iW{;2Dnjbf-DcpR)r*(9VC(4jz9>!AEX>ML03_?OWsb z*1_hzGq`_WI(MlMY&sBZ#x==qEm$G+kVlK~Y{N6>TSto~wup>X{N%wzSdEF*LK@@# z1;l#0nNS0xvlW(qld`*rRYjN^7$a4SbKN}r^w>-N1j?uM{mB?5Qx)$3-HWTkO;U%| zW%rLeTjY#+?vAH;Au>zZI-=f%>fSzq9}mgUEhGJ%JAaluBTl){&lu%$lQ!_H%pm@T zZ+d|NAyf{=H8bTJqsrm^ |GAfOas_!D7*FD@qd?Ohc7&9F!7U_0(I7A1v v*O5p5J0gEiV~hDaurM_ ##a zL$08VcKiLe{93h{=D5Q}E<>rwWZ|!eoSYT>cMQ7<%+KYK3J=1sg-0voJ)}S;X@R)M ziEnZi#$RF3Z`I)J&0xg;#(0QxD2-T`!e!VAPHo{4l0%gZ C-?;GwJmp zNwmp330M;a k~EhyD?5?cC>{EI&Ou^HZ~ Hf@L~#Ai z a(S-8T8R((ts#6**)NH(+V8H7 z7yashj8$&{np7RE4!2WM+aK^EsRSL LDg6zVG6=V6qbjKJ0Gn` z%R4tYc@MMv9YKo1b&N_2SAk^gX#Q~LUH$T+M*n@f-hfdAFJ|&>;Nk~Uhn K>T(7-U&i9a4 5;nt86R_>d!0V|YmV*Nkz(xt;l(tw1SRHy z51&A7w^~D_dvKuUr8iq>p74oqeQ}?j3k_jVxjBTi-R2{dxEc#s*t~u)cA}4243z2L z2A5p>7E|L$U= @^PgkD`~%z0o(_d!|%9lS5M- z*fH#9Qza6Oe#b4zO2>Uo1rz(4{rZ-Uv2$HWWwb`70k4CWwn%dC4R3HnB-+KLLZzkB zW~0Wbq?cCZeiB*^xx3sx56HOx^=?>)yQbfDuOk>U_f=G+jz#Ju&pXVPq^CPkU~$DP z7x1q0SSJT`|Fw4WxWJBR^l_rfIzg|2Fl>cqjdwjxGK@}Y=)mK(6%uJd^6E(b LZ>@`=%mfcfW3o ztopLo?3e6*%EWEZw5_(^{+`@k2KB88`7a+ONr;=!LOSK)uBDs6{KVXqL!EG%m4eB_ z#GDiFLb^53-rUw$tp4HGkfM$JqlB%RHo>w-vNK8v3DjoHriVrVvL&n2uqpw)S5XWH zes9aH#~<@KdMhNhV&y=$vC4hZ{kMfP{~3jr3FX0@^oYFcmCuKSMP1kK;Q&hKZvn54 zJh5FC;n3X|;hvo}Ac$<(J-hE$n$B=M>BxBXuEolc`7S!y7@8&7*nTVPAw4t>++2bM zxV)@aZa)^zq% -%S|Bvv(qiw< IE!_x~7g!S+1{{u8F BAJzZ> literal 0 HcmV?d00001 diff --git a/sound/weapons/SuperHeavyLaser.ogg b/sound/weapons/SuperHeavyLaser.ogg new file mode 100644 index 0000000000000000000000000000000000000000..8f8753e7027567a8029cbc02776b5dd1cb583303 GIT binary patch literal 19263 zcmeFYXIN8Dw>Y}#9TEZ XbWns4dXW~o3ZVw+9R&?x*|Q$z=ALzE|06)|x&0n!CFNKnnaT 5D0JX?0V$&X`~m=&Hj=;BCnVR-d;TY!_dKszN{=rEYySD4fr{*(kr;># zjGRK;6qKcu6s2TkWX^l=6929~&b}_L0au8X&csStIr;NiUN1E2pN=FH|6B#(T2>^0 z1^~bUp<+6ffoyRg4!9}%78iW-)_Zoi5jckHl9BzGU| $ZGB9`s) z#xcR4 3peDA{!&T^|z17Qt*=7m;joV3hiLsWy@zUS! zdH`T*Mz8J9LiM+w3jk1;DB~(^aFrgo9c&tPTtYo5fB^t<;xzJF7MFFi5mT1P#dh!2 z{}%0YUD^M3C(;l^K)cmaVr9tKDgW|;cpDfnPNpC8Zz5x$28?Ai4Jxk-w@Pdo^9`C+ zxC`~#!m|o+ohmzpfs-TKg|d@GsI1VIKA+fbr?9`omi8Y=xH)_}U+lche{#>U5IjhP zgc`y#@>AQ05JdwzE#I)22 _Kmj#{=^*7lc*yAdMoM&sEb> lOBiBc1GJa~1$D2_{en%{S2XgFdE;rlbY9u?WD)Pgzw<_5z5 z5S$dypyrEbG1vQdg2M78Km$fat4m@G#A<8GQZ9{2JRbj>sJ^d%%&0~$+YizbZ|FC- z@K#u`xpk PTq6Y z0Km1+Tr*(q|B6RkQ(!?eW@40_y`(T}p^Xf7UCa%(?TEBriogCna*Y^If}Lz~U2XqI z{0DX7gU(A7_J0r&9fSsstL(zELH|aR$WXwKMfb0~>9@cP39t!*#I-N-*C1ESShQ#5 zku$8<&6K>&6kTT(u3IQxM_PGX=X%?>2e00DUHu;U`oG2NRDV%q1_0G80nsde(X1`y zG?>1I$FLZnL3#c};x L#=D1|Vw5U+S zf+akjr6SK+jMbdcoXEU*0F+O%;m4)XB0-FQDFXl*@(k0LnVRI8{*{LrlSy17lb<5{ zSN?x<(ICice7Q`F{~Cli(WlGcPYCe8@)A>I@-t+Y&4}9Le;xksb2Sm?LV%|)|F^k_ z6J4J9e*>@o_09hO1N?uT0wCg2w?X_n^09EV@B>%~;HSq7qsbzlAk)jGFpjP2l_$w^ z)toIs%NYL`Envh7%~@U?piiurmdEn{S5+3Vq67`n##9h1JUIUI3=vyQ$@Aer+Id1f za>iJG1h|Ukzk2<5h^U#Ne#8Y_rj-6a_oR$-B>^y7%DF_FAZ^Qr4FGI%1#tl2XqzuW zRP_J5@INPH2C$@np9pcnp=OB<;*7A779f{m`ZA`9goq8XvB>$|HECL){4qquPYRd; z0OdflgfT=rs{)-bjDzXVUcSbH&ff_yM!)=W`5f&sk9?4}nY?jc6&f!lV~k`a+AAC9 zWRI=t-vr_l>d65(DZqt8+2(JD7YpO6YV-dYMSDix*aE4aRTW-LG?vi$RrnSO<1d%b zmncglGX7u1c>F$bqH8R~*2wwbH|HY|XT EW|Od zF9t{NB$c7@__{7Bkn#C&!Pjjm&+ia_FnUP?NgV0AbuP(ymxHbrdQ;>gu|C%oIL}Fp z5vk6|MKqREO75kIB{$8)(J^V1@`;mTL;#=%TE${9DkH>K0pb{h#j(JJ1S<*Vc-{(g zb5YhfO9L^%@@#WYQ6$J*v^JX-E+&{`PPC?@$%y}WQ;%T-fR_ot$mpCe+9v!JEY6cE z!eDcp>`vi51KDk&8Kf`DPF&4*Dzg8YJmv=HWh$bTf9;-Za|5EKWMUvH7&oaYT$xQE z+D8xou>4Ey^5JcA0nNYUHYWk-)11%AO{7#V>@T-O@~edO|6u@r Cj6_~ x>d)9X5;;nOA&Pqs zv=SOf4;QVpq$YA8$kHyk8IG0RfmO`ec?|?kYKrjXETANc0~z6>q61dWW} |yM1qT2KjU@vRF{yI(up-tp$_pGV z%m9&Yyda{G5M_oa6&2 xS9ZZ^NCvXN#1Q(E><=!`<~^cZ5B8^e4i`W zNR(1C2MQmARxAY=mIg8swW20~!DIjc899X<(6a%&2?Pa^lIwB;7+!=M7SRXy3p1qw zfh|ZhP%&^Rz|zK{;<|&zeG;kN%| `+S>Z!#`+Rrb>a2g z_!wbkXoj$`I6XB#H$5{pvNFCnKDWHIJo9R4V|fK2>TFDvev3rO9^OX8f *u85!Q%7BH-E-^2_HrdCaViHtQ@^)?npzbF-E*zg1-64$te(VfB=iW6O<#z*Kpi2 zEvnkf=A94G31j8FK*m>**q(JfEy*x6(a<(`#V`N%v3eDgms8Ytl+SrmYzE03mU}>A zTCa)xpj^f$<-Lk*`|Z=vUaB=^)mGcy&|V exE5H|t4dCSvUn{LY6DG} z2uc{}dECuJM%O3oxjzRP6%o}kp8PiaKtK1L#1N~qc-<&!Jk!p39x7`iVAY_EpV;<* z^fo!!aB~YBAyCdQ^OkyOwR8_12Ub*M%v2MX1dhn3nk4&!?W3(~j>V*hVk6&`e*M1Q zb <}Ezta}@^2V=q9iJ M 3iTI%mtrFRugNivjIlme(-RMcns%Qf?4G>u+jxm25+%ic^WM)DWIm}_yz zq0!0)L9sfOEOD0UrnNRd^`5W8s5E)-SM$r>g%7DoY;)c%SikumLG5+pI^Rt)ie)i> z^!5Sse3Fm`i&FT*`*nsHpPbIR_?aZ*j7^?D!X(AZsYz`Hc1q5^eRig3enFm>vQm1- zqR#b648udw(OVuHKi4Qd@QXip#g&U6kw z9DCTUwNvfsFh$->{B}BX+tc%u=|X!$bLNwbAi~=6eH$zFX7_;1v+f21d>u1dO!(ef zwzwZ0x;)?cJ1$X0onbq++nAhC`Y90+2c4%Z?4cc6dF1xy^6JBaTqwGPV5ZrX9|eAa zd!FC9$hRH2KZA(P@qbnfGmzsGbYjcld4Fd0>-&0$5Ca)P!mC8IRiG2-nNWmM15t%l zI_?>LP~!fFiit(J+^`e9$1wisV?~JhsLNyH+=0RdiTlpTdK|q~FDeCWHkaTbzc7P{ zS?Xcr) 1-VOUudJKi$JVl1 zfk^Xr!6ZGvxcnvcXFih@Dk-Uqjnjf+&v8pd-CV|3gf6r+j_hnwF)%B&d9 Bib%!xQc2Aj5oKL*bfyG3!5txFZX5>~7nw#;itbc;4 zcTfh2?#v#1OGI^aHCo3&%6Zp(Sv3P@P_OyZm2WpkcL(w6Z9%EB%w;#mJAe|qk=jXL z!`C-gFt*~aRMapp5sg92h;((ac1QjS^gTo?#Y7o*N&kp966>% zl*ZK!aI{+4EQ|3$SKO^mF;3dU)=cV5n z1^oPad)Kl~tTAZ`dO0tZzfs{^O@sI%zZ%*ND&4oyy|M8fqi0Sdu$Vbg&NbL8)ONP; z?7qoDdwV60K}_5IgHU?c1O!tCNg-_{qwtF(@6&N2JBwJ5qP)mv3HtIMpjC$yRUzaX zFxeup?J%yAn~Zc>8IYe7s&d4W#W;2>e_-ot%~uqcZ>ZSaooSzM9W~rD9Qa;6bW_sb ztXnsmAaBM!|MbPR>6L8#3l>V8D|YWZGOexn|Ee!smI zq&-|T_#vWk22uARHwc&OV^P_V2CLkZB86!D=D9)_m2*RUvD8{jCnqi2&{vzrl{c(N zHFSV^Uk4(2eQZW{?Z>XbJJV;9P7%yDM$J)X#S@=kARfW2SS}g()4G`5u(4r2%I<5| zItlrmD@Al&eUkC5V2KqC-!y(vBo>5cziLTF@CAnMZ~#atW10j$+VzNpuBrtldd#-m zoI+caBT$(8SYiximGf32xl;^-(ld%dY{f}t%cyhcP}88eH8W2Tv3jcW=yG(oB=U+D zb&d$14ro-p+G}V(g!LObGt4fdu9PWT1I5}bk`XgxpmVjE`NJuvZD!84z^3$1kb;#U z^ oQWYDXgNM|}&$lIx?e#6o#nBu~12euxd@av*?70)) zRt6=uAPo|JMXbl0(bSKw6nGHQX|swMly!Zl`QNhEB(xXIhAFO90i?y3t6E*YUDc6} zpJ&S&%FZ1>8``aGT6xJ%lIxAieO#C ol3 g{it@f_Yg}*dLu2|;>DX^Zi6J=(H261xoEZ5AERs@HuU)= zceB!#+M7u{8v{|{)!Y;}e;nwc>v|*JFoyfSmwp?`p2z9gV$rIgOS#L3h@f{|C@dsV z^a5@~hNxGrG!45sNAExWB08U-t;k7N*c&iO{8^=tDU{%WVa*s`O;8d!Zcvv@T+ztU z$S9^?+oJ;Ag wL4atSn$S csa#H^s$ zR5179DhY?^!%Sv=3ho?&wmrX1foW7gJPEF%0q2u5lBiMLuI6%4XF@;6HDvAt5PBQn z%vFk{Hn`6KsHd8!3wkP#8qURjkyrhZUGqjn+Kg$kgFAQatufaIY#T+?jbcE}8i{Tl zMI9d$4pJ4;^C%++YiIN3o0?Hj56}z@W*Kzgy+yR~-rD9}qksPRu>XL;xezoEd`wwa z+0p$k)jus$1$*TLV;3IV+gIXQ<{PZ8ziC{YxujBjZK1&;-m+RGsc)baA#c1-%gKkH z{kZgP{{G#3f9nw!2a}&1KP;1=Z;b7yduK)wEKkYePNF^*M9c)_ph&)FI1e-Fqa~g~ zzPh&$S`Q6 DvcsCAKE~ft=@vB#~-Xa_f{Q{KL-9UO3xdRd- zwkkUkhNw xA^1a+I`DX5k0CcMvA7smc9+D)Ge+_ z=+fT81x7XVW!G+8_@x&QB!Zd%vh63KWJH$nv@u4cuwu~1HNhLs^+4f73s>D`-ute$ zNHAdTRi?>r1|bLOyu{?i&G2IT`-d6%Ws?TMI ;)}0FOSbXtuWaD8 zCUDs|+&GKkDMj DFTSPksN{Z|{>8iM$DN%^7e3l4 zu6do7LW&-bDOK6!k}7W{q<~7$fzQ26Rw$xUcvvqDxdsxXJ~pWWd+HM$qqV5 zxHa2!@&i3WOI{^HRp=Tr2n?$)63Yxp^?xbDA&8--*4Bm&4#o%YCR#nge-RYRG!$>{ zVK-j**3UW@>RQBo!B{#-itxgx@qtJhgyQfK1<%F&n}Xgt>ejq74?_Y^;RWJak1hJe z-d~s)Qps i-*eBntj9O^`<@7-}QRQG3toe*LK3~4bYBe&2EsXo9aw0fGz~b71 zrPB1YrfYZcEhPkEyE5h(pS3_;f{QPX?pom+C8P3S`N@k1;)mVl-zi$Cax+GIjNf*g_p2{?3pe_y1(}p8qlbjfbQK z4QEGe%_NJTy9&NrF@+3mZ~$j1J~xI=n}8m @l4#aii;7pO?9mmX#3iH+@kT@H`88_~j>?Rc zaJ#n`mrHM;DlRsEElk^xv~+J0&Ad49+IgpFYV*;Fo!*?R?}%T=#bk$R4^w(i8K&%& zkpa=M+& 8`{;c zi-0Sex2V~Hwa9j_Z{JLo>Yh*lJdr+= =PMT>s|X% zY}sD{!4G~hD{y@Li^SW5#dFM(zHSZd!p{B8j6tQFTk1ouU6?yByOT0O=3`KUCj|TD z{jOcBk4w}8v`x1u!>IuiX`(9gM|nc%E4 +he^p8f>%E$(r{t|57^jFt P#q1qs_ft{L{dlqE63{z$Tsd?N6MmtTFJq-lJ@E6DZ2?*0Ac-wJ~VqCylo zN@NM2mb7NH!LDMHjx_ORyKyIJJm4c&ZgvT10Z7S+-3nWmt0Yd*r(h{o;(7~liBG4D zrfCE^d?S`uf*Vlx`qo2nM20c)UwR)+w@C#&*eoz=bLEYJD%!F=HcnHy5J=o8MyBwJ zVcWzEJRqEuGyU3Fy-M$b{mkPO6SP_@5{`G>oj+cCyLD{2YD_B{-GPmO5gPPGq!uqD zzL5Cu!eeDVD9F)f=f!5Un~Av{?j~4O+U 9iOt?e0 z@3LD(`l@Y`z$;3Cr- Wr?F|?>=TkSbO%Sfwf)f=AP&cTdC!aMmFUTmK-%y0@+^D>2saC$#? ztk{Ien8js#*4 !3W1uBtFaip{5bfPJq$-OAwC6QtXDzz)}U*T8qpdulG| zt7NEyI;qI|Ev9SG^AL*46#64@Km$49gE&N50VWk`(h|Dza9q&)82iHTY0ZNH^$vj| zBf|~2fAgXIkN2kW?Y*SHx|fft& z! zEUbOg^RON!bc9ybAsp z=kXRVr0qCs9l&b^R>1Ku*ig}M@h!-j$TvCnP0u{e_bIR(xjx@EW{bZ08WQu0VKf;J zH=EBkk=1*_*vrt0`f!`77MDmJ^6} (7$9KbM2OCeir?Rf z%qHuxgm@iv3};CJfa;O-c+b>mWqd3;FF|`=CR^{NhXzavn<@x$!rz-tAmD?F?7WX> z#nwv*;dSPc(@1Lhvl|P$-&Q|0WXxZHCq}GfnZ;W8CjG8B2n^fIFyBnjM~lz?<{;xX zUHlqyG+%J{u=|Vl&D+ Ok2hCxCKB4{bjjSBISQQd`p6fW3< zf7(s1RG` P%dYJ*fz4=bo!i23>ZMl^2vL{R4py0wmOO8w zcWd+4M0ISg9gt@bx9WDvPcwE1(ev=qg=FMm^7_eXwj^w$8+TZ?)!I}nxDwydwVxjB zCF<-!<%VU=!yfx-J6tX0BQ0knM_0nDb1bo9W_Af>3Nur0FWj_CIkt(~Pkk*p651?s zq0QSLF*KGQ`P6yfMR?KR7}KSfvTlQ$X+kSNyd5(^3DoovWqisv^bvJbz6$TYJAM=C zgmd!sgE4b52eVadozngs9yAeciUOU>+zeF$g{HgljWG3&U9!HIlE*^QuiR`DeXS;2 z3dj64tW?-&fIPM)Wt5y3E{9i9Hj@`FAEQA+gM}HvoFs6nv}GUK8NBV0nb~YDb^+e^ zZ>_+sYpWnVa>e3EZ3FW?9mTA$V0-q($>br(eZ_71`jYS2&_jm5@5$v!x?;v59{P qm*}5_sScgPd=qRF)E2kY!AwBnJyN=E=;2#e*T_e9>w+#Wm*nh6pV4Em-au zY2qd3X9p2V(ZL^*)IIDfzF#qiBhBX<6a^cu=jtTS9eYb(?B8#YiG0Tk7iEslpgSQs zU=a5?0#nDZ&3PRMwSHs+en1N@-< 2Hy__@!B;uU8zATvEPjm4zAaRkW25 zw`LoAhbILRYD1c9N)-!O=kSzOcw=pDkm0Pr4EkRCo}zcT-mLc>14HfHSJGV^S0hWV z(a0Ms=`-KB*M5?no_$vFf@F8`pqlD3gKXi~H-*XB$3^(049nPsOeBFOj8Xd0PjOI; zq1|ttPx$hC96Sw`w_jY5RR?hQvrJo_Dm{PXDCPUd|ErS+R;W|@#gc?qWEYvy>(F@l z*INEw0yodxy@qqkzqDm)2+Te#2Z~eD?A$L&l)$(1{sW!pq>gLk5*%fB#MqpPTa~1M zRS$0&rE~ubwkNvG>E*P4(q69Ob#FsqG=A37LhwpWh4<&whre1Q$NYR8=8Md_;z91n zn-p@BYkJiKK6Ac5sD1J}6`MUk?mr>;kDn_gd^a@ k_NinZLXCe${_oz~w)y?=tIPBF^u&5;SqQ&wDC7o;Uu)<>bk{LUj$eS?TpN z2EjffG9xk~Poxy8_GC)-dbs}sMXpk)^-z+w SWwi7tCRZX@>m-05z`Qt#-%Xs &n9?Q0 z9AHMT&`?$rJ>P2o0cA&l*PRUsF3@{9okj|+C-=MIUnE#mlVNI{l>M4<)~td2UU!I( zkx{iTd?le;{IsN7KRY!*-}G+JNjIk@=@-X`M)+?<(B%ER7qfCV$*z>X= !q+mm_l4j}-gikYh&EF}JtP*0n<$tN8f!tx?gS7WaIuhq zUK#SXQqSHPZOH^~PCTVfVR^qQ2eV_T$Lw*vfdXq*Raa!$)!(np?giBv7+5Bm?M$#U zuYvSg*n^+_Ze+plSsI952}$ xZeH2f_;Xw5la0w(u&2BCE+KzyRF!Z}KIWXf(w7Uxf#{(t@_>m-_ zS yd9Ik1jOPV7 znyuz97{PtHWiD`U+x+r-v`BK#LZRq&DYjuEuXU>4NI7WI?Q3QuK4jo^f!;=`lQu)| zI$zBLG%e*9Dd2fT<2tOLiG{Ug@Lk|nA-<@Rnhb^YQ%J=XoA%ng$3%r)N6QCTdRe_s zK$j?&DC03pdAyo2 xQfZoF5df+EN|39+D2xrOXH$??zGI4zot$ArW4@tVU?wiYi zc|TDQ)}DQ>o$Z*<(8>DD>BfL%O~J(rBHXA`>C;yzejdK|?G@YO6qtOUX!7EE!}g_l z?`AqVkM*fmsIfa4^wOCZPq~Q<7lkUHOX}3N>^^y)SqX$_bl+lt8uM&O407G$3aqzD z0|ERYv+@je{8ei*3e@kgWi-yteR0u!CswPEz4w-bl1;DVR~eg^8lx-g?oIPDN}+Hk zdv#Z5L)Y|A3zFcg=GW1d6j{=Wb9lo?oD3a8d{SlECeJfW%PcE=C7rSRDH(?t>Sr@; zS@*@JRnvwSxxon9Bp=- Bi%otLTh=yh>WNK -B? z?pcx#kce|%(W{}wuIT9>T;bNNNdz{FyZXs1SFLFD&GoI#u}{BWu+pyAxLP2+w~c+j zc&n=LrvJ=TdVS#dt(&*d{to;#n&SQ{A&CaCoJKtMLoasp8dil?&boW99hAn);riPD z+vCy3?KUHr+WqDB!0JgO@#c@<6|Q%_E)PRz5*tD7G%{Wyz;lPgdGaGFY=(-&{W}Vp zzlcsCV@GzyOh57El8T$`Hr|26l$EMaQ=7pL2zD@nDpU8JAXsTw7e9pDGsv$X2wka5 z)xl?06cC> coG?%hpOQaiqO) zYWr*(pxfp18)MzQn>8uSHyje9yKlO+Z_%aOC1|xTTSjq@B-pD7{%S rmtX2$_t}tASb};ezx6j3|L51Pdt1n}Dw(G_(^M znCBnsSE?2ne9f-$xR;<)Er9ekOM<0CQlI4==aZs2w7a+sr}oPtneTL5e)uq!KTgTu z!z =E!q(zNtnL%s Wm9 z#Gg7dyVBWi$#$|_*iYBbmLz&i?J)02N*mkBmU^2M;)cqcAE-dvv`w|7Oh(-=!pO+T z%OP8agJ#p4g;v)r2BT;!kHqW3%+jx|M;^ZJPu@*XWtM{%cFR$JuJsaJX`dF&(0eQJ zy$zHT=vqhFCam{FVY{pBXFm9_8$8x!UHH;2b4HTtjSRPZT?2)(rxaDjvd%~PJI!VA z&dVSHzdGNyjxnKYk~~?r)!V11s~=Uh28ojlBoCMNJ?o1WkS)Krvh=32(}9Wb*})gD zL!!q4@EG~rsP6xyk;^d55i>GzkPYP-ZXvPlE2t4SB!`kM3MJd7bxK$@63;{4lF_NJ zX&Z#9Xo3)%5Dln~04`*uc+IlfyP&Fp5Ohp@FYD8>B2;9hySgt_;f?GN&Gw*GV4n3Y zduX2k6t$yEqfIOK;Cxw^na!lwRl6=4V9l)#OOE4uIE|k}tl-~rn9XRT%6_To%8`Z7 zgDMK8I5r>#x365=XyVM-$6EK=a{sQ=_hJ7M?4YpeY0KD<{PH!l^nwZ2=Ja4E_~}*d z# 8a&X_ea$BC5=pZn%qc0?g5I3`Ugs zB)P7#W5n0+NLCUIGQ}>|M$^pFxZCNmC>xTC<}Eqpo28mEr{Uw~(*~v}bp~)5L1)!c zHD9WR1!t80D7@nv<19DDu0hu4daLdSr>d`<&-PgDKKB|emt$$~lS|TDZT+DHk9J%k zr24=;=&I!jV$ryPc!c8 ") t = replacetext(t, "\[row\]", "r6aXxlsH(z0TQHV1}jnr=wer5ECxI+NNkUn!E z_u0zSobkKnPU=MUcOOYZO*+)r^8@3f_JEhv#YDuYevnxXr**#Fjm)^J5&!;#4#3#H z?+qZn@f<2tay`e08IY0b7h2+~r?e{2-mSP%hK$qXu&m&4UnNC3Z_@ZHcn6CiQ>$9F z3*a3DHUsNAG1Ff`^s=|(uIHYDY)@Yvzn6xe7UZto9>R)!8Vi4LM+8~E3bOG<_dJy6 z{II7k*sn{sW*^BdRb6;ci|fbS&53UNi6R@fM#(zp@uCTtV)fK`#5euWz)rlhwDKDy zWCnfkVDaSE{q0XbYSe7@s+bnpCT=*sY-aV@ex%h=x8L*62T|lb9RGYEb$(Xs{Jgql zXg4>{^5XK+)Y9zS%*fc-;M~yM?DQgGc5ad&swhurBzdm(ZJp{*d8X^FmaW63I~RYY z>*O|!q+KlI(G-F)qm*okZ>Smzb6k)}azJDd&q2=yrs}riGUBw+pr1{l;pV&mO{NYI z5xsKHM>t2X6nPzA$^WUa9VQY;2kIOpFM&y~@-4q`zz}?@L80;VH?P0`n5|4ks=^xn zRn(;JvrFR#r EX3T9 zE$orKCwkkdEAc~Fnr2{D_M^9GyRmpeS6mE>gM)m&(x8ow2WE+6SpzsTG`W&+LPid; z-I7-M3f*J^8M&lh9PI*QG;Ee)2l5!2B$AsYwu#=^oXA3%PJM3-hgElUOwCfir7nvQ ztjvSHMR2d8A nhk0}1GJyZ#)< zJUI``GW$q}y&4mKV?j*COMddvm1K`!sJ>@uL*xyuVeSFcon_u)oZ!n<;ebuI^TTd0^G!~*XMLpF07kT7kYZE=LJrb}mI8C`3qOW+fA6UQD zI5RYGQOboi;@LJwq{FW_aI4<$r8Rt&0R2)SLz6PE`v6y<713H|EyqI3*^-GLjfAw> zna)X7X&R*nH23!lVcU3(lmyMZ37M1^7XN@hPdmQbw>nk>QT#C1p1j%xOR}uCqzx(* zvh%o6A$aF{z{=B^r{db?`qioM;qnkV0UzbuE~yH^iTCrC_8{#w)`BSOJ2$tvC6=3T zmXGA)@yjvIpq~rxGStfv_KiX&y28FiOS^2QIqM+LJ|B)4uoEG?Xw$)yI(9W)n~wz* zL$^u-VgZW94>JcoF) 97m4fZ=2!9!%bcNvf20V0@B|0yewXkDh;w+sZmUf;5HnNimBAZdUmsh zO850AB0?JY0)9Q)4=9CNtSkv CV{6_b^wq;0FG*5u3_b zL3M>bab{wmLu)0-!cq($_S+&O ;bKv&DrAK5RHpE2DnND`m_r8At2vec?2g* -O!T>@?E53hFh@*c<#KfN&h7}CbsP}@!XXX*lW`%f|>2);lBe5gGJD-KW zSlln>4`==8`Hr cJC- zn%3LRwRZFMtCVM9RPGQhxa&3K*_JjqNAel6JF>|%8nEx#&IJ~trm*Aj*idp*PFHSu zAV;^OwnE5=Bie+GlHFlj!}8hy57!Ny`@Lsd8kCD0pDuOLf4fL^>B%~&GKsp4ZJKQw z@hvct1eo>AS8P_s&!ZG1m3f3ylH+J!>e2gWD(gGJZkU%~mcm%{Y;s*rv{;IBMUXV9 zX*~@BPZ>MA4OdC{7|dp@%<+~NYU^`vhBA3w%{}aWL3M|~|FoYKhr&I2aNS9>{ d)s#al^-*BCSsob%I7`9i+Ai2&DgBf8O#qzO5F*oz`87wuhDvAS$Asm=(Y8;Lcz zOrg?|6;{sa3yKaUx%R?OD9t>0T_6;|8D}w$X7eJT{3oFr6>~xbOm?(mCO(h0 m52tOFS(kLKM8J&?TT8R19L%*ukr2$&@$V2}bYCDyUf@x#rnc>uGNM)02M``HcI1 ziSN`iNW{uxBZV3dJM`>>-R(mP`>dclFLDo0V%++ho__h>_m#{21|(X<_QPpJ1y5Jp z74}g7&Tei*{U;9V_wQek)_b; 3fYwp>1Q M07MzIXol=}_SS^fBIn0=UHxQ|8%}yW~MCj4>^BcGjXGH}^6ECD8~N#PuwHh1cyr z^|`G^$VZ3;4+b4f6sDAi4J?ecJ$_3Y*>@mEv705-_@;=xk8Cen<#yk6=1m_3U*X!z zrsYwnZP{;UqWMP@EEK%>x&ZYMtU7~{wZGOE@d*~yyAWo5-Hk4ccxRs(&Zj_Yn%k_s zQ*S}G%pIyYQu>hJQfsMORl~0Oh3_J;%v(|e2A==)o~JsZ!ci~#e_zEjZ8EWdTedhA za3Bn)8`)S^VPJhd3aL#BuxZYt=CNjdRU!%H^FGj!W|5GXrIRJ)_fS4(HT4YQK2a9i z*NnlhhapSX^Vw*AMGIZwXBG1nt`$RSgl0c_|1{9@CgxaWonfEOedpm>zl~pT(HDr_ z*}~ATp3fTHJDwH@a3(ap#B#ICG<0rgFys$c;6bRjL+Nyah{E0@2u;y9xqL&?#Dx#0 zOHqAd2C{6hS~T@YQg3*(l%9qMHL!kAgk$=pVZ|_<_H4cOq=(669`ioT-jPaXti{Hb zc={htG>7ZTZR)GmP*6-i0s=x1Wsb&+4hGqg@dI5Lq}-j>t2AD1P;?I+(pKz3f- P7`_3K_=9SL)$J;`% pT6>uPG|B*xczvXzd^f6^M `^M8 zLFA`cch>%^fSPo~>L?YTzWD1uOBG@VVM8(f5ibpzGSVN?`7~Ue_53uOZ7hm>-3sLn z9G+x#b?@D;c}7MaNEt#Ib?{+= Hg7M6u0hW-_Z=7U zeB8V9m-S}#ZInoHsH`Urg%{a$tjT8-W7E}=C4QDIG+#kzsNh&@X9nY`GLyg2baA?i zVB|s@Zl=buf)^^AM6EkuQX$bOwb-Y=&kox(-~N`*4aLjGKQh@(rcbuCx?2lCPTtc9 zI2=`Jm?rCJS lP=St$Z}* z17S#?PU>VmB~YGs0jHqgL1i1oP>$NC&`2O;mmP=Cm@k1|=BB-C#`jFs_5xyMgPZ@# z&l~)bcB$-l&CPdj>%LgEedK`n9M1Uak@cpWe^_y6vB&hITXqL5*LP6XMu9)|F0yFg z*n#5i59Lh1h#O96ovZ4nJr{Ykw!_Ba*Ni7^tt2ieA JoXT3<;Pj ztzXSVmIjiPn!u|CB1}t)QsD9T45n~6!ekuoiB8EITSH42_L0bFM&II|Y}2 )m_v@_n9e! z@7B{blQoJT#Jw~Hbrc`0saj&Szi_M>dVXXA9NfC%m4L0quEjuWNEFS~68MhNgqVfP zNPF<@= s=NXW&jF+!&G^st; zAg_HE18-HmlDf&Rve7itF?{3Em*QNuO1htAVVetqS*tHH-1erzG+&IZjP_3d)(lHi zLZ5z`)z(Fi{A~Dos`;?*Nd#+EIRm5V`}*&*&%UPzZ@E0tHR7FGK9k!hVc}o|)VsZ% zB^v&qc^CL^6|S|*<}Un^2i?k4SYIKv$|7m LT$yn3NkZnjY$_rskooIubZiZOlu!K=&F7XR^T`H7UgF3)BwMUvhT@D z+$SUo&B(JaVsAOVz4O%4rc&?*c}3gASNtuO@$WlQzr=qFt2S~d?Z<*HF^Mn!$~VJz zh0!|K4jo2;mpAQh?=lI5^9G#ZqP)?UAHf$;dnIo^{zMh57MSF6DI42%_YN|Uz^wqD zRc?FwUjX~l=C$U59;S@mpQSZ96oAIv$HwOe>SdE !!%_5BDblgcqS}(t zvM6TA1)4HVqmqo8K2wD?gFShDgF6w=nW@8X?rT{jk#bAYC2_ptN#Mwp{pnTd>9XP< zzA|6sBBF)JGkxHHO?-2sA!%S(H~GWhC)zfCPy}-&T7_kDVenU&oxG=AzBmU >w2df*KI zVT~&4Ttg#QyP19g=L)(WOk5|oG729Tx~dGKCeK}Y{u0Vw$JBhbwq$K1fBAaPl~kx8 z*4l`k#EcZKi>NmO8AB1hno}Nc9Fh!>vq5#>Q(=VVGsLPW=H;O4hwT;VIORJh(pxkt z@tFkWhm*>JF3zlm!|fE}1aEmuJi9s*U1O-%C&`5k(B1hb_V$RcI#the;sgErcc(;Z zv_ew8aPeiIebu=X@MW4(pv5ykgz!Zuo}6>`n`)H2nmSeP(Cv`5)#KR*TPp9pK=+7e z4DiMyh|`N~2u+tnb8iD7!k;EyT7I=(6TS;Q(s9nYip^1DFiF%x(s}qy{U) ze88)bMm}?La?%e{)p3eQ(cnWc1i-1Xv?_Qvl5IWzkYsoy8NyB|Mp!rT@o97lu1D*G zRyVIAG(NzM6v`@sEC$u%9Nmt|(|2wwl^BX;#3bIlUlR7 LcV@$ZBW%Lz-u!dZI3H#oZ8q zbA7bvwuI!>K2n1dyH1Pr%6INI8Z@s9YRZ92+V{?P7aS&Apn>&xpv0=dPC-Y4UlFF* zA58`^^WrzV0z sLls Rz-uGZYBln=?C{w}0{yZOZ=x|aS1U9e(~^h}$9+@|RRoRvm!sG+gO zMa?ZH$us*1SZ7$6zAhDA@K~`|tbHUC(~J(M=Iocqo(C3z8-A~vvmVqp#)li~4|)v7 z0$wCQF;21}?v$Qf;_aZN7g})6o!60gP-mnI#%GZyjBzdC3d|+`B&;P!0THaM)jWzk z*{PW?0bf$Z=P8z=<1(P*w`sx)iKXV!p@C>d|1|%OoQ=u8#wYlae^F3V_ga~Sm?@vg zA4ZxMu`_|lH$k_He!mVq5KR4TUMU!$T%=V&h+vdCl8(Z 60`u)6DS9K8Cu_rIw76paAr-Q-oc+Wa=<0fp`sFaB|oP;&2CV<`Zu<>R@ zQOJUB)rcI?qRNj-S?}?tgo5In=>M+(a08G0lB5JtRHvs>iKfx2*f`U#&DuP^u38Ay zQl%gL$6@Mn (??Cmn$*&~23#H1UJJeHH={qP7d2&X$T#cEq)vO>vj6 z`2G nzA(zHRR@-lB7rpt z4$N#N5!mFqf&jKjO+EI3&jjGGNliWWfzJfs@Da6ji>QsrC}l=kku95LSuSQ-m1S8~ zRS2tAtXgZa7Hcr=>gZrNnvNE$)ov(6Vr7M~(P$VK4b*8H6jZkwz9s~yzoBJRHNvJO zQPhw~n!7t2{#IjkXP4)=?3?de@W86pJN2$1Bdi{D6|U$|OJoQiAkctI<@h>jZ@1Ow zNOojH<$lJx$prC$@R&i`i2Dd`{45fS*sC;3tMri7vpSc2d>2D1j!s4lG7X_b!9xLD z!@yQJ`+!0W2L=KFEL9sG_Lr&+5Bs-n9T5qHDgdft)u65FC>70p6^F>pUdsVf+$JO1 z3>;04q7a*-$x#$y^8sj4D6k@cVxrZ9R&Co a;NN*%)jA} zZ&d;8L}f7qJ5gB-!9poz1}2htViJvsN^Pg4Z7THs< Date: Wed, 11 Sep 2024 00:30:17 -0400 Subject: [PATCH 02/20] Fixes cost of some Mecha weapons in the Exosuit Fab (#6745) ## About The Pull Request Ups fab costs for the AC/10 and the Gauss Rifle ## Why It's Good For The Game Makes the material costs non-trivial. ## Changelog :cl: tweak: tweaked a few things /:cl: --- code/modules/research/designs/mechfab_designs.dm | 2 ++ 1 file changed, 2 insertions(+) diff --git a/code/modules/research/designs/mechfab_designs.dm b/code/modules/research/designs/mechfab_designs.dm index 7ae1195b9106..d38be97cb29c 100644 --- a/code/modules/research/designs/mechfab_designs.dm +++ b/code/modules/research/designs/mechfab_designs.dm @@ -518,11 +518,13 @@ design_name = "AC 10" id = "mech_lmg_heavy" build_path = /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/lmg_heavy + materials_base = list(MAT_STEEL = 12000, MAT_GLASS = 4000, MAT_PLASTIC = 3000, MAT_SILVER = 1500, MAT_COPPER = 4000) /datum/design/science/mecha/gauss_rifle design_name = "Gauss Rifle" id = "mech_gauss_rifle" build_path = /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/gauss_rifle + materials_base = list(MAT_STEEL = 16000, MAT_GLASS = 8000, MAT_PLASTIC = 4000, MAT_SILVER = 3500, MAT_COPPER = 8000) /datum/design/science/mecha/rigged_lmg design_name = "Jury-Rigged Machinegun" From 1d9590a25b4b5affd7f9359dd80ca9329fbe038e Mon Sep 17 00:00:00 2001 From: Niezan Date: Tue, 10 Sep 2024 21:30:34 -0700 Subject: [PATCH 03/20] fixes a cam dir in engineering of triumph (#6744) ## About The Pull Request it floated off the wall, now it don't. ## Why It's Good For The Game no more floating camera :D ## Changelog :cl: fix: makes a camera not float in triumph's engineering. /:cl: --- maps/triumph/levels/deck1.dmm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/maps/triumph/levels/deck1.dmm b/maps/triumph/levels/deck1.dmm index 86cc2abe3f1f..ce0e70bf05a9 100644 --- a/maps/triumph/levels/deck1.dmm +++ b/maps/triumph/levels/deck1.dmm @@ -15217,7 +15217,7 @@ dir = 4 }, /obj/machinery/camera/network/outside{ - dir = 10 + dir = 1 }, /obj/machinery/atmospherics/pipe/simple/hidden/supply{ dir = 4 From 87083b17b0d01391df4fd6668eb001916e2ce4e0 Mon Sep 17 00:00:00 2001 From: LordME <58342752+TheLordME@users.noreply.github.com> Date: Wed, 11 Sep 2024 06:31:32 +0200 Subject: [PATCH 04/20] moves the broken xeno domes from ears to hair, and fixes them (#6743) ## About The Pull Request ## Why It's Good For The Game ## Changelog :cl: fix: fixed 4 xenohybrid domes and moved them to hair (where they belong) /:cl: --- citadel.dme | 1 - .../sprite_accessories/ears/xenomorph.dm | 22 ------------------- .../hair/species/xenomorph.dm | 22 +++++++++++++++++++ 3 files changed, 22 insertions(+), 23 deletions(-) delete mode 100644 code/modules/sprite_accessories/ears/xenomorph.dm diff --git a/citadel.dme b/citadel.dme index 15d9dad0a07d..31f46e8f17eb 100644 --- a/citadel.dme +++ b/citadel.dme @@ -4805,7 +4805,6 @@ #include "code\modules\sprite_accessories\ears\antenna.dm" #include "code\modules\sprite_accessories\ears\horns.dm" #include "code\modules\sprite_accessories\ears\misc.dm" -#include "code\modules\sprite_accessories\ears\xenomorph.dm" #include "code\modules\sprite_accessories\ears\animal\avian.dm" #include "code\modules\sprite_accessories\ears\animal\bee.dm" #include "code\modules\sprite_accessories\ears\animal\bovine.dm" diff --git a/code/modules/sprite_accessories/ears/xenomorph.dm b/code/modules/sprite_accessories/ears/xenomorph.dm deleted file mode 100644 index bc2bdec00515..000000000000 --- a/code/modules/sprite_accessories/ears/xenomorph.dm +++ /dev/null @@ -1,22 +0,0 @@ -/datum/sprite_accessory/ears/xenohead - name = "Xenomorph Drone dome" - id = "ears_xeno_drone" - icon = "icons/mob/sprite_accessories/xeno_parts.dmi" - icon_state = "xenohead_standard" - do_colouration = 1 - legacy_use_additive_color_matrix = FALSE - -/datum/sprite_accessory/ears/xenohead/royal - name = "Xenomorph Royal dome" - id = "ears_xeno_royal" - icon_state = "xenohead_royal" - -/datum/sprite_accessory/ears/xenohead/warrior - name = "Xenomorph Warrior dome" - id = "ears_xeno_warrior" - icon_state = "xenohead_warrior" - -/datum/sprite_accessory/ears/xenohead/net - name = "Xenomorph Net dome" - id = "ears_xeno_net" - icon_state = "xenohead_net" diff --git a/code/modules/sprite_accessories/hair/species/xenomorph.dm b/code/modules/sprite_accessories/hair/species/xenomorph.dm index 78f3c71cf7a3..d46ec41edfec 100644 --- a/code/modules/sprite_accessories/hair/species/xenomorph.dm +++ b/code/modules/sprite_accessories/hair/species/xenomorph.dm @@ -56,3 +56,25 @@ species_allowed = list(SPECIES_XENOHYBRID) random_generation_gender = null +/datum/sprite_accessory/hair/xenohead + name = "Xenomorph Drone dome" + id = "ears_xeno_drone" + icon = 'icons/mob/sprite_accessories/xeno_parts.dmi' + icon_state = "xenohead_standard" + do_colouration = 1 + legacy_use_additive_color_matrix = FALSE + +/datum/sprite_accessory/hair/xenohead/royal + name = "Xenomorph Royal dome" + id = "ears_xeno_royal" + icon_state = "xenohead_royal" + +/datum/sprite_accessory/hair/xenohead/warrior + name = "Xenomorph Warrior dome" + id = "ears_xeno_warrior" + icon_state = "xenohead_warrior" + +/datum/sprite_accessory/hair/xenohead/net + name = "Xenomorph Net dome" + id = "ears_xeno_net" + icon_state = "xenohead_net" From e3b936fbbc49c880eda8518c16258dc746635476 Mon Sep 17 00:00:00 2001 From: silicons <2003111+silicons@users.noreply.github.com> Date: Wed, 11 Sep 2024 01:16:50 -0400 Subject: [PATCH 05/20] Damtype regex (#6742) Atomized codebase reorganization --- code/game/atoms/atom-defense.dm | 22 +++++++++---------- code/game/click/items.dm | 8 +++---- code/game/objects/items.dm | 5 ++++- code/game/objects/items/devices/flashlight.dm | 6 ++--- code/game/objects/items/melee/types/misc.dm | 8 +++---- .../objects/items/melee/types/transforming.dm | 4 ++-- code/game/objects/items/storage/boxes.dm | 2 +- code/game/objects/items/tools/weldingtool.dm | 4 ++-- .../objects/items/weapons/cigs_lighters.dm | 4 ++-- code/game/objects/items/weapons/nullrod.dm | 2 +- .../objects/items/weapons/surgery_tools.dm | 8 +++---- .../objects/items/weapons/swords_axes_etc.dm | 10 ++++----- code/game/objects/obj-defense.dm | 6 ++--- code/game/objects/obj.dm | 1 - .../structures/props/projectile_lock.dm | 2 +- .../objects/structures/props/puzzledoor.dm | 2 +- .../game/turfs/simulated/wall/wall-defense.dm | 2 +- code/modules/blob2/blobs/base_blob.dm | 4 ++-- code/modules/clothing/head/misc_special.dm | 4 ++-- code/modules/holodeck/HolodeckControl.dm | 4 ++-- code/modules/holodeck/HolodeckObjects.dm | 2 +- code/modules/mining/tools/mine_items.dm | 2 +- .../mob/living/carbon/carbon_defense.dm | 12 +++++----- .../carbon/human/human-defense-legacy.dm | 16 +++++++++----- .../mob/living/living-defense-legacy.dm | 9 +++++--- code/modules/mob/living/simple_mob/defense.dm | 2 +- .../subtypes/slime/xenobio/subtypes.dm | 4 ++-- code/modules/paperwork/pen.dm | 4 ++-- .../projectiles/projectile/projectile.dm | 4 ++-- code/modules/shieldgen/energy_shield.dm | 4 ++-- code/modules/spells/artifacts.dm | 2 +- .../sealed/mecha/equipment/tools/drill.dm | 2 +- code/modules/vehicles/sealed/mecha/mecha.dm | 5 ++++- code/modules/vehicles_legacy/vehicle.dm | 4 ++-- code/modules/vore/fluffstuff/custom_items.dm | 6 ++--- 35 files changed, 99 insertions(+), 87 deletions(-) diff --git a/code/game/atoms/atom-defense.dm b/code/game/atoms/atom-defense.dm index 0ee92140df2c..b12756c9b08d 100644 --- a/code/game/atoms/atom-defense.dm +++ b/code/game/atoms/atom-defense.dm @@ -157,13 +157,13 @@ . = I.attacksound_override(src, ATTACK_TYPE_MELEE) if(!isnull(.)) return - . = hitsound_override(I.damtype, I.damage_mode, ATTACK_TYPE_MELEE, I) + . = hitsound_override(I.damage_type, I.damage_mode, ATTACK_TYPE_MELEE, I) if(.) return - . = (I.damtype == DAMAGE_TYPE_BURN? hit_sound_burn : hit_sound_brute) || I.attack_sound + . = (I.damage_type == DAMAGE_TYPE_BURN? hit_sound_burn : hit_sound_brute) || I.attack_sound if(.) return - switch(I.damtype) + switch(I.damage_type) if(DAMAGE_TYPE_BRUTE) return "swing_hit" if(DAMAGE_TYPE_BURN) @@ -173,7 +173,7 @@ /atom/proc/hitsound_projectile(obj/projectile/P) //? todo: projectile gets final say - . = hitsound_override(P.damtype, P.damage_mode, ATTACK_TYPE_PROJECTILE, P) + . = hitsound_override(P.damage_type, P.damage_mode, ATTACK_TYPE_PROJECTILE, P) if(.) return return islist(P.impact_sounds)? pick(P.impact_sounds) : P.impact_sounds @@ -182,13 +182,13 @@ . = I.attacksound_override(src, ATTACK_TYPE_THROWN) if(!isnull(.)) return - . = hitsound_override(I.damtype, I.damage_mode, ATTACK_TYPE_THROWN, I) + . = hitsound_override(I.damage_type, I.damage_mode, ATTACK_TYPE_THROWN, I) if(.) return - . = (I.damtype == DAMAGE_TYPE_BURN? hit_sound_burn : hit_sound_brute) || I.attack_sound + . = (I.damage_type == DAMAGE_TYPE_BURN? hit_sound_burn : hit_sound_brute) || I.attack_sound if(.) return - switch(I.damtype) + switch(I.damage_type) if(DAMAGE_TYPE_BRUTE) return "swing_hit" if(DAMAGE_TYPE_BURN) @@ -248,7 +248,7 @@ * * @params * * damage - raw damage - * * damtype - damage type + * * damage_type - damage type * * tier - penetration / attack tier * * flag - armor flag as seen in [code/__DEFINES/combat/armor.dm] * * mode - damage_mode @@ -278,7 +278,7 @@ * * @params * * damage - raw damage - * * damtype - damage type + * * damage_type - damage type * * tier - penetration / attack tier * * flag - armor flag as seen in [code/__DEFINES/combat/armor.dm] * * mode - damage_mode @@ -315,7 +315,7 @@ * * @params * * damage - raw damage - * * damtype - damage type + * * damage_type - damage type * * damage_tier - penetration / attack tier * * damage_flag - armor flag as seen in [code/__DEFINES/combat/armor.dm] * * damage_mode - damage_mode @@ -350,7 +350,7 @@ * * @params * * damage - raw damage - * * damtype - damage type + * * damage_type - damage type * * damage_tier - penetration / attack tier * * damage_flag - armor flag as seen in [code/__DEFINES/combat/armor.dm] * * damage_mode - damage_mode diff --git a/code/game/click/items.dm b/code/game/click/items.dm index 2e3111c6c0e3..598a10344357 100644 --- a/code/game/click/items.dm +++ b/code/game/click/items.dm @@ -216,10 +216,10 @@ if(!hit_zone) // missed // log - add_attack_logs(user, L, "missed with [src] DT [damtype] F [damage_force] I [user.a_intent]") + add_attack_logs(user, L, "missed with [src] DT [damage_type] F [damage_force] I [user.a_intent]") return melee_mob_miss(L, user, clickchain_flags, params, mult, target_zone, intent) // log - add_attack_logs(user, L, "attacked with [src] DT [damtype] F [damage_force] I [user.a_intent]") + add_attack_logs(user, L, "attacked with [src] DT [damage_type] F [damage_force] I [user.a_intent]") // hit return melee_mob_hit(L, user, clickchain_flags, params, mult, target_zone, intent) @@ -298,7 +298,7 @@ if(isliving(target)) var/mob/living/casted = target newhp = casted.health - log_attack(key_name(src), key_name(target), "attacked with [src] [src.damtype]-[src.damage_force]=[src.damage_tier] newhp ~[newhp || "unknown"]") + log_attack(key_name(src), key_name(target), "attacked with [src] [src.damage_type]-[src.damage_force]=[src.damage_tier] newhp ~[newhp || "unknown"]") return NONE @@ -430,7 +430,7 @@ // todo: better logging // todo: entity ids? var/newhp = target.integrity - log_attack(key_name(src), "[target] ([ref(target)])", "attacked with [src] [src.damtype]-[src.damage_force]=[src.damage_tier] newhp ~[newhp || "unknown"]") + log_attack(key_name(src), "[target] ([ref(target)])", "attacked with [src] [src.damage_type]-[src.damage_force]=[src.damage_tier] newhp ~[newhp || "unknown"]") return NONE diff --git a/code/game/objects/items.dm b/code/game/objects/items.dm index e61d13a64890..4239cb4f9034 100644 --- a/code/game/objects/items.dm +++ b/code/game/objects/items.dm @@ -111,7 +111,10 @@ var/damage_tier = MELEE_TIER_MEDIUM /// damage_mode bitfield - see [code/__DEFINES/combat/damage.dm] var/damage_mode = NONE - // todo: port over damtype + /// DAMAGE_TYPE_* enum + /// + /// * This is the primary damage type this object does on usage as a melee / thrown weapon. + var/damage_type = DAMAGE_TYPE_BRUTE //* Storage *// /// storage cost for volumetric storage diff --git a/code/game/objects/items/devices/flashlight.dm b/code/game/objects/items/devices/flashlight.dm index 0e34f154c131..dcaf2099f39b 100644 --- a/code/game/objects/items/devices/flashlight.dm +++ b/code/game/objects/items/devices/flashlight.dm @@ -351,7 +351,7 @@ /obj/item/flashlight/flare/proc/turn_off() on = FALSE src.damage_force = initial(src.damage_force) - src.damtype = initial(src.damtype) + src.damage_type = initial(src.damage_type) update_appearance() /obj/item/flashlight/flare/attack_self(mob/user) @@ -368,14 +368,14 @@ if(.) user.visible_message(SPAN_NOTICE("[user] activates the flare."), SPAN_NOTICE("You pull the cord on the flare, activating it!")) src.damage_force = on_damage - src.damtype = "fire" + src.damage_type = DAMAGE_TYPE_BURN START_PROCESSING(SSobj, src) /obj/item/flashlight/flare/proc/ignite() //Used for flare launchers. on = !on update_appearance() damage_force = on_damage - damtype = "fire" + damage_type = DAMAGE_TYPE_BURN START_PROCESSING(SSobj, src) return TRUE diff --git a/code/game/objects/items/melee/types/misc.dm b/code/game/objects/items/melee/types/misc.dm index ec2cf5250f4c..1b5cacd7ce1b 100644 --- a/code/game/objects/items/melee/types/misc.dm +++ b/code/game/objects/items/melee/types/misc.dm @@ -281,7 +281,7 @@ to_chat(user, "You ignite the [src]'s sacred flame.") playsound(loc, 'sound/weapons/gun_flamethrower3.ogg', 50, 1) src.damage_force = 20 - src.damtype = "fire" + src.damage_type = DAMAGE_TYPE_BURN src.set_weight_class(WEIGHT_CLASS_BULKY) src.attack_sound = 'sound/weapons/gun_flamethrower2.ogg' active = 1 @@ -291,7 +291,7 @@ to_chat(user, "You douse \the [src]'s sacred flame.") playsound(loc, 'sound/weapons/gun_flamethrower1.ogg', 50, 1) src.damage_force = 20 - src.damtype = "brute" + src.damage_type = DAMAGE_TYPE_BRUTE src.set_weight_class(initial(src.w_class)) src.attack_sound = initial(src.attack_sound) src.active = 0 @@ -526,7 +526,7 @@ T.visible_message("\The [src] turns on.") playsound(loc, acti_sound, 50, 1) src.damage_force = 15 - src.damtype = "fire" + src.damage_type = DAMAGE_TYPE_BURN src.set_weight_class(WEIGHT_CLASS_BULKY) src.attack_sound = 'sound/items/welder.ogg' src.sharp = 1 @@ -545,7 +545,7 @@ T.visible_message("\The [src] turns off.") playsound(loc, deac_sound, 50, 1) src.damage_force = 3 - src.damtype = "brute" + src.damage_type = DAMAGE_TYPE_BRUTE src.set_weight_class(initial(src.w_class)) src.active = 0 src.sharp = 0 diff --git a/code/game/objects/items/melee/types/transforming.dm b/code/game/objects/items/melee/types/transforming.dm index fe7f4160f939..837f697309d9 100644 --- a/code/game/objects/items/melee/types/transforming.dm +++ b/code/game/objects/items/melee/types/transforming.dm @@ -133,7 +133,7 @@ damage_force = VALUE_OR_DEFAULT(active_damage_force, initial(damage_force)) damage_tier = VALUE_OR_DEFAULT(active_damage_tier, initial(damage_tier)) damage_mode = VALUE_OR_DEFAULT(active_damage_mode, initial(damage_mode)) - damtype = VALUE_OR_DEFAULT(active_damage_type, initial(damtype)) + damage_type = VALUE_OR_DEFAULT(active_damage_type, initial(damage_type)) throw_force = VALUE_OR_DEFAULT(active_throw_force, initial(throw_force)) throw_resist = VALUE_OR_DEFAULT(active_throw_resist, initial(throw_resist)) @@ -159,7 +159,7 @@ damage_force = VALUE_OR_DEFAULT(inactive_damage_force, initial(damage_force)) damage_tier = VALUE_OR_DEFAULT(inactive_damage_tier, initial(damage_tier)) damage_mode = VALUE_OR_DEFAULT(inactive_damage_mode, initial(damage_mode)) - damtype = VALUE_OR_DEFAULT(inactive_damage_type, initial(damtype)) + damage_type = VALUE_OR_DEFAULT(inactive_damage_type, initial(damage_type)) throw_force = VALUE_OR_DEFAULT(inactive_throw_force, initial(throw_force)) throw_resist = VALUE_OR_DEFAULT(inactive_throw_resist, initial(throw_resist)) diff --git a/code/game/objects/items/storage/boxes.dm b/code/game/objects/items/storage/boxes.dm index a8d3e994287a..7f22e5e14750 100644 --- a/code/game/objects/items/storage/boxes.dm +++ b/code/game/objects/items/storage/boxes.dm @@ -449,7 +449,7 @@ /obj/item/storage/box/matches/attackby(obj/item/flame/match/W as obj, mob/user as mob) if(istype(W) && !W.lit && !W.burnt) W.lit = 1 - W.damtype = "burn" + W.damage_type = "burn" W.icon_state = "match_lit" START_PROCESSING(SSobj, W) W.update_icon() diff --git a/code/game/objects/items/tools/weldingtool.dm b/code/game/objects/items/tools/weldingtool.dm index adf07cc03b87..751956b1c58d 100644 --- a/code/game/objects/items/tools/weldingtool.dm +++ b/code/game/objects/items/tools/weldingtool.dm @@ -253,7 +253,7 @@ T.visible_message("\The [src] turns on.") playsound(loc, acti_sound, 50, 1) src.damage_force = 15 - src.damtype = "fire" + src.damage_type = DAMAGE_TYPE_BURN src.set_weight_class(WEIGHT_CLASS_BULKY) src.attack_sound = 'sound/items/welder.ogg' welding = 1 @@ -275,7 +275,7 @@ T.visible_message("\The [src] turns off.") playsound(loc, deac_sound, 50, 1) src.damage_force = 3 - src.damtype = "brute" + src.damage_type = DAMAGE_TYPE_BRUTE src.set_weight_class(initial(src.w_class)) src.welding = 0 src.attack_sound = initial(src.attack_sound) diff --git a/code/game/objects/items/weapons/cigs_lighters.dm b/code/game/objects/items/weapons/cigs_lighters.dm index b2f43649dee3..fda7029206aa 100644 --- a/code/game/objects/items/weapons/cigs_lighters.dm +++ b/code/game/objects/items/weapons/cigs_lighters.dm @@ -64,7 +64,7 @@ CIGARETTE PACKETS ARE IN FANCY.DM /obj/item/flame/match/proc/burn_out() lit = 0 burnt = 1 - damtype = "brute" + damage_type = DAMAGE_TYPE_BRUTE icon_state = "match_burnt" item_state = "cigoff" name = "burnt match" @@ -160,7 +160,7 @@ CIGARETTE PACKETS ARE IN FANCY.DM /obj/item/clothing/mask/smokable/proc/light(var/flavor_text = "[usr] lights the [name].") if(!src.lit) src.lit = 1 - damtype = "fire" + damage_type = DAMAGE_TYPE_BURN if(reagents.get_reagent_amount("phoron")) // the phoron explodes when exposed to fire var/datum/effect_system/reagents_explosion/e = new() e.set_up(round(reagents.get_reagent_amount("phoron") / 2.5, 1), get_turf(src), 0, 0) diff --git a/code/game/objects/items/weapons/nullrod.dm b/code/game/objects/items/weapons/nullrod.dm index 97a0eb0fd077..2e836696ca4c 100644 --- a/code/game/objects/items/weapons/nullrod.dm +++ b/code/game/objects/items/weapons/nullrod.dm @@ -109,7 +109,7 @@ item_state = "disintegrate" name = "god hand" desc = "This hand of yours glows with an awesome power!" - damtype = DAMAGE_TYPE_BURN + damage_type = DAMAGE_TYPE_BURN attack_verb = list("punched", "cross countered", "pummeled") /obj/item/nullrod/godhand/Initialize(mapload) diff --git a/code/game/objects/items/weapons/surgery_tools.dm b/code/game/objects/items/weapons/surgery_tools.dm index fb75f705c9a6..8877442b964b 100644 --- a/code/game/objects/items/weapons/surgery_tools.dm +++ b/code/game/objects/items/weapons/surgery_tools.dm @@ -106,20 +106,20 @@ name = "laser scalpel" desc = "A scalpel augmented with a directed laser, for more precise cutting without blood entering the field. This one looks basic and could be improved." icon_state = "scalpel_laser1_on" - damtype = "fire" + damage_type = DAMAGE_TYPE_BURN /obj/item/surgical/scalpel/laser2 name = "laser scalpel" desc = "A scalpel augmented with a directed laser, for more precise cutting without blood entering the field. This one looks somewhat advanced." icon_state = "scalpel_laser2_on" - damtype = "fire" + damage_type = DAMAGE_TYPE_BURN damage_force = 12.0 /obj/item/surgical/scalpel/laser3 name = "laser scalpel" desc = "A scalpel augmented with a directed laser, for more precise cutting without blood entering the field. This one looks to be the pinnacle of precision energy cutlery!" icon_state = "scalpel_laser3_on" - damtype = "fire" + damage_type = DAMAGE_TYPE_BURN damage_force = 15.0 /obj/item/surgical/scalpel/manager @@ -162,7 +162,7 @@ icon_state = "adv_saw" item_state = "saw3" attack_sound = 'sound/weapons/emitter2.ogg' - damtype = DAMAGE_TYPE_SEARING + damage_type = DAMAGE_TYPE_SEARING w_class = WEIGHT_CLASS_BULKY origin_tech = list(TECH_BIO = 4, TECH_MATERIAL = 6, TECH_MAGNET = 6) materials_base = list(MAT_STEEL = 12500) diff --git a/code/game/objects/items/weapons/swords_axes_etc.dm b/code/game/objects/items/weapons/swords_axes_etc.dm index c04b902bdcdd..63b12ff5d9c0 100644 --- a/code/game/objects/items/weapons/swords_axes_etc.dm +++ b/code/game/objects/items/weapons/swords_axes_etc.dm @@ -110,15 +110,15 @@ var/mob/living/L = user L.take_random_targeted_damage(brute = 2*damage_force) return - var/old_damtype = damtype + var/old_damage_type = damage_type var/old_attack_verb = attack_verb var/old_force = damage_force if(user.a_intent != INTENT_HARM) - damtype = DAMAGE_TYPE_HALLOSS + damage_type = DAMAGE_TYPE_HALLOSS attack_verb = list("suppressed") damage_force = on_pain_force . = ..() - damtype = old_damtype + damage_type = old_damage_type attack_verb = old_attack_verb damage_force = old_force else @@ -221,7 +221,7 @@ desc = "A training sword made of wood and shaped like a katana." icon_state = "bokken" slot_flags = SLOT_BELT | SLOT_BACK - damtype = DAMAGE_TYPE_HALLOSS + damage_type = DAMAGE_TYPE_HALLOSS damage_force = 5 throw_force = 5 attack_verb = list("whacked", "smacked", "struck") @@ -351,7 +351,7 @@ desc = "A heavy wooden club reinforced with metal studs. Ancient Terran Oni were often depicted carrying this weapon." icon_state = "kanabo" slot_flags = SLOT_BACK - damtype = DAMAGE_TYPE_BRUTE + damage_type = DAMAGE_TYPE_BRUTE damage_force = 15 throw_force = 5 attack_verb = list("battered", "hammered", "struck") diff --git a/code/game/objects/obj-defense.dm b/code/game/objects/obj-defense.dm index d8046405874a..c6882bfe39b4 100644 --- a/code/game/objects/obj-defense.dm +++ b/code/game/objects/obj-defense.dm @@ -20,7 +20,7 @@ // todo: maybe the item side should handle this? run_damage_instance( weapon.damage_force * (clickchain ? clickchain.damage_multiplier : 1), - weapon.damtype, + weapon.damage_type, weapon.damage_tier, weapon.damage_flag, weapon.damage_mode, @@ -96,7 +96,7 @@ /obj/hitsound_melee(obj/item/I) if(!isnull(material_primary)) var/datum/material/primary = get_primary_material() - . = I.damtype == DAMAGE_TYPE_BURN? primary.sound_melee_burn : primary.sound_melee_brute + . = I.damage_type == DAMAGE_TYPE_BURN? primary.sound_melee_burn : primary.sound_melee_brute if(!isnull(.)) return return ..() @@ -104,7 +104,7 @@ /obj/hitsound_throwhit(obj/item/I) if(!isnull(material_primary)) var/datum/material/primary = get_primary_material() - . = I.damtype == DAMAGE_TYPE_BURN? primary.sound_melee_burn : primary.sound_melee_brute + . = I.damage_type == DAMAGE_TYPE_BURN? primary.sound_melee_burn : primary.sound_melee_brute if(!isnull(.)) return return ..() diff --git a/code/game/objects/obj.dm b/code/game/objects/obj.dm index f58e08f536e6..8784f12371f3 100644 --- a/code/game/objects/obj.dm +++ b/code/game/objects/obj.dm @@ -211,7 +211,6 @@ var/pry = 0 //Used in attackby() to open doors //! LEGACY: DO NOT USE var/in_use = 0 // If we have a user using us, this will be set on. We will check if the user has stopped using us, and thus stop updating and LAGGING EVERYTHING! - var/damtype = "brute" // todo: /obj/item level, /obj/projectile level, how to deal with armor? var/armor_penetration = 0 var/show_messages diff --git a/code/game/objects/structures/props/projectile_lock.dm b/code/game/objects/structures/props/projectile_lock.dm index 505cc3b263b2..a0257faf72db 100644 --- a/code/game/objects/structures/props/projectile_lock.dm +++ b/code/game/objects/structures/props/projectile_lock.dm @@ -48,7 +48,7 @@ if(timing) return PROJECTILE_IMPACT_DELETE - if(istype(proj, /obj/projectile/beam/heavylaser/cannon) || istype(proj, /obj/projectile/beam/emitter) || (proj.damage_force >= 80 && proj.damtype == DAMAGE_TYPE_BURN)) + if(istype(proj, /obj/projectile/beam/heavylaser/cannon) || istype(proj, /obj/projectile/beam/emitter) || (proj.damage_force >= 80 && proj.damage_type == DAMAGE_TYPE_BURN)) toggle_lock() visible_message("\The [src] [enabled ? "disengages" : "engages"] its locking mechanism.") diff --git a/code/game/objects/structures/props/puzzledoor.dm b/code/game/objects/structures/props/puzzledoor.dm index 951eb64f86dc..861ed2074b4f 100644 --- a/code/game/objects/structures/props/puzzledoor.dm +++ b/code/game/objects/structures/props/puzzledoor.dm @@ -77,7 +77,7 @@ else if(src.density && (user.a_intent == INTENT_HARM)) var/obj/item/W = C user.setClickCooldown(user.get_attack_speed(W)) - if(W.damtype == DAMAGE_TYPE_BRUTE || W.damtype == DAMAGE_TYPE_BURN) + if(W.damage_type == DAMAGE_TYPE_BRUTE || W.damage_type == DAMAGE_TYPE_BURN) user.do_attack_animation(src) user.visible_message("\The [user] hits \the [src] with \the [W] with no visible effect.") diff --git a/code/game/turfs/simulated/wall/wall-defense.dm b/code/game/turfs/simulated/wall/wall-defense.dm index 98c80c6ec0dd..e1d7eec2bbd8 100644 --- a/code/game/turfs/simulated/wall/wall-defense.dm +++ b/code/game/turfs/simulated/wall/wall-defense.dm @@ -47,7 +47,7 @@ // todo: maybe the item side should handle this? run_damage_instance( weapon.damage_force * (clickchain ? clickchain.damage_multiplier : 1), - weapon.damtype, + weapon.damage_type, weapon.damage_tier, weapon.damage_flag, weapon.damage_mode, diff --git a/code/modules/blob2/blobs/base_blob.dm b/code/modules/blob2/blobs/base_blob.dm index 40d129452082..505d6c155dab 100644 --- a/code/modules/blob2/blobs/base_blob.dm +++ b/code/modules/blob2/blobs/base_blob.dm @@ -226,7 +226,7 @@ var/list/blobs = list() playsound(loc, 'sound/effects/attackblob.ogg', 50, 1) visible_message("\The [src] has been attacked with \the [W][(user ? " by [user]." : ".")]") var/damage = W.damage_force - switch(W.damtype) + switch(W.damage_type) if(DAMAGE_TYPE_BURN) if(overmind) damage *= overmind.blob_type.burn_multiplier @@ -248,7 +248,7 @@ var/list/blobs = list() else playsound(src, 'sound/weapons/tap.ogg', 50, 1) if(overmind) - damage = overmind.blob_type.on_received_damage(src, damage, W.damtype, user) + damage = overmind.blob_type.on_received_damage(src, damage, W.damage_type, user) adjust_integrity_blob(-damage) return diff --git a/code/modules/clothing/head/misc_special.dm b/code/modules/clothing/head/misc_special.dm index dec04a45a3c4..f6b34b2f2729 100644 --- a/code/modules/clothing/head/misc_special.dm +++ b/code/modules/clothing/head/misc_special.dm @@ -150,12 +150,12 @@ onfire = !(onfire) if (onfire) damage_force = 3 - damtype = "fire" + damage_type = DAMAGE_TYPE_BURN icon_state = "cake1" START_PROCESSING(SSobj, src) else damage_force = 0 - damtype = "brute" + damage_type = DAMAGE_TYPE_BRUTE icon_state = "cake0" return diff --git a/code/modules/holodeck/HolodeckControl.dm b/code/modules/holodeck/HolodeckControl.dm index 60f78010bae2..5e3ddcefea06 100644 --- a/code/modules/holodeck/HolodeckControl.dm +++ b/code/modules/holodeck/HolodeckControl.dm @@ -173,11 +173,11 @@ if (safety_disabled) item_power_usage = 2500 for(var/obj/item/holo/esword/H in linkedholodeck) - H.damtype = DAMAGE_TYPE_BRUTE + H.damage_type = DAMAGE_TYPE_BRUTE else item_power_usage = initial(item_power_usage) for(var/obj/item/holo/esword/H in linkedholodeck) - H.damtype = initial(H.damtype) + H.damage_type = initial(H.damage_type) for(var/mob/living/simple_mob/animal/space/carp/holodeck/C in holographic_mobs) C.set_safety(!safety_disabled) diff --git a/code/modules/holodeck/HolodeckObjects.dm b/code/modules/holodeck/HolodeckObjects.dm index 493c9a42ddfd..9160f19cc590 100644 --- a/code/modules/holodeck/HolodeckObjects.dm +++ b/code/modules/holodeck/HolodeckObjects.dm @@ -213,7 +213,7 @@ return /obj/item/holo - damtype = DAMAGE_TYPE_HALLOSS + damage_type = DAMAGE_TYPE_HALLOSS /obj/item/holo/esword desc = "May the force be within you. Sorta." diff --git a/code/modules/mining/tools/mine_items.dm b/code/modules/mining/tools/mine_items.dm index 8b8f630d436a..0f5ad496300e 100644 --- a/code/modules/mining/tools/mine_items.dm +++ b/code/modules/mining/tools/mine_items.dm @@ -94,7 +94,7 @@ icon_state = "plasmacutter" item_state = "gun" w_class = WEIGHT_CLASS_NORMAL //it is smaller than the pickaxe - damtype = "fire" + damage_type = DAMAGE_TYPE_BURN digspeed = 20 //Can slice though normal walls, all girders, or be used in reinforced wall deconstruction/ light thermite on fire origin_tech = list(TECH_MATERIAL = 4, TECH_PHORON = 3, TECH_ENGINEERING = 3) desc = "A rock cutter that uses bursts of hot plasma. You could use it to cut limbs off of xenos! Or, you know, mine stuff." diff --git a/code/modules/mob/living/carbon/carbon_defense.dm b/code/modules/mob/living/carbon/carbon_defense.dm index 5cf584d5efe3..039154fa083a 100644 --- a/code/modules/mob/living/carbon/carbon_defense.dm +++ b/code/modules/mob/living/carbon/carbon_defense.dm @@ -27,10 +27,10 @@ weapon_edge = 0 hit_embed_chance = I.damage_force/(I.w_class*3) - apply_damage(effective_force, I.damtype, hit_zone, blocked, soaked, sharp=weapon_sharp, edge=weapon_edge, used_weapon=I) + apply_damage(effective_force, I.damage_type, hit_zone, blocked, soaked, sharp=weapon_sharp, edge=weapon_edge, used_weapon=I) //Melee weapon embedded object code. - if (I && I.damtype == DAMAGE_TYPE_BRUTE && !I.anchored && !is_robot_module(I) && I.embed_chance > 0) + if (I && I.damage_type == DAMAGE_TYPE_BRUTE && !I.anchored && !is_robot_module(I) && I.embed_chance > 0) var/damage = effective_force if (blocked) damage *= (100 - blocked)/100 @@ -102,7 +102,7 @@ // Knifing /mob/living/carbon/proc/attack_throat(obj/item/W, obj/item/grab/G, mob/user) - if(!((W.damage_mode & DAMAGE_MODE_EDGE) || W.edge) || !W.damage_force || W.damtype != DAMAGE_TYPE_BRUTE) + if(!((W.damage_mode & DAMAGE_MODE_EDGE) || W.edge) || !W.damage_force || W.damage_type != DAMAGE_TYPE_BRUTE) return 0 //unsuitable weapon user.visible_message("\The [user] begins to slit [src]'s throat with \the [W]!") @@ -123,7 +123,7 @@ var/total_damage = 0 for(var/i in 1 to 3) var/damage = min(W.damage_force*1.5, 20)*damage_mod - apply_damage(damage, W.damtype, "head", 0, sharp=W.sharp||(W.damage_mode & DAMAGE_MODE_EDGE), edge=W.edge||(W.damage_mode & DAMAGE_MODE_EDGE)) + apply_damage(damage, W.damage_type, "head", 0, sharp=W.sharp||(W.damage_mode & DAMAGE_MODE_EDGE), edge=W.edge||(W.damage_mode & DAMAGE_MODE_EDGE)) total_damage += damage var/oxyloss = total_damage @@ -150,13 +150,13 @@ /mob/living/carbon/proc/shank_attack(obj/item/W, obj/item/grab/G, mob/user, hit_zone) - if(!(W.sharp || (W.damage_mode & DAMAGE_MODE_SHARP)) || !W.damage_force || W.damtype != DAMAGE_TYPE_BRUTE) + if(!(W.sharp || (W.damage_mode & DAMAGE_MODE_SHARP)) || !W.damage_force || W.damage_type != DAMAGE_TYPE_BRUTE) return 0 //unsuitable weapon user.visible_message("\The [user] plunges \the [W] into \the [src]!") var/damage = shank_armor_helper(W, G, user) - apply_damage(damage, W.damtype, "torso", 0, sharp=W.sharp||(W.damage_mode & DAMAGE_MODE_EDGE), edge=W.edge||(W.damage_mode & DAMAGE_MODE_EDGE)) + apply_damage(damage, W.damage_type, "torso", 0, sharp=W.sharp||(W.damage_mode & DAMAGE_MODE_EDGE), edge=W.edge||(W.damage_mode & DAMAGE_MODE_EDGE)) if(W.attack_sound) playsound(loc, W.attack_sound, 50, 1, -1) diff --git a/code/modules/mob/living/carbon/human/human-defense-legacy.dm b/code/modules/mob/living/carbon/human/human-defense-legacy.dm index 7438b3dc2cf4..cc719d39f3cf 100644 --- a/code/modules/mob/living/carbon/human/human-defense-legacy.dm +++ b/code/modules/mob/living/carbon/human/human-defense-legacy.dm @@ -227,7 +227,7 @@ forcesay(hit_appends) //forcesay checks stat already if(prob(25 + (effective_force * 2))) - if(!((I.damtype == DAMAGE_TYPE_BRUTE) || (I.damtype == DAMAGE_TYPE_HALLOSS))) + if(!((I.damage_type == DAMAGE_TYPE_BRUTE) || (I.damage_type == DAMAGE_TYPE_HALLOSS))) return if(!(I.atom_flags & NOBLOODY)) @@ -274,7 +274,7 @@ if(!organ || (organ.dislocated == 2) || (organ.dislocated == -1) || blocked >= 100) return 0 - if(W.damtype != DAMAGE_TYPE_BRUTE) + if(W.damage_type != DAMAGE_TYPE_BRUTE) return 0 if(soaked >= round(effective_force*0.8)) @@ -317,7 +317,11 @@ throw_mode_off() return - var/dtype = O.damtype + var/dtype = DAMAGE_TYPE_BRUTE + if(isitem(AM)) + var/obj/item/impacting_item = AM + dtype = impacting_item.damage_type + var/throw_damage = O.throw_force * TT.get_damage_multiplier(src) var/zone @@ -473,10 +477,10 @@ w_uniform.add_blood(source) update_inv_w_uniform(0) -/mob/living/carbon/human/proc/handle_suit_punctures(var/damtype, var/damage, var/def_zone) +/mob/living/carbon/human/proc/handle_suit_punctures(var/damage_type, var/damage, var/def_zone) // Tox and oxy don't matter to suits. - if(damtype != DAMAGE_TYPE_BURN && damtype != DAMAGE_TYPE_BRUTE) return + if(damage_type != DAMAGE_TYPE_BURN && damage_type != DAMAGE_TYPE_BRUTE) return // The hardsuit might soak this hit, if we're wearing one. if(back && istype(back,/obj/item/hardsuit)) @@ -488,7 +492,7 @@ if(!istype(wear_suit,/obj/item/clothing/suit/space)) return var/obj/item/clothing/suit/space/SS = wear_suit var/penetrated_dam = max(0,(damage - SS.breach_threshold)) - if(penetrated_dam) SS.create_breaches(damtype, penetrated_dam) + if(penetrated_dam) SS.create_breaches(damage_type, penetrated_dam) /mob/living/carbon/human/reagent_permeability() var/perm = 0 diff --git a/code/modules/mob/living/living-defense-legacy.dm b/code/modules/mob/living/living-defense-legacy.dm index 008761bdc1c4..f6e64eaed3a5 100644 --- a/code/modules/mob/living/living-defense-legacy.dm +++ b/code/modules/mob/living/living-defense-legacy.dm @@ -192,7 +192,7 @@ standard_weapon_hit_effects(I, user, effective_force, blocked, soaked, hit_zone) - if(I.damtype == DAMAGE_TYPE_BRUTE && prob(33)) // Added blood for whacking non-humans too + if(I.damage_type == DAMAGE_TYPE_BRUTE && prob(33)) // Added blood for whacking non-humans too var/turf/simulated/location = get_turf(src) if(istype(location)) location.add_blood_floor(src) @@ -214,7 +214,7 @@ weapon_sharp = 0 weapon_edge = 0 - apply_damage(effective_force, I.damtype, hit_zone, blocked, soaked, sharp=weapon_sharp, edge=weapon_edge, used_weapon=I) + apply_damage(effective_force, I.damage_type, hit_zone, blocked, soaked, sharp=weapon_sharp, edge=weapon_edge, used_weapon=I) return 1 @@ -222,7 +222,10 @@ /mob/living/throw_impacted(atom/movable/AM, datum/thrownthing/TT) if(istype(AM, /obj)) var/obj/O = AM - var/dtype = O.damtype + var/dtype = DAMAGE_TYPE_BRUTE + if(isitem(AM)) + var/obj/item/impacting_item = AM + dtype = impacting_item.damage_type var/throw_damage = O.throw_force * TT.get_damage_multiplier(src) var/miss_chance = 15 diff --git a/code/modules/mob/living/simple_mob/defense.dm b/code/modules/mob/living/simple_mob/defense.dm index cc18761c9935..3ea0519d6c51 100644 --- a/code/modules/mob/living/simple_mob/defense.dm +++ b/code/modules/mob/living/simple_mob/defense.dm @@ -75,7 +75,7 @@ effective_force = O.damage_force //Animals can't be stunned(?) - if(O.damtype == DAMAGE_TYPE_HALLOSS) + if(O.damage_type == DAMAGE_TYPE_HALLOSS) effective_force = 0 if(supernatural && istype(O,/obj/item/nullrod)) effective_force *= 2 diff --git a/code/modules/mob/living/simple_mob/subtypes/slime/xenobio/subtypes.dm b/code/modules/mob/living/simple_mob/subtypes/slime/xenobio/subtypes.dm index c8e5ab414ba7..4f6526c96aa0 100644 --- a/code/modules/mob/living/simple_mob/subtypes/slime/xenobio/subtypes.dm +++ b/code/modules/mob/living/simple_mob/subtypes/slime/xenobio/subtypes.dm @@ -207,7 +207,7 @@ ignite() /mob/living/simple_mob/slime/xenobio/dark_purple/attackby(var/obj/item/W, var/mob/user) - if(istype(W) && W.damage_force && W.damtype == DAMAGE_TYPE_BURN) + if(istype(W) && W.damage_force && W.damage_type == DAMAGE_TYPE_BURN) log_and_message_admins("[src] ignited due to being hit with a burning weapon ([W]) by [key_name(user)].") ignite() else @@ -661,7 +661,7 @@ explode() /mob/living/simple_mob/slime/xenobio/oil/attackby(obj/item/W, mob/living/user) - if(istype(W) && W.damage_force && W.damtype == DAMAGE_TYPE_BURN) + if(istype(W) && W.damage_force && W.damage_type == DAMAGE_TYPE_BURN) log_and_message_admins("[src] exploded due to being hit with a burning weapon ([W]) by [key_name(user)].") explode() else diff --git a/code/modules/paperwork/pen.dm b/code/modules/paperwork/pen.dm index 21443c6f6e00..7315a0a90a86 100644 --- a/code/modules/paperwork/pen.dm +++ b/code/modules/paperwork/pen.dm @@ -192,7 +192,7 @@ edge = 1 set_weight_class(active_w_class) playsound(src, 'sound/weapons/saberon.ogg', 15, 1) - damtype = DAMAGE_TYPE_SEARING + damage_type = DAMAGE_TYPE_SEARING item_flags |= ITEM_THROW_UNCATCHABLE attack_verb |= list(\ @@ -214,7 +214,7 @@ sharp = initial(sharp) edge = initial(edge) set_weight_class(initial(w_class)) - damtype = DAMAGE_TYPE_BRUTE + damage_type = DAMAGE_TYPE_BRUTE item_flags &= ~ITEM_THROW_UNCATCHABLE /obj/item/pen/blade/blue diff --git a/code/modules/projectiles/projectile/projectile.dm b/code/modules/projectiles/projectile/projectile.dm index 184778fbc77f..29762896baad 100644 --- a/code/modules/projectiles/projectile/projectile.dm +++ b/code/modules/projectiles/projectile/projectile.dm @@ -289,7 +289,7 @@ var/damage_force = 10 /// damage tier - goes hand in hand with [damage_armor] var/damage_tier = BULLET_TIER_DEFAULT - /// todo: legacy - BRUTE, BURN, TOX, OXY, CLONE, HALLOSS, ELECTROCUTE, BIOACID are the only things that should be in here + /// damage type - DAMAGE_TYPE_* define var/damage_type = DAMAGE_TYPE_BRUTE /// armor flag for damage - goes hand in hand with [damage_tier] var/damage_flag = ARMOR_BULLET @@ -604,7 +604,7 @@ return fire(angle_override, direct_target) /** - * Standard proc to determine damage when impacting something. This does not affect the special damage variables/effect variables, only damage and damtype. + * Standard proc to determine damage when impacting something. This does not affect the special damage variables/effect variables, only damage and damage_type. * May or may not be called before/after armor calculations. * * @params diff --git a/code/modules/shieldgen/energy_shield.dm b/code/modules/shieldgen/energy_shield.dm index 4416de28d33b..1b6748953484 100644 --- a/code/modules/shieldgen/energy_shield.dm +++ b/code/modules/shieldgen/energy_shield.dm @@ -254,9 +254,9 @@ if(gen.check_flag(MODEFLAG_HYPERKINETIC)) user.visible_message("\The [user] hits \the [src] with \the [I]!") - if(I.damtype == DAMAGE_TYPE_BURN) + if(I.damage_type == DAMAGE_TYPE_BURN) take_damage_legacy(I.damage_force, SHIELD_DAMTYPE_HEAT) - else if (I.damtype == DAMAGE_TYPE_BRUTE) + else if (I.damage_type == DAMAGE_TYPE_BRUTE) take_damage_legacy(I.damage_force, SHIELD_DAMTYPE_PHYSICAL) else take_damage_legacy(I.damage_force, SHIELD_DAMTYPE_EM) diff --git a/code/modules/spells/artifacts.dm b/code/modules/spells/artifacts.dm index d906ee6de3cf..6f636dcf872d 100644 --- a/code/modules/spells/artifacts.dm +++ b/code/modules/spells/artifacts.dm @@ -8,7 +8,7 @@ throw_speed = 3 throw_range = 7 throw_force = 10 - damtype = DAMAGE_TYPE_BURN + damage_type = DAMAGE_TYPE_BURN damage_force = 10 attack_sound = 'sound/items/welder2.ogg' diff --git a/code/modules/vehicles/sealed/mecha/equipment/tools/drill.dm b/code/modules/vehicles/sealed/mecha/equipment/tools/drill.dm index b71d64411122..f0b3e4b7cb38 100644 --- a/code/modules/vehicles/sealed/mecha/equipment/tools/drill.dm +++ b/code/modules/vehicles/sealed/mecha/equipment/tools/drill.dm @@ -56,7 +56,7 @@ return 1 /obj/item/mecha_parts/mecha_equipment/tool/drill/proc/drill_mob(mob/living/target, mob/user) - add_attack_logs(user, target, "attacked", "[name]", "(INTENT: [uppertext(user.a_intent)]) (DAMTYPE: [uppertext(damtype)])") + add_attack_logs(user, target, "attacked", "[name]", "(INTENT: [uppertext(user.a_intent)]) (DAMTYPE: [uppertext(DAMAGE_TYPE_BRUTE)])") var/drill_force = damage_force //Couldn't manage it otherwise. if(ishuman(target)) target.apply_damage(drill_force, DAMAGE_TYPE_BRUTE) diff --git a/code/modules/vehicles/sealed/mecha/mecha.dm b/code/modules/vehicles/sealed/mecha/mecha.dm index 07953a03cb30..8af15004add4 100644 --- a/code/modules/vehicles/sealed/mecha/mecha.dm +++ b/code/modules/vehicles/sealed/mecha/mecha.dm @@ -144,6 +144,9 @@ var/max_equip = 2 var/datum/events/events + /// outgoing melee damage (legacy var) + var/damtype + //mechaequipt2 stuffs var/list/hull_equipment = new var/list/weapon_equipment = new @@ -1351,7 +1354,7 @@ pass_damage = (pass_damage*pass_damage_reduc_mod) //Apply the reduction of damage from not having enough armor penetration. This is not regular armor values at play. for(var/obj/item/mecha_parts/mecha_equipment/ME in equipment) pass_damage = ME.handle_projectile_contact(W, user, pass_damage) - src.take_damage_legacy(pass_damage,W.damtype) //The take_damage_legacy() proc handles armor values + src.take_damage_legacy(pass_damage, W.damage_type) //The take_damage_legacy() proc handles armor values if(pass_damage > internal_damage_minimum) //Only decently painful attacks trigger a chance of mech damage. src.check_for_internal_damage(list(MECHA_INT_TEMP_CONTROL,MECHA_INT_TANK_BREACH,MECHA_INT_CONTROL_LOST)) return diff --git a/code/modules/vehicles_legacy/vehicle.dm b/code/modules/vehicles_legacy/vehicle.dm index 80de4b285178..d6878ded82be 100644 --- a/code/modules/vehicles_legacy/vehicle.dm +++ b/code/modules/vehicles_legacy/vehicle.dm @@ -111,9 +111,9 @@ else to_chat(user, "Unable to repair while [src] is off.") - else if(hasvar(W,"damage_force") && hasvar(W,"damtype")) + else if(hasvar(W,"damage_force") && hasvar(W,"damage_type")) user.setClickCooldown(user.get_attack_speed(W)) - switch(W.damtype) + switch(W.damage_type) if("fire") health -= W.damage_force * fire_dam_coeff if("brute") diff --git a/code/modules/vore/fluffstuff/custom_items.dm b/code/modules/vore/fluffstuff/custom_items.dm index 44bf48d4b155..efcccd152050 100644 --- a/code/modules/vore/fluffstuff/custom_items.dm +++ b/code/modules/vore/fluffstuff/custom_items.dm @@ -169,7 +169,7 @@ damage_force = 10 throw_force = 3 w_class = WEIGHT_CLASS_NORMAL - damtype = DAMAGE_TYPE_HALLOSS + damage_type = DAMAGE_TYPE_HALLOSS attack_verb = list("flogged", "whipped", "lashed", "disciplined", "chastised", "flayed") //General use @@ -1308,7 +1308,7 @@ item_icons = list(SLOT_ID_LEFT_HAND = 'icons/mob/items/lefthand_melee.dmi', SLOT_ID_RIGHT_HAND = 'icons/mob/items/righthand_melee.dmi', SLOT_ID_BACK = 'icons/vore/custom_items_vr.dmi', SLOT_ID_SUIT = 'icons/vore/custom_items_vr.dmi') var/active_state = "wolfgirlsword" allowed = list(/obj/item/shield/fluff/wolfgirlshield) - damtype = DAMAGE_TYPE_HALLOSS + damage_type = DAMAGE_TYPE_HALLOSS /obj/item/melee/fluffstuff/wolfgirlsword/dropped(mob/user, flags, atom/newLoc) ..() @@ -1324,7 +1324,7 @@ sharp = 1 edge = 1 icon_state = "[active_state]_sharp" - damtype = DAMAGE_TYPE_BRUTE + damage_type = DAMAGE_TYPE_BRUTE /obj/item/melee/fluffstuff/wolfgirlsword/deactivate(mob/living/user) From efb1c57bb8d754ea0bb362087626c618c67a52a3 Mon Sep 17 00:00:00 2001 From: silicons <2003111+silicons@users.noreply.github.com> Date: Fri, 13 Sep 2024 10:50:11 -0400 Subject: [PATCH 06/20] sharp / edge / damage mode regex (#6747) last regex before #6575 , probably deprecated sharp and edge --- code/__DEFINES/combat/damage.dm | 4 ++- code/__HELPERS/unsorted.dm | 22 +++++++------- .../gamemodes/changeling/powers/armblade.dm | 6 ++-- code/game/gamemodes/cult/cult_items.dm | 3 +- .../technomancer/devices/shield_armor.dm | 3 +- code/game/objects/items.dm | 6 ++-- code/game/objects/items/devices/gps.dm | 3 +- code/game/objects/items/melee/types/misc.dm | 21 +++++-------- .../items/melee/types/ninja_energy_blade.dm | 3 +- .../melee/types/transforming/energy/axe.dm | 3 +- .../types/transforming/energy/ionic_rapier.dm | 3 +- .../objects/items/storage/misc_legacy/misc.dm | 3 +- code/game/objects/items/tools/screwdriver.dm | 2 +- code/game/objects/items/tools/wirecutters.dm | 3 +- .../items/weapons/material/chainsaw.dm | 15 ++++------ .../objects/items/weapons/material/misc.dm | 3 +- .../objects/items/weapons/material/shards.dm | 4 +-- code/game/objects/items/weapons/stunbaton.dm | 2 -- .../objects/items/weapons/surgery_tools.dm | 18 ++++------- .../objects/items/weapons/swords_axes_etc.dm | 7 ++--- code/game/objects/obj.dm | 5 ---- code/modules/blob2/overmind/types.dm | 2 +- code/modules/food/drinks/bottle.dm | 3 +- code/modules/materials/material_sheets.dm | 4 +-- code/modules/mining/tools/kinetic_crusher.dm | 4 +-- code/modules/mining/tools/mine_items.dm | 15 +++------- .../mob/living/carbon/carbon_defense.dm | 10 +++---- .../carbon/human/human-defense-legacy.dm | 8 ++--- .../mob/living/living-defense-legacy.dm | 2 +- .../silicon/robot/dogborg/dog_modules_vr.dm | 3 +- .../subtypes/mechanical/hivebot/hivebot.dm | 3 +- .../simple_mob/subtypes/slime/feral/feral.dm | 2 +- code/modules/paperwork/pen.dm | 9 ++---- code/modules/power/cable.dm | 5 ---- code/modules/power/lighting/lights.dm | 2 +- .../ballistic/microbattery/revolver_cells.dm | 4 +-- .../projectiles/guns/launcher/crossbow.dm | 6 ++-- .../projectiles/guns/launcher/syringe_gun.dm | 4 +-- .../guns/legacy_vr_guns/gunsword.dm | 8 ++--- .../projectiles/guns/projectile/revolver.dm | 3 +- .../projectiles/guns/projectile/shotgun.dm | 3 +- .../projectile/subtypes/beam/beams.dm | 3 +- .../projectile/subtypes/bullets.dm | 30 +++++++++---------- .../projectile/subtypes/bullets_vr.dm | 1 - .../projectiles/projectile/subtypes/hook.dm | 2 +- .../projectiles/projectile/subtypes/pellet.dm | 3 +- .../projectile/subtypes/special.dm | 3 -- code/modules/projectiles/unsorted/magic.dm | 2 +- .../reagents/reagent_containers/syringes.dm | 2 +- code/modules/vore/fluffstuff/custom_items.dm | 11 +------ code/modules/xenoarcheaology/sampling.dm | 2 +- 51 files changed, 107 insertions(+), 191 deletions(-) diff --git a/code/__DEFINES/combat/damage.dm b/code/__DEFINES/combat/damage.dm index f2c4aa85ff6d..4c8bab21d089 100644 --- a/code/__DEFINES/combat/damage.dm +++ b/code/__DEFINES/combat/damage.dm @@ -1,7 +1,7 @@ //* This file is explicitly licensed under the MIT license. *// //* Copyright (c) 2024 Citadel Station Developers *// -//? damage types +//? damage types //* direct damage types; maps to most systems in the game *// @@ -42,6 +42,8 @@ /// pulse lasers, etc, basically blows a crater #define DAMAGE_MODE_ABLATING (1<<2) /// specifically highly-piercing weapons like bullets, even worse than sharp. +/// +/// * for pierce-ness checks, 'sharp withot edge' is fine. having this flag is pretty much second tier of piercing. #define DAMAGE_MODE_PIERCE (1<<3) /// messy, shredded wounds instead of a clean cut / pierce. strong. #define DAMAGE_MODE_SHRED (1<<4) diff --git a/code/__HELPERS/unsorted.dm b/code/__HELPERS/unsorted.dm index 20b933d326dc..e927cff55b24 100644 --- a/code/__HELPERS/unsorted.dm +++ b/code/__HELPERS/unsorted.dm @@ -1003,36 +1003,36 @@ return FALSE /// Whether or not the given item counts as sharp in terms of dealing damage. +// todo: deprecrated /proc/is_sharp(obj/O as obj) if(!O) return FALSE - if(O.sharp) - return TRUE - if(O.edge) - return TRUE if(isitem(O)) var/obj/item/I = O - if(I.damage_mode & DAMAGE_MODE_SHARP) - return TRUE + return I.damage_mode & (DAMAGE_MODE_SHARP | DAMAGE_MODE_EDGE) + else if(istype(O, /obj/projectile)) + var/obj/projectile/proj = O + return proj.damage_mode & (DAMAGE_MODE_SHARP | DAMAGE_MODE_EDGE) return FALSE /// Whether or not the given item counts as cutting with an edge in terms of removing limbs. +// todo: deprecrated /proc/has_edge(obj/O as obj) if(!O) return FALSE - if(O.edge) - return TRUE if(isitem(O)) var/obj/item/I = O - if(I.damage_mode & DAMAGE_MODE_EDGE) - return TRUE + return I.damage_mode & (DAMAGE_MODE_EDGE) + else if(istype(O, /obj/projectile)) + var/obj/projectile/proj = O + return proj.damage_mode & (DAMAGE_MODE_EDGE) return FALSE /// Returns 1 if the given item is capable of popping things like balloons, inflatable barriers, or cutting police tape. /proc/can_puncture(obj/item/W as obj) //For the record, WHAT THE HELL IS THIS METHOD OF DOING IT? if(!W) return FALSE - if(W.sharp) + if(W.damage_mode & DAMAGE_MODE_SHARP) return TRUE return ( \ W.is_screwdriver() || \ diff --git a/code/game/gamemodes/changeling/powers/armblade.dm b/code/game/gamemodes/changeling/powers/armblade.dm index bc89f0efdeff..9946b4d9d0b9 100644 --- a/code/game/gamemodes/changeling/powers/armblade.dm +++ b/code/game/gamemodes/changeling/powers/armblade.dm @@ -123,8 +123,7 @@ icon_state = "arm_blade" damage_force = 40 armor_penetration = 15 - sharp = 1 - edge = 1 + damage_mode = DAMAGE_MODE_SHARP | DAMAGE_MODE_EDGE pry = 1 attack_verb = list("attacked", "slashed", "stabbed", "sliced", "torn", "ripped", "diced", "cut") @@ -150,8 +149,7 @@ desc = "A grotesque claw made out of bone and flesh that cleaves through people as a hot knife through butter." icon_state = "ling_claw" damage_force = 15 - sharp = 1 - edge = 1 + damage_mode = DAMAGE_MODE_SHARP | DAMAGE_MODE_EDGE attack_verb = list("attacked", "slashed", "stabbed", "sliced", "torn", "ripped", "diced", "cut") passive_parry = /datum/passive_parry/melee{ diff --git a/code/game/gamemodes/cult/cult_items.dm b/code/game/gamemodes/cult/cult_items.dm index ca3ed22aa694..13fc46b27a09 100644 --- a/code/game/gamemodes/cult/cult_items.dm +++ b/code/game/gamemodes/cult/cult_items.dm @@ -10,8 +10,7 @@ drop_sound = 'sound/items/drop/sword.ogg' pickup_sound = 'sound/items/pickup/sword.ogg' attack_verb = list("attacked", "slashed", "stabbed", "sliced", "torn", "ripped", "diced", "cut") - edge = 1 - sharp = 1 + damage_mode = DAMAGE_MODE_EDGE | DAMAGE_MODE_SHARP /obj/item/melee/cultblade/cultify() return diff --git a/code/game/gamemodes/technomancer/devices/shield_armor.dm b/code/game/gamemodes/technomancer/devices/shield_armor.dm index c02a431c540c..24a751530f73 100644 --- a/code/game/gamemodes/technomancer/devices/shield_armor.dm +++ b/code/game/gamemodes/technomancer/devices/shield_armor.dm @@ -76,8 +76,7 @@ if(istype(damage_source, /obj/projectile)) var/obj/projectile/P = damage_source - P.sharp = 0 - P.edge = 0 + P.damage_mode &= ~(DAMAGE_MODE_EDGE | DAMAGE_MODE_SHARP | DAMAGE_MODE_SHRED | DAMAGE_MODE_PIERCE) P.embed_chance = 0 if(P.agony) var/agony_blocked = P.agony * (modified_block_percentage / 100) diff --git a/code/game/objects/items.dm b/code/game/objects/items.dm index 4239cb4f9034..903c76c91745 100644 --- a/code/game/objects/items.dm +++ b/code/game/objects/items.dm @@ -194,7 +194,7 @@ origin_tech = typelist(NAMEOF(src, origin_tech), origin_tech) //Potential memory optimization: Making embed chance a getter if unset. if(embed_chance == EMBED_CHANCE_UNSET) - if(sharp) + if(damage_mode & DAMAGE_MODE_SHARP) embed_chance = max(5, round(damage_force/w_class)) else embed_chance = max(5, round(damage_force/(w_class*3))) @@ -786,7 +786,7 @@ modules/mob/living/carbon/human/life.dm if you die, you will be zoomed out. * * strict - require us to be toggled to sharp mode if there's multiple modes of attacking. */ /obj/item/proc/is_sharp(strict) - return sharp || (damage_mode & DAMAGE_MODE_SHARP) + return (damage_mode & DAMAGE_MODE_SHARP) /** * can be edged; even if not being used as such @@ -795,7 +795,7 @@ modules/mob/living/carbon/human/life.dm if you die, you will be zoomed out. * * strict - require us to be toggled to sharp mode if there's multiple modes of attacking. */ /obj/item/proc/is_edge(strict) - return sharp || (damage_mode & DAMAGE_MODE_EDGE) + return (damage_mode & DAMAGE_MODE_EDGE) /** * can be piercing; even if not being used as such diff --git a/code/game/objects/items/devices/gps.dm b/code/game/objects/items/devices/gps.dm index 009374244b8b..a3630e0ebfc6 100644 --- a/code/game/objects/items/devices/gps.dm +++ b/code/game/objects/items/devices/gps.dm @@ -600,8 +600,7 @@ item_state = "knife" damage_force = 15 throw_force = 10 - sharp = 1 - edge = 1 + damage_mode = DAMAGE_MODE_SHARP | DAMAGE_MODE_EDGE w_class = WEIGHT_CLASS_NORMAL origin_tech = list(TECH_COMBAT = 4, TECH_ILLEGAL = 4) attack_verb = list("sliced", "chopped", "stabbed", "pierced") diff --git a/code/game/objects/items/melee/types/misc.dm b/code/game/objects/items/melee/types/misc.dm index 1b5cacd7ce1b..8661f1716890 100644 --- a/code/game/objects/items/melee/types/misc.dm +++ b/code/game/objects/items/melee/types/misc.dm @@ -61,8 +61,7 @@ damage_force = 30 throw_force = 10 w_class = WEIGHT_CLASS_NORMAL - sharp = 1 - edge = 1 + damage_mode = DAMAGE_MODE_SHARP | DAMAGE_MODE_EDGE attack_verb = list("attacked", "slashed", "stabbed", "sliced", "torn", "ripped", "diced", "cut") attack_sound = 'sound/weapons/bladeslice.ogg' can_speak = 1 @@ -155,8 +154,7 @@ damage_force = 30 throw_force = 10 w_class = WEIGHT_CLASS_NORMAL - sharp = 1 - edge = 1 + damage_mode = DAMAGE_MODE_SHARP | DAMAGE_MODE_EDGE reach = 2 attack_verb = list("attacked", "slashed", "stabbed", "sliced", "torn", "ripped", "diced", "cut") attack_sound = 'sound/items/bikehorn.ogg' @@ -182,8 +180,7 @@ damage_force = 30 throw_force = 10 w_class = WEIGHT_CLASS_NORMAL - sharp = 1 - edge = 1 + damage_mode = DAMAGE_MODE_SHARP | DAMAGE_MODE_EDGE attack_verb = list("grasped", "torn", "cut", "pierced", "lashed") attack_sound = 'sound/weapons/bladeslice.ogg' armor_penetration = 10 @@ -227,8 +224,7 @@ w_class = WEIGHT_CLASS_NORMAL slot_flags = SLOT_BELT attack_verb = list("attacked", "slashed", "stabbed", "sliced", "torn", "ripped", "diced", "cut", "chopped") - sharp = 1 - edge = 1 + damage_mode = DAMAGE_MODE_SHARP | DAMAGE_MODE_EDGE /obj/item/melee/ashlander/elder name = "elder bone sword" @@ -313,7 +309,7 @@ damage_force = 8 throw_force = 5 w_class = WEIGHT_CLASS_SMALL - sharp = 1 + damage_mode = DAMAGE_MODE_SHARP //I would like two-handed weapons that don't use our annoying material system, resulting in a "Steel Mjollnir". Drives me crazy. /obj/item/melee/twohanded @@ -359,7 +355,6 @@ force_wielded = 75 force_unwielded = 50 w_class = WEIGHT_CLASS_HUGE - edge = 1 attack_verb = list("attacked", "smashed", "crushed", "wacked", "pounded") armor_penetration = 50 weight = ITEM_WEIGHT_BASELINE @@ -529,8 +524,7 @@ src.damage_type = DAMAGE_TYPE_BURN src.set_weight_class(WEIGHT_CLASS_BULKY) src.attack_sound = 'sound/items/welder.ogg' - src.sharp = 1 - src.edge = 1 + damage_mode = DAMAGE_MODE_SHARP | DAMAGE_MODE_EDGE active = 1 update_icon() else @@ -546,10 +540,9 @@ playsound(loc, deac_sound, 50, 1) src.damage_force = 3 src.damage_type = DAMAGE_TYPE_BRUTE + damage_mode = NONE src.set_weight_class(initial(src.w_class)) src.active = 0 - src.sharp = 0 - src.edge = 0 src.attack_sound = initial(src.attack_sound) update_icon() diff --git a/code/game/objects/items/melee/types/ninja_energy_blade.dm b/code/game/objects/items/melee/types/ninja_energy_blade.dm index c7d110bc483e..24ce9eb2ed1f 100644 --- a/code/game/objects/items/melee/types/ninja_energy_blade.dm +++ b/code/game/objects/items/melee/types/ninja_energy_blade.dm @@ -5,8 +5,7 @@ item_state = "ninja_energy_blade" damage_force = 40 //Normal attacks deal very high damage - about the same as wielded fire axe armor_penetration = 100 - sharp = 1 - edge = 1 + damage_mode = DAMAGE_MODE_SHARP | DAMAGE_MODE_EDGE anchored = 1 // Never spawned outside of inventory, should be fine. throw_force = 1 //Throwing or dropping the item deletes it. throw_speed = 1 diff --git a/code/game/objects/items/melee/types/transforming/energy/axe.dm b/code/game/objects/items/melee/types/transforming/energy/axe.dm index 1bbb22023857..175015f0ab01 100644 --- a/code/game/objects/items/melee/types/transforming/energy/axe.dm +++ b/code/game/objects/items/melee/types/transforming/energy/axe.dm @@ -11,8 +11,7 @@ w_class = WEIGHT_CLASS_NORMAL origin_tech = list(TECH_MAGNET = 3, TECH_COMBAT = 4) attack_verb = list("attacked", "chopped", "cleaved", "torn", "cut") - sharp = 1 - edge = 1 + damage_mode = DAMAGE_MODE_SHARP | DAMAGE_MODE_EDGE can_cleave = TRUE active_damage_force = 60 diff --git a/code/game/objects/items/melee/types/transforming/energy/ionic_rapier.dm b/code/game/objects/items/melee/types/transforming/energy/ionic_rapier.dm index 16c15a514bbe..401b8bae11ab 100644 --- a/code/game/objects/items/melee/types/transforming/energy/ionic_rapier.dm +++ b/code/game/objects/items/melee/types/transforming/energy/ionic_rapier.dm @@ -8,8 +8,7 @@ item_state = "ionrapier" active_damage_force = 10 active_throw_force = 3 - sharp = 1 - edge = 1 + damage_mode = DAMAGE_MODE_SHARP | DAMAGE_MODE_EDGE armor_penetration = 0 atom_flags = NOBLOODY lrange = 2 diff --git a/code/game/objects/items/storage/misc_legacy/misc.dm b/code/game/objects/items/storage/misc_legacy/misc.dm index 4aa010e76c43..7301f5f5281a 100644 --- a/code/game/objects/items/storage/misc_legacy/misc.dm +++ b/code/game/objects/items/storage/misc_legacy/misc.dm @@ -84,8 +84,7 @@ icon_state = "survivalknife" item_state = "knife" max_combined_volume = WEIGHT_VOLUME_TINY * 3 - sharp = 1 - edge = 1 + damage_mode = DAMAGE_MODE_SHARP | DAMAGE_MODE_EDGE damage_force = 15 throw_force = 15 attack_verb = list("stabbed", "chopped", "cut") diff --git a/code/game/objects/items/tools/screwdriver.dm b/code/game/objects/items/tools/screwdriver.dm index 6a063c62cb89..41e66bd2f0a8 100644 --- a/code/game/objects/items/tools/screwdriver.dm +++ b/code/game/objects/items/tools/screwdriver.dm @@ -20,7 +20,7 @@ pickup_sound = 'sound/items/pickup/screwdriver.ogg' materials_base = list(MAT_STEEL = 75) attack_verb = list("stabbed") - sharp = 1 + damage_mode = DAMAGE_MODE_SHARP tool_speed = 1 var/random_color = TRUE diff --git a/code/game/objects/items/tools/wirecutters.dm b/code/game/objects/items/tools/wirecutters.dm index 6378a9be3235..964b6a65cd84 100644 --- a/code/game/objects/items/tools/wirecutters.dm +++ b/code/game/objects/items/tools/wirecutters.dm @@ -20,8 +20,7 @@ tool_sound = 'sound/items/wirecutter.ogg' drop_sound = 'sound/items/drop/wirecutter.ogg' pickup_sound = 'sound/items/pickup/wirecutter.ogg' - sharp = 1 - edge = 1 + damage_mode = DAMAGE_MODE_SHARP | DAMAGE_MODE_EDGE tool_speed = 1 var/random_color = TRUE diff --git a/code/game/objects/items/weapons/material/chainsaw.dm b/code/game/objects/items/weapons/material/chainsaw.dm index 477c05edf2ec..7eb988599536 100644 --- a/code/game/objects/items/weapons/material/chainsaw.dm +++ b/code/game/objects/items/weapons/material/chainsaw.dm @@ -41,8 +41,7 @@ attack_verb = list("shredded", "ripped", "torn") playsound(src, 'sound/weapons/chainsaw_startup.ogg',40,1) damage_force = active_force - edge = 1 - sharp = 1 + damage_mode = DAMAGE_MODE_EDGE | DAMAGE_MODE_SHARP on = 1 update_icon() else @@ -53,8 +52,7 @@ attack_verb = list("bluntly hit", "beat", "knocked") playsound(user, 'sound/weapons/chainsaw_turnoff.ogg',40,1) damage_force = inactive_force - edge = 0 - sharp = 0 + damage_mode = initial(damage_mode) on = 0 update_icon() @@ -125,8 +123,7 @@ damage_force = 30 throw_force = 10 w_class = WEIGHT_CLASS_NORMAL - sharp = 1 - edge = 1 + damage_mode = DAMAGE_MODE_SHARP | DAMAGE_MODE_EDGE attack_verb = list("sawed", "torn", "cut", "chopped", "diced") attack_sound = 'sound/weapons/chainsaw_attack.ogg' armor_penetration = 30 @@ -147,8 +144,7 @@ attack_verb = list("shredded", "ripped", "torn") playsound(src, 'sound/weapons/chainsaw_startup.ogg',40,1) damage_force = active_force - edge = 1 - sharp = 1 + damage_mode = DAMAGE_MODE_EDGE | DAMAGE_MODE_SHARP on = 1 update_icon() else @@ -159,8 +155,7 @@ attack_verb = list("bluntly hit", "beat", "knocked") playsound(user, 'sound/weapons/chainsaw_turnoff.ogg',40,1) damage_force = inactive_force - edge = 0 - sharp = 0 + damage_mode = initial(damage_mode) on = 0 update_icon() diff --git a/code/game/objects/items/weapons/material/misc.dm b/code/game/objects/items/weapons/material/misc.dm index 83e4e728a9d2..fb12e25c4247 100644 --- a/code/game/objects/items/weapons/material/misc.dm +++ b/code/game/objects/items/weapons/material/misc.dm @@ -1,7 +1,6 @@ /obj/item/material/harpoon name = "harpoon" - sharp = 1 - edge = 0 + damage_mode = DAMAGE_MODE_SHARP desc = "A common design throughout the galaxy, this is a metal spear used for hunting fish (or people in voidsuits, to devestating effect)." icon_state = "harpoon" item_state = "harpoon" diff --git a/code/game/objects/items/weapons/material/shards.dm b/code/game/objects/items/weapons/material/shards.dm index 2ef03eb8add6..dac7280dfc0d 100644 --- a/code/game/objects/items/weapons/material/shards.dm +++ b/code/game/objects/items/weapons/material/shards.dm @@ -89,11 +89,11 @@ if(gloves && !protected_hands) to_chat(user, "\The [src] partially cuts into your hand through your gloves as you hit \the [target]!") - user.apply_damage(light_glove_d + will_break ? break_damage : 0, DAMAGE_TYPE_BRUTE, active_hand, 0, 0, src, src.sharp || (damage_mode & DAMAGE_MODE_SHARP), src.edge || (damage_mode & DAMAGE_MODE_EDGE)) // Ternary to include break damage + user.apply_damage(light_glove_d + will_break ? break_damage : 0, DAMAGE_TYPE_BRUTE, active_hand, 0, 0, src, (damage_mode & DAMAGE_MODE_SHARP), (damage_mode & DAMAGE_MODE_EDGE)) // Ternary to include break damage else if(!gloves) to_chat(user, "\The [src] cuts into your hand as you hit \the [target]!") - user.apply_damage(no_glove_d + will_break ? break_damage : 0, DAMAGE_TYPE_BRUTE, active_hand, 0, 0, src, src.sharp || (damage_mode & DAMAGE_MODE_SHARP), src.edge || (damage_mode & DAMAGE_MODE_EDGE)) + user.apply_damage(no_glove_d + will_break ? break_damage : 0, DAMAGE_TYPE_BRUTE, active_hand, 0, 0, src, (damage_mode & DAMAGE_MODE_SHARP), (damage_mode & DAMAGE_MODE_EDGE)) if(will_break && src.loc == user) // If it's not in our hand anymore user.visible_message("[user] hit \the [target] with \the [src], shattering it!", "You shatter \the [src] in your hand!") diff --git a/code/game/objects/items/weapons/stunbaton.dm b/code/game/objects/items/weapons/stunbaton.dm index add625fde68d..843dbb53e749 100644 --- a/code/game/objects/items/weapons/stunbaton.dm +++ b/code/game/objects/items/weapons/stunbaton.dm @@ -8,8 +8,6 @@ rad_flags = RAD_BLOCK_CONTENTS slot_flags = SLOT_BELT damage_force = 15 - sharp = 0 - edge = 0 throw_force = 7 atom_flags = NOCONDUCT w_class = WEIGHT_CLASS_NORMAL diff --git a/code/game/objects/items/weapons/surgery_tools.dm b/code/game/objects/items/weapons/surgery_tools.dm index 8877442b964b..800244bff4ca 100644 --- a/code/game/objects/items/weapons/surgery_tools.dm +++ b/code/game/objects/items/weapons/surgery_tools.dm @@ -81,8 +81,7 @@ desc = "Cut, cut, and once more cut." icon_state = "scalpel" damage_force = 10.0 - sharp = 1 - edge = 1 + damage_mode = DAMAGE_MODE_SHARP | DAMAGE_MODE_EDGE w_class = WEIGHT_CLASS_TINY slot_flags = SLOT_EARS throw_force = 5.0 @@ -153,8 +152,7 @@ origin_tech = list(TECH_MATERIAL = 1, TECH_BIO = 1) materials_base = list(MAT_STEEL = 20000, MAT_GLASS = 10000) attack_verb = list("attacked", "slashed", "sawed", "cut") - sharp = 1 - edge = 1 + damage_mode = DAMAGE_MODE_SHARP | DAMAGE_MODE_EDGE /obj/item/surgical/circular_saw/manager name = "energetic bone diverter" @@ -318,8 +316,7 @@ desc = "Finely knapped glass attached to a carved bone by sinew. It seems like it'd be good at cutting." icon_state = "scalpel_bone" damage_force = 10.0 - sharp = 1 - edge = 1 + damage_mode = DAMAGE_MODE_SHARP | DAMAGE_MODE_EDGE w_class = WEIGHT_CLASS_TINY slot_flags = SLOT_EARS throw_force = 5.0 @@ -342,8 +339,7 @@ icon = 'icons/obj/lavaland.dmi' icon_state = "scalpel_bronze" damage_force = 10.0 - sharp = 1 - edge = 1 + damage_mode = DAMAGE_MODE_SHARP | DAMAGE_MODE_EDGE w_class = WEIGHT_CLASS_TINY slot_flags = SLOT_EARS throw_force = 5.0 @@ -373,8 +369,7 @@ origin_tech = list(TECH_MATERIAL = 1, TECH_BIO = 1) materials_base = list("bone" = 6000, MAT_GLASS = 4000) attack_verb = list("attacked", "slashed", "sawed", "cut") - sharp = 1 - edge = 1 + damage_mode = DAMAGE_MODE_SHARP | DAMAGE_MODE_EDGE /obj/item/surgical/saw_bronze name = "bronze saw" @@ -389,8 +384,7 @@ origin_tech = list(TECH_MATERIAL = 1) materials_base = list("bone" = 6000, MAT_BRONZE = 4000) attack_verb = list("attacked", "slashed", "sawed", "cut") - sharp = 1 - edge = 1 + damage_mode = DAMAGE_MODE_SHARP | DAMAGE_MODE_EDGE /obj/item/surgical/bonesetter_primitive name = "primitive bone setter" diff --git a/code/game/objects/items/weapons/swords_axes_etc.dm b/code/game/objects/items/weapons/swords_axes_etc.dm index 63b12ff5d9c0..c1bb323054fb 100644 --- a/code/game/objects/items/weapons/swords_axes_etc.dm +++ b/code/game/objects/items/weapons/swords_axes_etc.dm @@ -147,8 +147,7 @@ ) item_state = "armblade" damage_force = 15 // same damage_force as a drill - sharp = TRUE - edge = TRUE + damage_mode = DAMAGE_MODE_SHARP | DAMAGE_MODE_EDGE var/SA_bonus_damage = 35 // 50 total against animals and aberrations. var/SA_vulnerability = MOB_CLASS_ANIMAL | MOB_CLASS_ABERRATION @@ -173,8 +172,7 @@ damage_force = 5 // HAVING A STICK JAMMED INTO YOU IS LIKELY BAD FOR YOUR HEALTH // well to be fair most of the damage comes from the embed not the stab w_class = WEIGHT_CLASS_SMALL materials_base = list(MAT_STEEL = 2500) - sharp = TRUE - edge = TRUE + damage_mode = DAMAGE_MODE_EDGE | DAMAGE_MODE_SHARP icon_state = "embed_spike" item_icons = list( SLOT_ID_LEFT_HAND = 'icons/mob/items/lefthand_material.dmi', @@ -312,7 +310,6 @@ damage_force = 15 damage_tier = MELEE_TIER_MEDIUM slot_flags = SLOT_BACK - sharp = 1 attack_sound = "swing_hit" attack_verb = list("smashed", "slammed", "whacked", "thwacked") icon_state = "bostaff0" diff --git a/code/game/objects/obj.dm b/code/game/objects/obj.dm index 8784f12371f3..848001c470c9 100644 --- a/code/game/objects/obj.dm +++ b/code/game/objects/obj.dm @@ -203,11 +203,6 @@ /// Set when a player renames a renamable object. var/renamed_by_player = FALSE var/w_class // Size of the object. - //! LEGACY: DO NOT USE - var/sharp = 0 // whether this object cuts - //! LEGACY: DO NOT USE - var/edge = 0 // whether this object is more likely to dismember - //! LEGACY: DO NOT USE var/pry = 0 //Used in attackby() to open doors //! LEGACY: DO NOT USE var/in_use = 0 // If we have a user using us, this will be set on. We will check if the user has stopped using us, and thus stop updating and LAGGING EVERYTHING! diff --git a/code/modules/blob2/overmind/types.dm b/code/modules/blob2/overmind/types.dm index ec8ba27683b6..58a1fec48681 100644 --- a/code/modules/blob2/overmind/types.dm +++ b/code/modules/blob2/overmind/types.dm @@ -629,7 +629,7 @@ if(!H.drop_item_to_ground(I)) B.visible_message(SPAN_DANGER("[name] heaves and pulls at [H]'s [I], struggling to pull it from their grip!")) return ..() - if((I.sharp || I.edge || (I.damage_mode & (DAMAGE_MODE_SHARP | DAMAGE_MODE_EDGE))) && !istype(I, /obj/item/gun)) + if(((I.damage_mode & (DAMAGE_MODE_SHARP | DAMAGE_MODE_EDGE))) && !istype(I, /obj/item/gun)) I.forceMove(get_turf(B)) // Disarmed entirely. B.visible_message("The [name] heaves, \the [attacker]'s weapon becoming stuck in the churning mass!") else diff --git a/code/modules/food/drinks/bottle.dm b/code/modules/food/drinks/bottle.dm index 606531dcaec3..de52e6a5082d 100644 --- a/code/modules/food/drinks/bottle.dm +++ b/code/modules/food/drinks/bottle.dm @@ -189,8 +189,7 @@ item_state = "beer" atom_flags = NOCONDUCT attack_verb = list("stabbed", "slashed", "attacked") - sharp = 1 - edge = 0 + damage_mode = DAMAGE_MODE_SHARP var/icon/broken_outline = icon('icons/obj/drinks.dmi', "broken") /obj/item/reagent_containers/food/drinks/bottle/redeemersbrew diff --git a/code/modules/materials/material_sheets.dm b/code/modules/materials/material_sheets.dm index 4eab8536f577..8fb9f06f477c 100644 --- a/code/modules/materials/material_sheets.dm +++ b/code/modules/materials/material_sheets.dm @@ -393,7 +393,7 @@ /obj/item/stack/material/log/attackby(obj/item/I, mob/living/user, list/params, clickchain_flags, damage_multiplier) if(!istype(I) || I.damage_force <= 0) return ..() - if(CHECK_MULTIPLE_BITFIELDS(I.damage_mode, DAMAGE_MODE_EDGE | DAMAGE_MODE_SHARP) || (I.edge && I.sharp)) + if(CHECK_MULTIPLE_BITFIELDS(I.damage_mode, DAMAGE_MODE_EDGE | DAMAGE_MODE_SHARP)) var/time = (3 SECONDS / max(I.damage_force / 10, 1)) * I.tool_speed user.setClickCooldown(time) if(do_after(user, time, src) && use(1)) @@ -424,7 +424,7 @@ /obj/item/stack/material/log/ironwood/attackby(obj/item/I, mob/living/user, list/params, clickchain_flags, damage_multiplier) if(!istype(I) || I.damage_force <= 20) //You will need at least PLASTEEL Tools to cut this. return ..() - if(CHECK_MULTIPLE_BITFIELDS(I.damage_mode, DAMAGE_MODE_EDGE | DAMAGE_MODE_SHARP) || (I.edge && I.sharp)) + if(CHECK_MULTIPLE_BITFIELDS(I.damage_mode, DAMAGE_MODE_EDGE | DAMAGE_MODE_SHARP)) var/time = (3 SECONDS / max(I.damage_force / 10, 1)) * I.tool_speed user.setClickCooldown(time) if(do_after(user, time, src) && use(1)) diff --git a/code/modules/mining/tools/kinetic_crusher.dm b/code/modules/mining/tools/kinetic_crusher.dm index 149841982a7c..1986137c3c76 100644 --- a/code/modules/mining/tools/kinetic_crusher.dm +++ b/code/modules/mining/tools/kinetic_crusher.dm @@ -21,9 +21,7 @@ */ attack_sound = 'sound/weapons/bladeslice.ogg' attack_verb = list("smashed", "crushed", "cleaved", "chopped", "pulped") - sharp = TRUE - edge = TRUE - // sharpness = SHARP_EDGED + damage_mode = DAMAGE_MODE_SHARP | DAMAGE_MODE_EDGE item_action_name = "Toggle Light" light_wedge = LIGHT_WIDE // actions_types = list(/datum/action/item_action/toggle_light) diff --git a/code/modules/mining/tools/mine_items.dm b/code/modules/mining/tools/mine_items.dm index 0f5ad496300e..499d2e7f9276 100644 --- a/code/modules/mining/tools/mine_items.dm +++ b/code/modules/mining/tools/mine_items.dm @@ -29,7 +29,7 @@ attack_verb = list("hit", "pierced", "sliced", "attacked") var/drill_sound = 'sound/weapons/Genhit.ogg' var/drill_verb = "drilling" - sharp = 1 + damage_mode = DAMAGE_MODE_SHARP var/active = 1 var/excavation_amount = 200 @@ -100,8 +100,7 @@ desc = "A rock cutter that uses bursts of hot plasma. You could use it to cut limbs off of xenos! Or, you know, mine stuff." drill_verb = "cutting" drill_sound = 'sound/items/Welder.ogg' - sharp = 1 - edge = 1 + damage_mode = DAMAGE_MODE_SHARP | DAMAGE_MODE_EDGE worth_intrinsic = 175 /obj/item/pickaxe/diamond @@ -147,7 +146,6 @@ origin_tech = list(TECH_MATERIAL = 1, TECH_ENGINEERING = 1) attack_verb = list("mined", "pierced", "stabbed", "attacked") drill_verb = "picking" - sharp = 1 worth_intrinsic = 75 //Snowflake drill that works like a chainsaw! How fun. Honestly they should probably all work like this or something. I dunno. Might be a fun mining overhaul later. @@ -194,8 +192,6 @@ playsound(src, 'sound/weapons/chainsaw_startup.ogg',40,1) damage_force = 15 damage_mode |= DAMAGE_MODE_SHARP | DAMAGE_MODE_EDGE - edge = TRUE - sharp = TRUE active = TRUE update_icon() else @@ -208,8 +204,6 @@ playsound(user, 'sound/weapons/chainsaw_turnoff.ogg',40,1) damage_force = 3 damage_mode = initial(damage_mode) - edge = FALSE - sharp = FALSE active = FALSE update_icon() @@ -290,8 +284,7 @@ origin_tech = list(TECH_MATERIAL = 1, TECH_ENGINEERING = 1) materials_base = list(MAT_STEEL = 50) attack_verb = list("bashed", "bludgeoned", "thrashed", "whacked") - sharp = 0 - edge = 1 + damage_mode = DAMAGE_MODE_EDGE worth_intrinsic = 50 var/digspeed = 40 @@ -304,7 +297,7 @@ throw_force = 12 tool_speed = 0.7 attack_verb = list("slashed", "impaled", "stabbed", "sliced") - sharp = 1 + damage_mode = DAMAGE_MODE_SHARP | DAMAGE_MODE_EDGE /obj/item/shovel/bronze name = "bronze shovel" diff --git a/code/modules/mob/living/carbon/carbon_defense.dm b/code/modules/mob/living/carbon/carbon_defense.dm index 039154fa083a..847c11bb9ea3 100644 --- a/code/modules/mob/living/carbon/carbon_defense.dm +++ b/code/modules/mob/living/carbon/carbon_defense.dm @@ -102,7 +102,7 @@ // Knifing /mob/living/carbon/proc/attack_throat(obj/item/W, obj/item/grab/G, mob/user) - if(!((W.damage_mode & DAMAGE_MODE_EDGE) || W.edge) || !W.damage_force || W.damage_type != DAMAGE_TYPE_BRUTE) + if(!(W.damage_mode & DAMAGE_MODE_EDGE) || !W.damage_force || W.damage_type != DAMAGE_TYPE_BRUTE) return 0 //unsuitable weapon user.visible_message("\The [user] begins to slit [src]'s throat with \the [W]!") @@ -123,7 +123,7 @@ var/total_damage = 0 for(var/i in 1 to 3) var/damage = min(W.damage_force*1.5, 20)*damage_mod - apply_damage(damage, W.damage_type, "head", 0, sharp=W.sharp||(W.damage_mode & DAMAGE_MODE_EDGE), edge=W.edge||(W.damage_mode & DAMAGE_MODE_EDGE)) + apply_damage(damage, W.damage_type, "head", 0, sharp = (W.damage_mode & DAMAGE_MODE_EDGE), edge = (W.damage_mode & DAMAGE_MODE_EDGE)) total_damage += damage var/oxyloss = total_damage @@ -150,13 +150,13 @@ /mob/living/carbon/proc/shank_attack(obj/item/W, obj/item/grab/G, mob/user, hit_zone) - if(!(W.sharp || (W.damage_mode & DAMAGE_MODE_SHARP)) || !W.damage_force || W.damage_type != DAMAGE_TYPE_BRUTE) + if(!(W.damage_mode & DAMAGE_MODE_SHARP) || !W.damage_force || W.damage_type != DAMAGE_TYPE_BRUTE) return 0 //unsuitable weapon user.visible_message("\The [user] plunges \the [W] into \the [src]!") var/damage = shank_armor_helper(W, G, user) - apply_damage(damage, W.damage_type, "torso", 0, sharp=W.sharp||(W.damage_mode & DAMAGE_MODE_EDGE), edge=W.edge||(W.damage_mode & DAMAGE_MODE_EDGE)) + apply_damage(damage, W.damage_type, "torso", 0, sharp = (W.damage_mode & DAMAGE_MODE_EDGE), edge = (W.damage_mode & DAMAGE_MODE_EDGE)) if(W.attack_sound) playsound(loc, W.attack_sound, 50, 1, -1) @@ -168,7 +168,7 @@ /mob/living/carbon/proc/shank_armor_helper(obj/item/W, obj/item/grab/G, mob/user) var/damage = W.damage_force var/damage_mod = 1 - if(W.edge || (W.damage_mode & DAMAGE_MODE_EDGE)) + if(W.damage_mode & DAMAGE_MODE_EDGE) damage = damage * 1.25 //small damage bonus for having sharp and edge var/obj/item/clothing/suit/worn_suit diff --git a/code/modules/mob/living/carbon/human/human-defense-legacy.dm b/code/modules/mob/living/carbon/human/human-defense-legacy.dm index cc719d39f3cf..5e0f68cf84ea 100644 --- a/code/modules/mob/living/carbon/human/human-defense-legacy.dm +++ b/code/modules/mob/living/carbon/human/human-defense-legacy.dm @@ -321,7 +321,7 @@ if(isitem(AM)) var/obj/item/impacting_item = AM dtype = impacting_item.damage_type - + var/throw_damage = O.throw_force * TT.get_damage_multiplier(src) var/zone @@ -412,7 +412,7 @@ if(!O || !src) return - if(O.loc == src && O.sharp) //Projectile is embedded and suitable for pinning. + if(O.loc == src && is_sharp(O)) //Projectile is embedded and suitable for pinning. var/turf/T = near_wall(dir,2) if(T) forceMove(T) @@ -439,7 +439,7 @@ // Alright, our hand works? Time to try the catching. var/catch_chance = 90 // Default 90% catch rate - if(O.sharp) + if(is_sharp(O)) catch_chance -= 50 // Catching knives is hard catch_chance -= get_accuracy_penalty() // Same issues with shooting a gun, or swinging a weapon @@ -553,7 +553,7 @@ var/damage = shank_armor_helper(W, G, user) var/obj/item/organ/external/chest = get_organ(hit_zone) - if(W.edge || (W.damage_mode & DAMAGE_MODE_EDGE)) + if(W.damage_mode & DAMAGE_MODE_EDGE) organ_chance = 75 user.next_move = world.time + 20 user.visible_message("\The [user] begins to twist \the [W] around inside [src]'s [chest]!") diff --git a/code/modules/mob/living/living-defense-legacy.dm b/code/modules/mob/living/living-defense-legacy.dm index f6e64eaed3a5..fa82ae3cf12c 100644 --- a/code/modules/mob/living/living-defense-legacy.dm +++ b/code/modules/mob/living/living-defense-legacy.dm @@ -293,7 +293,7 @@ if(!O || !src) return - if(O.sharp) //Projectile is suitable for pinning. + if(is_sharp(O)) //Projectile is suitable for pinning. if(soaked >= round(throw_damage*0.8)) return diff --git a/code/modules/mob/living/silicon/robot/dogborg/dog_modules_vr.dm b/code/modules/mob/living/silicon/robot/dogborg/dog_modules_vr.dm index 30f9696a3088..c061d3a0c495 100644 --- a/code/modules/mob/living/silicon/robot/dogborg/dog_modules_vr.dm +++ b/code/modules/mob/living/silicon/robot/dogborg/dog_modules_vr.dm @@ -335,8 +335,7 @@ icon_state = "swordtail" desc = "A glowing pink dagger normally attached to the end of a cyborg's tail. It appears to be extremely sharp." damage_force = 20 //Takes 5 hits to 100-0 - sharp = 1 - edge = 1 + damage_mode = DAMAGE_MODE_SHARP | DAMAGE_MODE_EDGE throw_force = 0 //This shouldn't be thrown in the first place. attack_sound = 'sound/weapons/blade1.ogg' attack_verb = list("slashed", "stabbed", "jabbed", "mauled", "sliced") diff --git a/code/modules/mob/living/simple_mob/subtypes/mechanical/hivebot/hivebot.dm b/code/modules/mob/living/simple_mob/subtypes/mechanical/hivebot/hivebot.dm index dc0d7a6f28be..bb7d0526eeec 100644 --- a/code/modules/mob/living/simple_mob/subtypes/mechanical/hivebot/hivebot.dm +++ b/code/modules/mob/living/simple_mob/subtypes/mechanical/hivebot/hivebot.dm @@ -56,8 +56,7 @@ /obj/projectile/bullet/hivebot damage_force = 10 damage_type = DAMAGE_TYPE_BRUTE - sharp = FALSE - edge = FALSE + damage_mode = NONE /mob/living/simple_mob/mechanical/hivebot/swarm name = "swarm hivebot" diff --git a/code/modules/mob/living/simple_mob/subtypes/slime/feral/feral.dm b/code/modules/mob/living/simple_mob/subtypes/slime/feral/feral.dm index f96303e4280c..394c54caed3a 100644 --- a/code/modules/mob/living/simple_mob/subtypes/slime/feral/feral.dm +++ b/code/modules/mob/living/simple_mob/subtypes/slime/feral/feral.dm @@ -71,7 +71,7 @@ speed = 7.5 * WORLD_ICON_SIZE icon_scale_x = 2 // It hits like a truck. icon_scale_y = 2 - sharp = TRUE + damage_mode = DAMAGE_MODE_SHARP | DAMAGE_MODE_PIERCE /obj/projectile/icicle/on_impact(atom/target, impact_flags, def_zone, efficiency) . = ..() diff --git a/code/modules/paperwork/pen.dm b/code/modules/paperwork/pen.dm index 7315a0a90a86..4c69cc9342f4 100644 --- a/code/modules/paperwork/pen.dm +++ b/code/modules/paperwork/pen.dm @@ -185,11 +185,7 @@ embed_chance = active_embed_chance damage_force = active_force throw_force = active_throwforce - - - - sharp = 1 - edge = 1 + damage_mode = DAMAGE_MODE_SHARP | DAMAGE_MODE_EDGE set_weight_class(active_w_class) playsound(src, 'sound/weapons/saberon.ogg', 15, 1) damage_type = DAMAGE_TYPE_SEARING @@ -211,8 +207,7 @@ embed_chance = initial(embed_chance) damage_force = initial(damage_force) throw_force = initial(throw_force) - sharp = initial(sharp) - edge = initial(edge) + damage_mode = initial(damage_mode) set_weight_class(initial(w_class)) damage_type = DAMAGE_TYPE_BRUTE item_flags &= ~ITEM_THROW_UNCATCHABLE diff --git a/code/modules/power/cable.dm b/code/modules/power/cable.dm index e0d015625a91..079aaea6ac96 100644 --- a/code/modules/power/cable.dm +++ b/code/modules/power/cable.dm @@ -979,11 +979,6 @@ GLOBAL_LIST_INIT(possible_cable_coil_colours, list( /obj/item/stack/cable_coil/alien/Initialize(mapload, new_amount, merge, param_color) . = ..() - if(embed_chance == -1) //From /obj/item, don't want to do what the normal cable_coil does - if(sharp) - embed_chance = damage_force/w_class - else - embed_chance = damage_force/(w_class*3) update_icon() remove_obj_verb(src, /obj/item/stack/cable_coil/verb/make_restraint) diff --git a/code/modules/power/lighting/lights.dm b/code/modules/power/lighting/lights.dm index cd1dddcda2ff..1e5992b37e1a 100644 --- a/code/modules/power/lighting/lights.dm +++ b/code/modules/power/lighting/lights.dm @@ -279,7 +279,7 @@ ) status = LIGHT_BROKEN damage_force = 5 - sharp = 1 + damage_mode |= DAMAGE_MODE_SHARP playsound(src.loc, 'sound/effects/Glasshit.ogg', 75, TRUE) update_icon() diff --git a/code/modules/projectiles/guns/ballistic/microbattery/revolver_cells.dm b/code/modules/projectiles/guns/ballistic/microbattery/revolver_cells.dm index dd98d6edcfec..6eaa9bab62c1 100644 --- a/code/modules/projectiles/guns/ballistic/microbattery/revolver_cells.dm +++ b/code/modules/projectiles/guns/ballistic/microbattery/revolver_cells.dm @@ -41,7 +41,7 @@ agony = 20 pellets = 6 //number of pellets embed_chance = 0 - sharp = 0 + damage_mode = NONE damage_flag = ARMOR_MELEE /obj/item/ammo_casing/microbattery/combat/ion @@ -61,7 +61,7 @@ nodamage = 1 agony = 5 embed_chance = 0 - sharp = 0 + damage_mode = NONE damage_flag = ARMOR_MELEE /obj/projectile/bullet/stripper/on_impact(atom/target, impact_flags, def_zone, efficiency) diff --git a/code/modules/projectiles/guns/launcher/crossbow.dm b/code/modules/projectiles/guns/launcher/crossbow.dm index 6738cc275a10..87f550386acb 100644 --- a/code/modules/projectiles/guns/launcher/crossbow.dm +++ b/code/modules/projectiles/guns/launcher/crossbow.dm @@ -10,8 +10,7 @@ pickup_sound = 'sound/items/pickup/sword.ogg' throw_force = 8 w_class = WEIGHT_CLASS_NORMAL - sharp = 1 - edge = 0 + damage_mode = DAMAGE_MODE_SHARP /obj/item/arrow/proc/removed() //Helper for metal rods falling apart. return @@ -19,8 +18,7 @@ /obj/item/spike name = "alloy spike" desc = "It's about a foot of weird silver metal with a wicked point." - sharp = 1 - edge = 0 + damage_mode = DAMAGE_MODE_SHARP throw_force = 5 w_class = WEIGHT_CLASS_SMALL icon = 'icons/obj/weapons.dmi' diff --git a/code/modules/projectiles/guns/launcher/syringe_gun.dm b/code/modules/projectiles/guns/launcher/syringe_gun.dm index 4461b6a2c85e..53d2e8aee2dc 100644 --- a/code/modules/projectiles/guns/launcher/syringe_gun.dm +++ b/code/modules/projectiles/guns/launcher/syringe_gun.dm @@ -23,7 +23,7 @@ return syringe = I to_chat(user, "You carefully insert [syringe] into [src].") - sharp = 1 + damage_mode |= DAMAGE_MODE_SHARP name = "syringe dart" update_icon() @@ -36,7 +36,7 @@ playsound(src, 'sound/weapons/empty.ogg', 50, 1) user.grab_item_from_interacted_with(syringe, src) syringe = null - sharp = initial(sharp) + damage_mode &= ~DAMAGE_MODE_SHARP name = initial(name) update_icon() diff --git a/code/modules/projectiles/guns/legacy_vr_guns/gunsword.dm b/code/modules/projectiles/guns/legacy_vr_guns/gunsword.dm index 602c2d9913cd..359c891654a6 100644 --- a/code/modules/projectiles/guns/legacy_vr_guns/gunsword.dm +++ b/code/modules/projectiles/guns/legacy_vr_guns/gunsword.dm @@ -49,8 +49,6 @@ var/active_throwforce = 20 var/active_w_class = WEIGHT_CLASS_BULKY var/active_embed_chance = 0 //In the off chance one of these is supposed to embed, you can just tweak this var - sharp = 0 - edge = 0 armor_penetration = 50 atom_flags = NOBLOODY var/lrange = 2 @@ -67,8 +65,7 @@ embed_chance = active_embed_chance damage_force = active_force throw_force = active_throwforce - sharp = 1 - edge = 1 + damage_mode = DAMAGE_MODE_SHARP | DAMAGE_MODE_EDGE set_weight_class(active_w_class) playsound(user, 'sound/weapons/saberon.ogg', 50, 1) set_light(lrange, lpower, lcolor) @@ -86,8 +83,7 @@ embed_chance = initial(embed_chance) damage_force = initial(damage_force) throw_force = initial(throw_force) - sharp = initial(sharp) - edge = initial(edge) + damage_mode = initial(damage_mode) set_weight_class(initial(w_class)) set_light(0,0) attack_verb = list() diff --git a/code/modules/projectiles/guns/projectile/revolver.dm b/code/modules/projectiles/guns/projectile/revolver.dm index 66e7d6bf471d..73c2d28eb987 100644 --- a/code/modules/projectiles/guns/projectile/revolver.dm +++ b/code/modules/projectiles/guns/projectile/revolver.dm @@ -58,8 +58,7 @@ caliber = /datum/ammo_caliber/a38 ammo_type = /obj/item/ammo_casing/a38 damage_force = 15 - sharp = 1 - edge = 1 + damage_mode = DAMAGE_MODE_SHARP | DAMAGE_MODE_EDGE /obj/item/gun/ballistic/revolver/detective name = "revolver" diff --git a/code/modules/projectiles/guns/projectile/shotgun.dm b/code/modules/projectiles/guns/projectile/shotgun.dm index 96bd6b3fbd2f..f2c8a944a3eb 100644 --- a/code/modules/projectiles/guns/projectile/shotgun.dm +++ b/code/modules/projectiles/guns/projectile/shotgun.dm @@ -318,8 +318,7 @@ damage_force = 25 slot_flags = SLOT_BACK origin_tech = list(TECH_COMBAT = 4, TECH_MATERIAL = 2, TECH_OCCULT = 1) - sharp = 1 - edge = 1 + damage_mode = DAMAGE_MODE_SHARP | DAMAGE_MODE_EDGE holy = TRUE /obj/item/gun/ballistic/shotgun/underslung diff --git a/code/modules/projectiles/projectile/subtypes/beam/beams.dm b/code/modules/projectiles/projectile/subtypes/beam/beams.dm index b08394520360..7a95311c1a2c 100644 --- a/code/modules/projectiles/projectile/subtypes/beam/beams.dm +++ b/code/modules/projectiles/projectile/subtypes/beam/beams.dm @@ -139,7 +139,7 @@ muzzle_type = /obj/effect/projectile/muzzle/darkmatter tracer_type = /obj/effect/projectile/tracer/darkmatter - impact_type = /obj/effect/projectile/impact/darkmatter + impact_type = /obj/effect/projectile/impact/darkmatter /obj/projectile/beam/emitter name = "emitter beam" @@ -330,7 +330,6 @@ icon_state = "laser" damage_force = 15 damage_type = DAMAGE_TYPE_ELECTROCUTE //You should be safe inside a voidsuit - sharp = FALSE //"Wide" spectrum beam light_color = "#A9980A" excavation_amount = 200 // Good at shooting rocks diff --git a/code/modules/projectiles/projectile/subtypes/bullets.dm b/code/modules/projectiles/projectile/subtypes/bullets.dm index 69ca1e19592b..9e0667d73268 100644 --- a/code/modules/projectiles/projectile/subtypes/bullets.dm +++ b/code/modules/projectiles/projectile/subtypes/bullets.dm @@ -7,7 +7,7 @@ nodamage = 0 damage_flag = ARMOR_BULLET embed_chance = 20 //Modified in the actual embed process, but this should keep embed chance about the same - sharp = 1 + damage_mode = DAMAGE_MODE_SHARP | DAMAGE_MODE_PIERCE projectile_type = PROJECTILE_TYPE_KINETIC muzzle_type = /obj/effect/projectile/muzzle/bullet @@ -123,23 +123,22 @@ embed_chance = -1 holy = TRUE -/obj/projectile/bullet/pistol/rubber/strong // "Rubber" bullets for high power pistols. - fire_sound = 'sound/weapons/weaponsounds_heavypistolshot.ogg' // Rubber shots have less powder, but these still have more punch than normal rubber shot. - damage_force = 10 - agony = 60 - embed_chance = 0 - sharp = 0 - damage_flag = ARMOR_MELEE - /obj/projectile/bullet/pistol/rubber // "Rubber" bullets for all other pistols. name = "rubber bullet" damage_force = 5 agony = 40 embed_chance = 0 - sharp = 0 + damage_mode = NONE damage_flag = ARMOR_MELEE fire_sound ='sound/weapons/weaponsounds_smallpistolshot.ogg' // It may be rubber shots but it's still a gun homie it shouldn't be as pathetic as it was +/obj/projectile/bullet/pistol/rubber/strong // "Rubber" bullets for high power pistols. + fire_sound = 'sound/weapons/weaponsounds_heavypistolshot.ogg' // Rubber shots have less powder, but these still have more punch than normal rubber shot. + damage_force = 10 + agony = 60 + embed_chance = 0 + damage_flag = ARMOR_MELEE + /obj/projectile/bullet/pistol/spin // Special weak ammo for Service Spin mode. fire_sound = 'sound/weapons/weaponsounds_smallpistolshot.ogg' damage_force = 5 @@ -160,7 +159,7 @@ damage_force = 20 agony = 60 embed_chance = 0 - sharp = 0 + damage_mode = NONE damage_flag = ARMOR_MELEE //Should do about 80 damage at 1 tile distance (adjacent), and 50 damage at 3 tiles distance. @@ -207,7 +206,7 @@ fire_sound = 'sound/weapons/gunshot/gunshot_tech_huge.ogg' damage_force = 15 embed_chance = 0 - sharp = 0 + damage_mode = NONE damage_flag = ARMOR_MELEE combustion = FALSE @@ -339,7 +338,7 @@ fire_sound = 'sound/soundbytes/effects/explosion/explosion1.ogg' damage_force = 20 embed_chance = 0 - edge = 1 + damage_mode = DAMAGE_MODE_EDGE /obj/projectile/bullet/burstbullet/on_impact(atom/target, impact_flags, def_zone, efficiency) . = ..() @@ -353,7 +352,6 @@ fire_sound = 'sound/soundbytes/effects/explosion/explosion1.ogg' damage_force = 20 embed_chance = 0 - edge = 1 SA_bonus_damage = 40 // 60 total damage against demons. SA_vulnerability = MOB_CLASS_DEMONIC | MOB_CLASS_ABERRATION holy = TRUE @@ -522,7 +520,7 @@ damage_force = 0 nodamage = 1 embed_chance = 0 - sharp = 0 + damage_mode = NONE incendiary = 1 flammability = 4 @@ -539,7 +537,7 @@ damage_force = 0 nodamage = 1 embed_chance = 0 - sharp = 0 + damage_mode = NONE /obj/projectile/bullet/blank/cap/process(delta_time) loc = null diff --git a/code/modules/projectiles/projectile/subtypes/bullets_vr.dm b/code/modules/projectiles/projectile/subtypes/bullets_vr.dm index d0fbfd4ed022..72a7e83da266 100644 --- a/code/modules/projectiles/projectile/subtypes/bullets_vr.dm +++ b/code/modules/projectiles/projectile/subtypes/bullets_vr.dm @@ -2,7 +2,6 @@ damage_force = 10 agony = 60 embed_chance = 0 - sharp = 0 damage_flag = ARMOR_MELEE /obj/projectile/energy/flash/strong diff --git a/code/modules/projectiles/projectile/subtypes/hook.dm b/code/modules/projectiles/projectile/subtypes/hook.dm index 0929b49a84da..65eeec07a86e 100644 --- a/code/modules/projectiles/projectile/subtypes/hook.dm +++ b/code/modules/projectiles/projectile/subtypes/hook.dm @@ -40,7 +40,7 @@ if(INTENT_HARM) damage_flag = ARMOR_BULLET damage_force *= 3 - sharp = 1 + damage_mode |= DAMAGE_MODE_SHARP agony = 20 if(INTENT_GRAB) damage_flag = ARMOR_MELEE diff --git a/code/modules/projectiles/projectile/subtypes/pellet.dm b/code/modules/projectiles/projectile/subtypes/pellet.dm index 5be41a1006ae..3335b3859ba1 100644 --- a/code/modules/projectiles/projectile/subtypes/pellet.dm +++ b/code/modules/projectiles/projectile/subtypes/pellet.dm @@ -120,8 +120,7 @@ name = "stingball shrapnel" damage_force = 3 agony = 8 - sharp = FALSE - edge = FALSE + damage_mode = NONE damage_flag = ARMOR_MELEE /obj/projectile/bullet/pellet/fragment/rubber/strong diff --git a/code/modules/projectiles/projectile/subtypes/special.dm b/code/modules/projectiles/projectile/subtypes/special.dm index 7eef692d2f94..4b12b1b70855 100644 --- a/code/modules/projectiles/projectile/subtypes/special.dm +++ b/code/modules/projectiles/projectile/subtypes/special.dm @@ -41,9 +41,6 @@ icon_state= "bolter" damage_force = 50 damage_flag = ARMOR_BULLET - sharp = 1 - edge = 1 - /obj/projectile/bullet/gyro/on_impact(atom/target, impact_flags, def_zone, efficiency) . = ..() if(. & PROJECTILE_IMPACT_FLAGS_UNCONDITIONAL_ABORT) diff --git a/code/modules/projectiles/unsorted/magic.dm b/code/modules/projectiles/unsorted/magic.dm index 2783e38b19d5..591456b22987 100644 --- a/code/modules/projectiles/unsorted/magic.dm +++ b/code/modules/projectiles/unsorted/magic.dm @@ -309,7 +309,7 @@ icon_state = "lavastaff" damage_force = 15 damage_type = DAMAGE_TYPE_BURN - sharp = TRUE + damage_mode = DAMAGE_MODE_SHARP | DAMAGE_MODE_EDGE magic = TRUE /obj/projectile/magic/spellblade/on_impact(atom/target, impact_flags, def_zone, efficiency) diff --git a/code/modules/reagents/reagent_containers/syringes.dm b/code/modules/reagents/reagent_containers/syringes.dm index 0d68bfa56c6f..7e3e8033072b 100644 --- a/code/modules/reagents/reagent_containers/syringes.dm +++ b/code/modules/reagents/reagent_containers/syringes.dm @@ -14,7 +14,7 @@ volume = 15 w_class = WEIGHT_CLASS_TINY slot_flags = SLOT_EARS - sharp = 1 + damage_mode = DAMAGE_MODE_SHARP integrity_flags = INTEGRITY_ACIDPROOF rad_flags = RAD_NO_CONTAMINATE item_flags = ITEM_NOBLUDGEON | ITEM_ENCUMBERS_WHILE_HELD | ITEM_EASY_LATHE_DECONSTRUCT diff --git a/code/modules/vore/fluffstuff/custom_items.dm b/code/modules/vore/fluffstuff/custom_items.dm index efcccd152050..692171b3e864 100644 --- a/code/modules/vore/fluffstuff/custom_items.dm +++ b/code/modules/vore/fluffstuff/custom_items.dm @@ -1138,8 +1138,6 @@ icon_state = "stunstaff00" var/base_icon = "stunstaff" damage_force = 5 - sharp = 0 - edge = 0 throw_force = 7 w_class = WEIGHT_CLASS_HUGE origin_tech = list(TECH_COMBAT = 2) @@ -1234,8 +1232,6 @@ var/active_throwforce var/active_w_class var/active_embed_chance = 0 - sharp = 0 - edge = 0 /obj/item/melee/fluffstuff/proc/activate(mob/living/user) if(active) @@ -1244,8 +1240,6 @@ embed_chance = active_embed_chance damage_force = active_force throw_force = active_throwforce - sharp = 1 - edge = 1 set_weight_class(active_w_class) playsound(user, 'sound/weapons/sparkle.ogg', 50, 1) @@ -1257,8 +1251,6 @@ embed_chance = initial(embed_chance) damage_force = initial(damage_force) throw_force = initial(throw_force) - sharp = initial(sharp) - edge = initial(edge) set_weight_class(initial(w_class)) /obj/item/melee/fluffstuff/attack_self(mob/user) @@ -1321,8 +1313,7 @@ ..() attack_verb = list("attacked", "slashed", "stabbed", "sliced", "torn", "ripped", "diced", "cut") - sharp = 1 - edge = 1 + damage_mode = DAMAGE_MODE_SHARP | DAMAGE_MODE_EDGE icon_state = "[active_state]_sharp" damage_type = DAMAGE_TYPE_BRUTE diff --git a/code/modules/xenoarcheaology/sampling.dm b/code/modules/xenoarcheaology/sampling.dm index be7e5bce0a54..39f201dd381e 100644 --- a/code/modules/xenoarcheaology/sampling.dm +++ b/code/modules/xenoarcheaology/sampling.dm @@ -4,7 +4,7 @@ icon = 'icons/obj/xenoarchaeology.dmi' icon_state = "sliver1" w_class = WEIGHT_CLASS_TINY - sharp = 1 + damage_mode = DAMAGE_MODE_SHARP var/datum/geosample/geological_data /obj/item/rocksliver/Initialize(mapload) From 6a181e804aee0575a82d2cb97e9005d7321b9c54 Mon Sep 17 00:00:00 2001 From: Niezan Date: Fri, 13 Sep 2024 08:47:09 -0700 Subject: [PATCH 07/20] electrochromatic linker fix (#6749) ## About The Pull Request electrochromatic linkers got wiped from atlas due to a merge issue ## Why It's Good For The Game yeah ## Changelog :cl: fix: electrochromatic linkers placed back on Atlas. /:cl: --- maps/rift/levels/rift-05-surface2.dmm | 177 +++++++++++++++++++++++--- maps/rift/levels/rift-06-surface3.dmm | 72 ++++++++--- 2 files changed, 209 insertions(+), 40 deletions(-) diff --git a/maps/rift/levels/rift-05-surface2.dmm b/maps/rift/levels/rift-05-surface2.dmm index d93ab4ae539f..79817ca2fd08 100644 --- a/maps/rift/levels/rift-05-surface2.dmm +++ b/maps/rift/levels/rift-05-surface2.dmm @@ -2211,6 +2211,9 @@ opacity = 0 }, /obj/effect/paint/purplegray, +/obj/map_helper/electrochromatic_linker{ + id = "robotics-inner" + }, /turf/simulated/floor/plating, /area/assembly/robotics) "biH" = ( @@ -3098,7 +3101,7 @@ pixel_y = -6 }, /obj/machinery/button/windowtint{ - id = "rd_office"; + id = "rd-office"; pixel_x = -32; pixel_y = -6 }, @@ -5897,6 +5900,9 @@ "dDP" = ( /obj/spawner/window/low_wall/reinforced/electrochromic/full/firelocks, /obj/effect/paint/darkred, +/obj/map_helper/electrochromatic_linker{ + id = "warden-office" + }, /turf/simulated/floor/plating, /area/security/warden) "dEc" = ( @@ -6762,7 +6768,7 @@ }, /obj/effect/floor_decal/corner/paleblue/border, /obj/machinery/button/windowtint/multitint{ - id = "operating_theatre_1"; + id = "operating-theatre-1"; pixel_x = -24; pixel_y = 7 }, @@ -6861,6 +6867,9 @@ "eke" = ( /obj/spawner/window/low_wall/reinforced/electrochromic/full/firelocks, /obj/effect/paint/darkred, +/obj/map_helper/electrochromatic_linker{ + id = "sec-locker" + }, /turf/simulated/floor/plating, /area/security/security_lockerroom) "eko" = ( @@ -7005,6 +7014,9 @@ }, /obj/spawner/window/low_wall/reinforced/electrochromic/full/firelocks, /obj/effect/paint/darkred, +/obj/map_helper/electrochromatic_linker{ + id = "warden-office" + }, /turf/simulated/floor/plating, /area/security/warden) "eoA" = ( @@ -9410,6 +9422,9 @@ /obj/structure/cable/green{ icon_state = "0-2" }, +/obj/map_helper/electrochromatic_linker{ + id = "Interr" + }, /turf/simulated/floor/plating, /area/security/interrogation) "fZv" = ( @@ -12317,7 +12332,7 @@ }, /obj/effect/floor_decal/corner/paleblue/border, /obj/machinery/button/windowtint/multitint{ - id = "operating_theatre_2"; + id = "operating-theatre-2"; pixel_x = -24; pixel_y = 7 }, @@ -13278,6 +13293,11 @@ }, /turf/simulated/floor/tiled/steel, /area/security/hallway) +"inb" = ( +/obj/effect/paint/babyblue, +/obj/spawner/window/low_wall/reinforced/full/firelocks, +/turf/simulated/floor/plating, +/area/medical/resleeving) "inj" = ( /obj/structure/sign/department/medbay{ pixel_x = -32 @@ -13285,6 +13305,9 @@ /obj/structure/disposalpipe/segment, /obj/spawner/window/low_wall/reinforced/electrochromic/full/firelocks, /obj/effect/paint/babyblue, +/obj/map_helper/electrochromatic_linker{ + id = "medbay-outer" + }, /turf/simulated/floor/plating, /area/medical/reception) "inX" = ( @@ -14217,6 +14240,9 @@ /obj/spawner/window/low_wall/reinforced/electrochromic/full/firelocks, /obj/effect/paint/darkred, /obj/structure/cable/green, +/obj/map_helper/electrochromatic_linker{ + id = "Interr" + }, /turf/simulated/floor/plating, /area/security/interrogation) "iXc" = ( @@ -14459,12 +14485,12 @@ pixel_y = 24 }, /obj/machinery/button/windowtint{ - id = "research_outer"; + id = "research-outer"; pixel_x = 22; pixel_y = 32 }, /obj/machinery/button/windowtint{ - id = "research_inner"; + id = "research-inner"; pixel_x = 22; pixel_y = 24 }, @@ -14733,17 +14759,34 @@ dir = 1 }, /obj/machinery/button/windowtint{ - id = "robotics_inner"; + id = "robotics-inner"; pixel_x = -22; pixel_y = 24 }, /obj/machinery/button/windowtint{ - id = "robotics_outer"; + id = "robotics-outer"; pixel_x = -22; pixel_y = 32 }, /turf/simulated/floor/tiled/steel, /area/assembly/robotics) +"jmT" = ( +/obj/spawner/window/low_wall/reinforced/electrochromic/full/firelocks, +/obj/machinery/door/blast/shutters{ + density = 0; + dir = 2; + icon_state = "shutter0"; + id = "hos"; + layer = 3.1; + name = "Head of Security's Office Shutters"; + opacity = 0 + }, +/obj/effect/paint/darkred, +/obj/map_helper/electrochromatic_linker{ + id = "warden-office" + }, +/turf/simulated/floor/plating, +/area/crew_quarters/heads/hos) "jnl" = ( /obj/structure/bed/chair{ dir = 4 @@ -16049,6 +16092,9 @@ "keC" = ( /obj/spawner/window/low_wall/reinforced/electrochromic/full/firelocks, /obj/effect/paint/darkred, +/obj/map_helper/electrochromatic_linker{ + id = "sec-processing-l" + }, /turf/simulated/floor/plating, /area/security/security_processing) "keH" = ( @@ -17233,6 +17279,9 @@ opacity = 0 }, /obj/effect/paint/purplegray, +/obj/map_helper/electrochromatic_linker{ + id = "rd-office" + }, /turf/simulated/floor/plating, /area/crew_quarters/heads/hor) "kPS" = ( @@ -20930,6 +20979,9 @@ "mQt" = ( /obj/spawner/window/low_wall/reinforced/electrochromic/full/firelocks, /obj/effect/paint/babyblue, +/obj/map_helper/electrochromatic_linker{ + id = "medbay-outer" + }, /turf/simulated/floor/plating, /area/medical/reception) "mRj" = ( @@ -22423,7 +22475,7 @@ }, /obj/machinery/atmospherics/component/unary/vent_scrubber/on, /obj/machinery/button/windowtint{ - id = "seclocker"; + id = "sec-locker"; pixel_x = 26; pixel_y = 4; req_access = list(2) @@ -23656,6 +23708,9 @@ "oFb" = ( /obj/spawner/window/low_wall/reinforced/electrochromic/full/firelocks, /obj/effect/paint/babyblue, +/obj/map_helper/electrochromatic_linker{ + id = "resleeving-tint" + }, /turf/simulated/floor/plating, /area/medical/resleeving) "oFt" = ( @@ -24686,6 +24741,14 @@ }, /turf/simulated/floor/tiled/steel, /area/hallway/primary/surfacetwo) +"phz" = ( +/obj/spawner/window/low_wall/reinforced/electrochromic/full/firelocks, +/obj/effect/paint/babyblue, +/obj/map_helper/electrochromatic_linker{ + id = "medbay-outer" + }, +/turf/simulated/floor/plating, +/area/medical/resleeving) "pic" = ( /obj/effect/floor_decal/rust, /obj/structure/catwalk, @@ -24699,6 +24762,23 @@ /obj/structure/catwalk, /turf/simulated/floor/plating, /area/maintenance/asmaint2) +"piB" = ( +/obj/machinery/door/blast/shutters{ + density = 0; + dir = 2; + icon_state = "shutter0"; + id = "warden"; + layer = 3.1; + name = "Warden's Office Shutters"; + opacity = 0 + }, +/obj/spawner/window/low_wall/reinforced/electrochromic/full/firelocks, +/obj/effect/paint/darkred, +/obj/map_helper/electrochromatic_linker{ + id = "hos-office" + }, +/turf/simulated/floor/plating, +/area/security/warden) "pjd" = ( /obj/item/radio/intercom/department/security{ dir = 8; @@ -25925,6 +26005,9 @@ /obj/structure/cable/green{ icon_state = "2-8" }, +/obj/map_helper/electrochromatic_linker{ + id = "Interr" + }, /turf/simulated/floor/plating, /area/security/interrogation) "qgp" = ( @@ -27811,7 +27894,7 @@ req_access = list(2) }, /obj/machinery/button/windowtint{ - id = "hos_office"; + id = "hos-office"; pixel_x = -18; pixel_y = -26; req_access = list(58) @@ -28610,6 +28693,9 @@ opacity = 0 }, /obj/effect/paint/purplegray, +/obj/map_helper/electrochromatic_linker{ + id = "robotics-outer" + }, /turf/simulated/floor/plating, /area/assembly/robotics) "rJG" = ( @@ -28826,6 +28912,9 @@ spawn_grille = 0 }, /obj/effect/paint/babyblue, +/obj/map_helper/electrochromatic_linker{ + id = "operating-theatre-2" + }, /turf/simulated/floor/plating, /area/medical/surgery) "rPk" = ( @@ -29503,6 +29592,9 @@ spawn_grille = 0 }, /obj/effect/paint/babyblue, +/obj/map_helper/electrochromatic_linker{ + id = "operating-theatre-2" + }, /turf/simulated/floor/plating, /area/medical/surgery2) "soJ" = ( @@ -32687,8 +32779,19 @@ opacity = 0 }, /obj/effect/paint/darkred, +/obj/map_helper/electrochromatic_linker{ + id = "hos-office" + }, /turf/simulated/floor/plating, /area/crew_quarters/heads/hos) +"uEt" = ( +/obj/spawner/window/low_wall/reinforced/electrochromic/full/firelocks, +/obj/effect/paint/babyblue, +/obj/map_helper/electrochromatic_linker{ + id = "resleeving-tint" + }, +/turf/simulated/floor/plating, +/area/medical/reception) "uEv" = ( /obj/structure/bed/chair/office/dark{ dir = 4 @@ -34354,6 +34457,9 @@ /area/rift/surfacebase/outside/outside2) "vxB" = ( /obj/spawner/window/low_wall/reinforced/electrochromic/full/firelocks, +/obj/map_helper/electrochromatic_linker{ + id = "research-inner" + }, /turf/simulated/floor/plating, /area/rnd/research) "vyj" = ( @@ -34391,6 +34497,23 @@ /obj/item/handcuffs/fuzzy, /turf/simulated/floor/plating, /area/maintenance/dormitory) +"vzm" = ( +/obj/machinery/door/blast/shutters{ + density = 0; + dir = 2; + icon_state = "shutter0"; + id = "warden"; + layer = 3.1; + name = "Warden's Office Shutters"; + opacity = 0 + }, +/obj/spawner/window/low_wall/reinforced/electrochromic/full/firelocks, +/obj/effect/paint/darkred, +/obj/map_helper/electrochromatic_linker{ + id = "sec-locker" + }, +/turf/simulated/floor/plating, +/area/security/warden) "vzn" = ( /obj/effect/floor_decal/borderfloor/corner{ dir = 1 @@ -34665,6 +34788,9 @@ }, /obj/spawner/window/low_wall/reinforced/electrochromic/full/firelocks, /obj/effect/paint/darkred, +/obj/map_helper/electrochromatic_linker{ + id = "warden-office" + }, /turf/simulated/floor/plating, /area/security/warden) "vKo" = ( @@ -36156,6 +36282,14 @@ }, /turf/simulated/floor/tiled/steel, /area/crew_quarters/sleep/Dorm_6) +"wQz" = ( +/obj/spawner/window/low_wall/reinforced/electrochromic/full/firelocks, +/obj/effect/paint/darkred, +/obj/map_helper/electrochromatic_linker{ + id = "warden-office" + }, +/turf/simulated/floor/plating, +/area/security/security_lockerroom) "wQJ" = ( /obj/effect/floor_decal/industrial/outline/red, /obj/structure/table/rack/shelf/steel, @@ -36690,7 +36824,7 @@ pixel_y = -26 }, /obj/machinery/button/windowtint/multitint{ - id = "medbay_outer"; + id = "medbay-outer"; pixel_x = 2; pixel_y = -24 }, @@ -37853,7 +37987,7 @@ dir = 4 }, /obj/machinery/button/windowtint/multitint{ - id = "sec_processing_l"; + id = "sec-processing-l"; pixel_x = -24; pixel_y = 26; req_access = list(1) @@ -38150,6 +38284,9 @@ opacity = 0 }, /obj/effect/paint/purplegray, +/obj/map_helper/electrochromatic_linker{ + id = "research-outer" + }, /turf/simulated/floor/plating, /area/rnd/research) "xYb" = ( @@ -38318,7 +38455,7 @@ /area/security/security_processing) "yem" = ( /obj/machinery/button/windowtint{ - id = "warden_office"; + id = "warden-office"; pixel_x = -18; pixel_y = 6; req_access = list(3) @@ -48972,8 +49109,8 @@ oFb kid kid kid -oFb -oFb +inb +inb kid oRV oRV @@ -49940,7 +50077,7 @@ oUw dTk bor lto -oFb +phz epz tQp xkt @@ -52854,7 +52991,7 @@ mGl aaA vwR vYO -mQt +uEt rYY jMc rRs @@ -56335,7 +56472,7 @@ ryQ ryQ ryQ mWB -eke +wQz rNb rVb rNb @@ -57500,7 +57637,7 @@ uKa bFQ oeO wsa -vKj +vzm tiu bhS kxd @@ -57888,7 +58025,7 @@ rAw rdE kAI fxc -vKj +piB tiu bhS rrl @@ -59052,7 +59189,7 @@ nzt woR bxf nyI -uDC +jmT tiu bhS nuH diff --git a/maps/rift/levels/rift-06-surface3.dmm b/maps/rift/levels/rift-06-surface3.dmm index ede520d7dc8d..88c724cb19d7 100644 --- a/maps/rift/levels/rift-06-surface3.dmm +++ b/maps/rift/levels/rift-06-surface3.dmm @@ -2018,7 +2018,7 @@ "agQ" = ( /obj/machinery/computer/card, /obj/machinery/button/windowtint{ - id = "hop_office"; + id = "hop-office"; pixel_x = 8; pixel_y = 26 }, @@ -3909,22 +3909,6 @@ }, /turf/simulated/floor/wood, /area/crew_quarters/captain) -"amx" = ( -/obj/effect/floor_decal/spline/plain{ - dir = 4 - }, -/obj/machinery/button/windowtint/multitint{ - id = "meeting_tint"; - pixel_x = -24; - pixel_y = -6 - }, -/obj/machinery/light_switch{ - dir = 8; - pixel_x = -26; - pixel_y = 4 - }, -/turf/simulated/floor/tiled/dark, -/area/bridge/meeting_room) "amz" = ( /obj/effect/floor_decal/borderfloor, /obj/effect/floor_decal/corner/lightgrey/border, @@ -5483,7 +5467,7 @@ dir = 4 }, /obj/machinery/button/windowtint/multitint{ - id = "meeting_tint"; + id = "meeting-tint"; pixel_x = -24; pixel_y = 6 }, @@ -8380,6 +8364,11 @@ "azz" = ( /obj/structure/bed/chair/office/dark, /obj/landmark/spawnpoint/job/pathfinder, +/obj/machinery/button/windowtint/multitint{ + id = "pathfinder-office"; + pixel_x = 38; + pixel_y = 28 + }, /turf/simulated/floor/tiled/monotile, /area/exploration/pathfinder_office) "azB" = ( @@ -9637,6 +9626,11 @@ /obj/machinery/light{ dir = 8 }, +/obj/machinery/button/windowtint/multitint{ + id = "bunker-tint"; + pixel_x = -24; + pixel_y = 6 + }, /turf/simulated/floor/tiled/steel_grid, /area/bridge/bunker) "aEd" = ( @@ -15583,7 +15577,7 @@ dir = 1 }, /obj/machinery/button/windowtint/multitint{ - id = "bridge_tint"; + id = "bridge-tint"; pixel_x = 38; pixel_y = 28 }, @@ -17826,6 +17820,9 @@ opacity = 0 }, /obj/effect/paint/commandblue, +/obj/map_helper/electrochromatic_linker{ + id = "hop-office" + }, /turf/simulated/floor/plating, /area/crew_quarters/heads/hop) "dha" = ( @@ -18143,6 +18140,9 @@ "dRg" = ( /obj/spawner/window/low_wall/reinforced/electrochromic/full/firelocks, /obj/effect/paint/commandblue, +/obj/map_helper/electrochromatic_linker{ + id = "blueshield-office" + }, /turf/simulated/floor/plating, /area/crew_quarters/heads/blueshield) "dRq" = ( @@ -19200,6 +19200,9 @@ opacity = 0 }, /obj/effect/paint/commandblue, +/obj/map_helper/electrochromatic_linker{ + id = "bridge-tint" + }, /turf/simulated/floor/plating, /area/bridge) "fAb" = ( @@ -20035,6 +20038,9 @@ "gQu" = ( /obj/spawner/window/low_wall/reinforced/electrochromic/full/firelocks, /obj/effect/paint/commandblue, +/obj/map_helper/electrochromatic_linker{ + id = "meeting-tint" + }, /turf/simulated/floor/plating, /area/bridge/bridge_hallway) "gTy" = ( @@ -20745,6 +20751,9 @@ opacity = 0 }, /obj/effect/paint/commandblue, +/obj/map_helper/electrochromatic_linker{ + id = "bridge-tint" + }, /turf/simulated/floor/plating, /area/bridge) "iio" = ( @@ -23066,6 +23075,9 @@ id = "hop_office" }, /obj/effect/paint/commandblue, +/obj/map_helper/electrochromatic_linker{ + id = "hop-office" + }, /turf/simulated/floor/plating, /area/crew_quarters/heads/hop) "mpP" = ( @@ -24734,6 +24746,9 @@ /obj/structure/cable/green{ icon_state = "1-2" }, +/obj/map_helper/electrochromatic_linker{ + id = "bunker-tint" + }, /turf/simulated/floor/plating, /area/bridge/bunker) "pxd" = ( @@ -25774,6 +25789,11 @@ dir = 8 }, /obj/landmark/spawnpoint/job/blueshield, +/obj/machinery/button/windowtint/multitint{ + id = "blueshield-office"; + pixel_y = 32; + pixel_x = -8 + }, /turf/simulated/floor/carpet/blue, /area/crew_quarters/heads/blueshield) "rKd" = ( @@ -26021,6 +26041,9 @@ "siB" = ( /obj/spawner/window/low_wall/reinforced/electrochromic/full/firelocks, /obj/effect/paint/violet, +/obj/map_helper/electrochromatic_linker{ + id = "pathfinder-office" + }, /turf/simulated/floor/plating, /area/exploration/pathfinder_office) "sja" = ( @@ -27537,6 +27560,9 @@ }, /obj/spawner/window/low_wall/reinforced/electrochromic/full/firelocks, /obj/effect/paint/commandblue, +/obj/map_helper/electrochromatic_linker{ + id = "bridge-tint" + }, /turf/simulated/floor/plating, /area/bridge) "vlu" = ( @@ -27693,6 +27719,9 @@ "vwG" = ( /obj/spawner/window/low_wall/reinforced/electrochromic/full/firelocks, /obj/effect/paint/commandblue, +/obj/map_helper/electrochromatic_linker{ + id = "meeting-tint" + }, /turf/simulated/floor/plating, /area/bridge/meeting_room) "vwM" = ( @@ -28316,6 +28345,9 @@ opacity = 0 }, /obj/effect/paint/commandblue, +/obj/map_helper/electrochromatic_linker{ + id = "bunker-tint" + }, /turf/simulated/floor/plating, /area/bridge/bunker) "wmp" = ( @@ -50492,7 +50524,7 @@ adh aTY sHK asz -amx +aUt aUt aUt aUt From 6ce528642d01dc76d36ca3d52c5d201bdde39ade Mon Sep 17 00:00:00 2001 From: Niezan Date: Fri, 13 Sep 2024 08:47:27 -0700 Subject: [PATCH 08/20] lets security access genpop doors (#6748) ## About The Pull Request genpop brig doors were missing access helpers ## Why It's Good For The Game fixes doors ## Changelog :cl: fix: Security can now access genpop doors. /:cl: --- maps/rift/levels/rift-04-surface1.dmm | 3 +++ 1 file changed, 3 insertions(+) diff --git a/maps/rift/levels/rift-04-surface1.dmm b/maps/rift/levels/rift-04-surface1.dmm index 398b8f248a79..04604690f760 100644 --- a/maps/rift/levels/rift-04-surface1.dmm +++ b/maps/rift/levels/rift-04-surface1.dmm @@ -13554,6 +13554,7 @@ name = "Cell 1"; req_one_access = null }, +/obj/map_helper/access_helper/airlock/station/security/department, /turf/simulated/floor/tiled/monodark, /area/security/prison/upper) "iFN" = ( @@ -16472,6 +16473,7 @@ name = "Cell 2"; req_one_access = null }, +/obj/map_helper/access_helper/airlock/station/security/department, /turf/simulated/floor/tiled/monodark, /area/security/prison/upper) "kwz" = ( @@ -36659,6 +36661,7 @@ name = "Cell 1"; req_one_access = null }, +/obj/map_helper/access_helper/airlock/station/security/department, /turf/simulated/floor/tiled/monodark, /area/security/prison/upper) "vYf" = ( From 9056fbd30b8f9bf578b37ccec441672be5501315 Mon Sep 17 00:00:00 2001 From: Niezan Date: Fri, 13 Sep 2024 08:47:46 -0700 Subject: [PATCH 09/20] bioprinter circuit in circuit imprinter (#6746) ## About The Pull Request makes bioprinter creatable through circuit imprinter. I don't see much reason why not, since we can make whole resleeving consoles. ## Why It's Good For The Game makes bioprinters makeable ## Changelog :cl: add: Bioprinter circuit is now makeable through circuit imprinter at 5 biological, 2 data. /:cl: --- code/modules/research/designs/circuits/machines/misc.dm | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/code/modules/research/designs/circuits/machines/misc.dm b/code/modules/research/designs/circuits/machines/misc.dm index 6c4483ba4b3d..c2306bd17a40 100644 --- a/code/modules/research/designs/circuits/machines/misc.dm +++ b/code/modules/research/designs/circuits/machines/misc.dm @@ -3,3 +3,9 @@ build_path = /obj/item/circuitboard/machine/bioscan id = "machine_bioscan" req_tech = list(TECH_DATA = 1) + +/datum/design/circuit/machine/bioprinter + design_name = "Bioprinter" + build_path = /obj/item/circuitboard/bioprinter + id = "machine_bioprinter" + req_tech = list(TECH_BIO = 5, TECH_DATA = 2) From ef28c6abb62acc37906e94a9cb551bc024e9b0e9 Mon Sep 17 00:00:00 2001 From: Niezan Date: Fri, 13 Sep 2024 08:48:12 -0700 Subject: [PATCH 10/20] Adds size standardization bracelets to protolathe (#6751) ## About The Pull Request Adds size standardization bracelets to the protolathe, giving them an in-game method of being made, instead of requiring admin spawn or loadout equip. I made the recipe kinda cheap because it's mostly a fluff item / makes life less of a living hell. ## Why It's Good For The Game seems useful for events and / or just general purpose. ## Changelog :cl: add: Size standardization bracelets can now be made in the protolathe. /:cl: --- code/modules/research/designs/misc.dm | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/code/modules/research/designs/misc.dm b/code/modules/research/designs/misc.dm index ce337c04d6cd..a1dfe223dabb 100644 --- a/code/modules/research/designs/misc.dm +++ b/code/modules/research/designs/misc.dm @@ -136,3 +136,11 @@ req_tech = list(TECH_BLUESPACE = 5, TECH_MATERIAL = 6, TECH_BIO = 5) materials_base = list(MAT_STEEL = 4000, MAT_GLASS = 2000, MAT_URANIUM = 500, MAT_GOLD = 500, MAT_SILVER = 500) build_path = /obj/item/reagent_synth/chemistry + +/datum/design/science/size_standardization + design_name = "Size Standardization Bracelet" + desc = "A bracelet that changes the size of the wearer to the galactic standard." + id = "sizestandardbracelet" + req_tech = list(TECH_BLUESPACE = 5, TECH_MATERIAL = 3, TECH_BIO = 4) + materials_base = list(MAT_STEEL = 1000) + build_path = /obj/item/clothing/gloves/size From a61ad42b18cf0bd530f499109d833584baeef486 Mon Sep 17 00:00:00 2001 From: silicons <2003111+silicons@users.noreply.github.com> Date: Fri, 13 Sep 2024 11:48:38 -0400 Subject: [PATCH 11/20] fix paper logos (#6750) oops --- citadel.dme | 1 + code/modules/asset_cache/assets/logos.dm | 9 +++++++ code/modules/paperwork/paper/paper.dm | 22 ++++++++++-------- html/images/loading.gif | Bin 0 -> 1633 bytes html/images/paper_bg.png | Bin 0 -> 4035 bytes html/images/talisman.png | Bin 0 -> 62153 bytes icons/interface/logos/nanotrasen-blue.png | Bin 0 -> 9990 bytes .../interface/logos/nanotrasen-red.png | Bin icons/interface/logos/solgov.png | Bin 0 -> 19257 bytes 9 files changed, 22 insertions(+), 10 deletions(-) create mode 100644 code/modules/asset_cache/assets/logos.dm create mode 100644 html/images/loading.gif create mode 100644 html/images/paper_bg.png create mode 100644 html/images/talisman.png create mode 100644 icons/interface/logos/nanotrasen-blue.png rename html/images/redntlogo.png => icons/interface/logos/nanotrasen-red.png (100%) create mode 100644 icons/interface/logos/solgov.png diff --git a/citadel.dme b/citadel.dme index 31f46e8f17eb..7c26dfbdffc7 100644 --- a/citadel.dme +++ b/citadel.dme @@ -2273,6 +2273,7 @@ #include "code\modules\asset_cache\assets\legacy_nanomaps.dm" #include "code\modules\asset_cache\assets\legacy_nanoui.dm" #include "code\modules\asset_cache\assets\loadout.dm" +#include "code\modules\asset_cache\assets\logos.dm" #include "code\modules\asset_cache\assets\materials.dm" #include "code\modules\asset_cache\assets\moods.dm" #include "code\modules\asset_cache\assets\notes.dm" diff --git a/code/modules/asset_cache/assets/logos.dm b/code/modules/asset_cache/assets/logos.dm new file mode 100644 index 000000000000..45965c0e4340 --- /dev/null +++ b/code/modules/asset_cache/assets/logos.dm @@ -0,0 +1,9 @@ +/datum/asset_pack/simple/logos + assets = list( + "nanotrasen-blue.png" = 'icons/interface/logos/nanotrasen-blue.png', + "nanotrasen-red.png" = 'icons/interface/logos/nanotrasen-red.png', + "solgov-logo.png" = 'icons/interface/logos/solgov.png', + ) + do_not_separate = TRUE + absolute = TRUE + do_not_mangle = TRUE diff --git a/code/modules/paperwork/paper/paper.dm b/code/modules/paperwork/paper/paper.dm index dc438275981d..a3bc621743eb 100644 --- a/code/modules/paperwork/paper/paper.dm +++ b/code/modules/paperwork/paper/paper.dm @@ -9,14 +9,6 @@ #define MODE_WRITING 1 #define MODE_STAMPING 2 -/** - * Paper is now using markdown (like in github pull notes) for ALL rendering - * so we do loose a bit of functionality but we gain in easy of use of - * paper and getting rid of that crashing bug - */ -/obj/item/paper - - /obj/item/paper name = "sheet of paper" gender = NEUTER @@ -104,6 +96,10 @@ return /obj/item/paper/proc/show_content(var/mob/user, var/forceshow=0) + if(!user.client) + return + SSassets.send_asset_pack(user.client, /datum/asset_pack/simple/logos) + user.client.asset_cache_flush_browse_queue() if(!(istype(user, /mob/living/carbon/human) || istype(user, /mob/observer/dead) || istype(user, /mob/living/silicon)) && !forceshow) user << browse(" [name] [stars(info)][stamps]", "window=[name]") onclose(user, "[name]") @@ -158,6 +154,8 @@ dist = get_dist(src, user.camera) else //cyborg or AI not seeing through a camera dist = get_dist(src, user) + SSassets.send_asset_pack(user.client, /datum/asset_pack/simple/logos) + user.client.asset_cache_flush_browse_queue() if(dist < 2) usr << browse("[name] [info][stamps]", "window=[name]") onclose(usr, "[name]") @@ -296,8 +294,8 @@ t = replacetext(t, "\[/grid\]", "") t = replacetext(t, "\[cell\]", " ") - t = replacetext(t, "\[logo\]", "") - t = replacetext(t, "\[sglogo\]", "") + t = replacetext(t, "\[logo\]", "") + t = replacetext(t, "\[sglogo\]", "") t = "[t]" else // If it is a crayon, and he still tries to use these, make them empty! @@ -424,6 +422,8 @@ update_space(t) + SSassets.send_asset_pack(usr.client, /datum/asset_pack/simple/logos) + usr.client.asset_cache_flush_browse_queue() usr << browse(" [name] [info_links][stamps]", "window=[name]") // Update the window update_icon() @@ -474,6 +474,8 @@ if ( istype(RP) && RP.mode == 2 ) RP.RenamePaper(user,src) else + SSassets.send_asset_pack(user.client, /datum/asset_pack/simple/logos) + user.client.asset_cache_flush_browse_queue() user << browse("[name] [info_links][stamps]", "window=[name]") return diff --git a/html/images/loading.gif b/html/images/loading.gif new file mode 100644 index 0000000000000000000000000000000000000000..6ec34d41709c2bde01c2b8825798073d67ec6ad6 GIT binary patch literal 1633 zcmai!&1)1{6vc0+TT`0Qlw;6R3!zYupagq*z;5HBEm2WIkSNS18!3pp(BTctGTmd% z=!|W25f_0c)TWmP$*Of#ewCY0_y_dD55jX523)y{=iWzWC%rrUsDAJM?m72fy>_Km zzwMGs--xQ!>def{*4Ea-!oud}=JN9L#>U3l+8Pd_A@CFD_+V#ehlqlmvDwSFZeF^0 z=zP*@D*dQcz7MKc#s&C?v()TVtZK)d%0GPOpN!peq7t>@8h!d*ee|iy@Y?C_ z1g^@wFIsiexqdzOBCX0Vp-c^mtC}|cpsH=(psE+n&k2HEf*`g8eQzpulVVyoeJ|?K z-6E0E$D(mOON8PVQxu;Up!OWH1ab5E>YNb7t#EbjKOvY1o!> Wm2UpD{jaHP+1L%396YlAjrL81ko-*)cIsRm|W~sgkXNM+bi4?0^2wtSWoe` z5R4wT1l0UrD Bv^8+UV*$G>L z7j=YSJSg1}m8hu_ih9cgoLQ7NurqFi+C^rW04l6OF@Xfv62QM91ZJ1O=r2N`E8AKn z$gP2|z2YOZf6zEUqR<8tJb^0xVhOV5V@?7HvR34V_l3ZZ#;=M>)FN7dxdH)a7Uh8e znZ;Z+0-umsCV-+I6cdQ;mH_?@A>i4v-(t3ezz;B6336-L*WyDNE893gA|wsQcnUSL z-x6G3y1_{R!S#0631T5Q)15daDpBib0p oLQ6y0 zHM7RYP^0m_enfJQ7qzJ%Q-1bN#KwS?e;@kd1^ z3j0Kly=-h VEt{{rx*g zq=+OyRtIQ(22J;soWi&;`%N4Jh@!K Q{bdSwvg84uy=ukKjqAmGr@{Dqm(JZ!9P6)Z z5Ay^e3wm!2qEz5 _oSvU$FrB;!%^4{?8RS*{aW*;G)f!9}0eE~Otc zK=X+LVa9&_NBcM|yr05Sh+ii}G^UKqBQOm6D?Su&YgZ!or0I=D*fD-^X2B}gB a)Q^SnfbATZXUY^D!*%Jxi91nR+l!@8D5bmtBxbLFZ$zQ*i^ zakJz_BA#zXoQxt%35Lm7D!Es?V2Zz71&HE^Sr^##15{mYX6_pe)+3t30ot0?XOa^b z7k|&40}$vhgg{yyKqo+5H%z<5=hoI ! z_s?hGnOuM2<^du28JhzDbx;^DBmVzf5dcX^o4}Fy+jpe0DsEJ^O*?<<4-)v!X=rCb zr2MDCX=L%Vf4Dhlyn_cY1K*!diQV;Z^g-J8X5RxQkwd|n`Hqud5b0~c1?4!I5fx_{ zSLjg`6W6dILQwJ=FVGIM_`LGt`VPFRe<23|EAUerDid9uzIq1NE0L zJFJa@v2FL}wS?=; Dr@yK?XOT}s>zS(PnWqO z;S4r4MB3i}zQxa-*T@Tv5GIq#UZ^&nf+t0|dE1uN>O;K{S1t*t%<|IoticZV98lNm zoi%1V=ISzIX3j$>2IEE)NqDd!%sRAn_E*W!O(vBo1ma%~#X%bsMVY*VAVzlU`SVJV z179_IqP!cR>l}=omqD48sj^Tjp^lK8$*HUwPz+fjw3${_R~6c9w|&+q(F8(P6$l*u zI$s_q&2(nK5J8ghiY$@xm=?(Sj?Cwlickqru50t@^np{`1OATq(zVFRSyjzhqczil z4sQw~)2h0@U+4zY4w>_v`9<##!SVOMeamzJyRok4BJMaEFk;|0 e!21Xx1g!nnAF=>|?OTYdnH$k*a9+H& zcAvViCHU6s70CSh`17w!k&P)4@}$x2gJ J#~C_2klV g@>eNzeV+e&B1fZjyX3U>iDvBL+O~hgo~>P?jZFT1X@T zBtBkLKmbj99lZr%V(tM~@LjtT0)(RZdIS|IiTs>6f=zC09*oFrfoGK9%khtSf+`i- zZg>bD0GeZs-sbgx+I97y>|MdTh#B}55vrT*1apN~(CNp=ugA1#nXGEyUOWaWMF}4w zE^WJLZU!`&__4VUo 2zWCW_JP}HxTAiV$luWeCe$BlDV8Cih!^R`(r^+ZUy|K56wV^gE=I}F OIV=LWIbKor|9FNHvSLaIK+7>$FFJcUg}qy)xktjr!3s%o#dU8_1C zR^X{mtTHm#VZKvt X5|IwcD2qcNIxs9Qy&?a9;%H z0dDA%f*c;k 5u8QsQ*7w=@!Omeu)X$S(p*VgHT_%-@v>6JD zNeC(sj0He2WFvYs642{ZLrl&fltPu)S#9y<%O9!MwpntVZe$iZ=2oxt*T-o)ktPBr zixRq@lQ6TGUL{G6tB&jBcRsiHerR?SC<7ZTtN_MtM464~1rpauupJE;4JbvCxm36b zkh27&6x`S&fWdnW#tQs9uHXhxUM}Q04@w9ep@4UYfq @$ZEfpc(L7v+*YJ))*v~A8+Zx|mw18)f#nKP zN`Ubjc*zSisT5wpd*?wZ04YE(DGpr#Xi9V;1dw$4swBWfaihVvq?ls1PD73Q!F -ovcxb93u?>YvV)GY;25&0GF1qSPZHc&k2n_dnD>1TmgT5^?D1B= z!Mgjs&V7qxlFABRKri|PTFNx&X+i$`Ki^|~K?^NZaVw9b9#)y1dWXO`#_j@DA9i@X z2P3af9eMA;*so714W|LL=1{2#a-M;+#h`V3Q3xKhiR-Ph78pk$9;$wW2-5?LM36$t z;N#9nn=G~)p)K&kxa~EU^R&M1a!$erhdfr`Df}qN3jB%)&0IaX8A<0~F)6NZZ-;$S z5g8BzEVU^wq*)^&(f21*e4D@b=P3`3FP!w0YLQP;03VLidh5e6 g`U3 zie_Hdbw8r-E?X)n%0>CLK4uLUOT5A)qG#3yAc~=>6uKmlOT|HxX(<6*3}A~sU>sX` z6X3{HXK|hH?}it4QO WEW+{`@Yr z8lu^Mu<;I(J+Hd~5flVe0%7Ci&JGr$6fdvK4HkUy{pdXiV{;Ga)6PBvFS3Lf(~C@| zz0AM|vX0s1n7m8}vU*sMlT=E!z{8Un_!t~wI*YV}MNFY7vS;xPW0Ax$W(KI515~*t zIeal Q)SU}lrL3Y{yFT9<-}iuKdL`75G=3*afi7v7 zb}@V04*jBn$S10Bn9QRu1ByfWlB*pLCC=FypCSrle5}fRW_tA1i*pL+!fkE=00O_w zg0Fdi+ FJWa3Dp3fh<;NxOV{1aodE|Id3O@mPPKoc~J8385L zj*hq8@)lKr>TBw`Q#cc`1{M=p3W0zyhU4)|>hTvjMpbA}|G2yPQNcZUKWW%7v|hY} z)b;nxvDr&tw-9JAA7~B_COyHRiHC@J6C+{tYlBNBXh@nTNr1*YQ;*=~hT$0nmQy6u pO+F1E5(2V#m%y0-{^I<>{{fMeWYhClg@gbA002ovPDHLkV1kTuiqZf8 literal 0 HcmV?d00001 diff --git a/html/images/talisman.png b/html/images/talisman.png new file mode 100644 index 0000000000000000000000000000000000000000..0ece637314a0112efd87927c1d65953707b4221a GIT binary patch literal 62153 zcmbqaV{;(S*PUeJY;4=yWMi8f+sVeZZQJI?wryu)V`JONKff2xCwOYAtERfTr@Q+0 z^tt!k(_wNlVsJ3nFaQ9+Nr($8000Q>SD}M~_^PQR(w+eT7!ETbAvrly8%G-lQyW`C z2_YduTYDR0GfN`?5FgG;c2QDVLJyhlbaBs{WCT?R-fZsy<~$N~MD$a!^eDf N;^_EfP&Sc0s4f`D zmAhI8sO{ewW?vb|&zwT_V^6=MQ~)WXo&$>(2_ux9Oe&VXX*xU=JB8L5lgzk_QUGZ@ zj6**Tj`x+et{`=#l)EW(kfXR>amC;Q?Yc>tNNgaqIuw? 3Qi~#u`@$NpbEe@?~x2{UNZ3sJ%VlN>zz2ks_4DN`ROusR| znlAA8=fA47490r%4+%`Kvvr@Hedk7eK#!Q)k*;of8ph`q|jj@bf1#(|eiRr_-&C z R>4Eqx~E``{bF?;~iV#dvx@|ctUgwX#{IM|9FHur=i z_dC*e-ieyu`y7%I28nR?bx`}Wz^3bokZ3W1VkK^Iu>$_AMXed(u1h*rLzUI?!kEqKtzOA`GzhIR_cpT$B(}Z1|#re z8T!H3Tn-XjfY}s$Sb%~Zd@4X{8@mO>I^b0gRod4?54{5d77 gsO@Jh*j&JnZ&N@qQ~d+;J6u6jZJ( DE=Wa^ zO9tmpr)GY`fEl#O=mS}$RB-adI9-xM;@$|_XyfQcvIm81ic5lQ@)p?^)u$XtQEo9} zNo-M#?oNK+gu;o!T2V!jh*S(iXE7Ab2^9oYl`?n9ay5H#Va30^#44pCM*%a@v_EGh znT1+ao}z9VLHP#Neacj-9OXBO^inSQ#WOU=op Y@Xtu(KetG}|z>gRSc>csFp|YqEoM@^zv%oxIex6mrVDWqoD ZGY zAEa2ESjN~*n9*3Xk)BaEQJhiPI2M> 2EQ{?^5iN&vl)L{S9_ZY8Uc{cLR!&$hPVh>{liGsTa!@%>xCD zz!)VlQz~Z{rxtN4WYxPHYa5W3ahsnf7iU;k9zxIO?a%i!_oK##&*#rlo$s9s9volQ zUcWsQz?Z>Ghd_i3N1sGn4wDZ{P-qvE78l4&XZ^~2o;shprDvr-)tYK0uEMVpsrqKk zWSwWdU>&o*u#U2>xo*Nk%f0BHc`NMk;(Bp|d#!L|;Kt%H>8|NkeS2|F^bGc@^veCP zaJ&EN{Mzfi>D~U0UooTAt2uj&@Yea}^2+yp23`&2>Ng=dBVi5sl|-zWoQ|9>BN;pS zllavs;$iGu>}wupUf)bM<7mxM%|Xqx?b21<)hyIrs1wo>F&c4eoVNUONlnS0lGY?^ zn#YRF(56uONPL~5PHK;Zqy?CAMU|ZBxJdn>%utcx;9>kQujxAzR>s5Kj$QLTV|Dt9 z&I%JtF=q~s^xwl&d(uN|gDHcuWXoh{GO03-;uYeVJ8ib*tqk$p2`BLf3GWFAWImG6 zvSw0)MMHnG|BYV7yLFn4nXQ-w9KRd~9T!+wE}p3~k3a6P8S!J4Gqr&!%}y(I%Zas! zuqT`4s3$y=)6kv@H#xF0wDXBEn0QPXR(V`BTgY3eTX@_k-LmdSRXS*>cH?UhGay1@I9qJ6&a+-L z`JErEl{fj&8enMCu~Jo0dh7O4x4uLjvn6eLt|E2+&YiDw{FIrH*__(ZhHr;Ykx1E3 zj=FqU+mM%GV4(JCq%fXN3O7P?@__aT@(`o(qG>PtS>~+LSuIo1rM;*1SEXF7z0=v7 zz+-F1d-%Q5Nz!T1=@Q-+VZHRR #FZj11KD@C;tuT|8_a zT*sE?m9p07(A~H>^cIn2Ca<3_M^Tqr-KXX(mX$UIjc5elh69JQy$N35uk3R6cqlL_ zG<;^>@|v>dbml>v{y9!KlRHN{i#Wq&-|?>ewOZTwD42~2ktxkC R$=3aKu^HU{EyM` r)=y7E0e}#Y5Ef8!T|LuwaaCG)&_0yOx!V-?ixm|_CcLBnrNqzQ^TKbI z9}4c8?=Orb3=Uok`XDMVU;F79E{Oqp92FP~K~*T5(|Y(goXOmpI}HgVxLtLbacRuN z+??HhvH9g`vJwgff5&1n9Em0Rf4@ZfKxOEtMY!l_$o^v{+RO1J%mKwZ3<&=nRMj10 zgy&bR0)mF5y>}EM+cZic@ii<4 (OO%rg?ZmECjCW+E2bec+^Do zzvj^uOz?T6Y&c)N5^fu7vO7=dm$nFKGcP$P$jtiXqQc=Jk6b}H<@0juh5Wl+t^4k? zftvdw46Q9b`B;x3h5r_1Dy$}Y-!MzxEDM%35*G}}O*D|vy1OOWxTAQ52E`MF!V`hQ z6NJJefpP>Ry2~4ANpbP+?0-CS%A_1g3b p|FfR@MpN?Bpd3`KO5y!hDRlf!ES zGuLc0{I}CX^sKC$OOLV~stFMkhJR4U7|;+z{MI84fI*&jKhKImU`0U;Hw?yX3k%Q_ z@1bZ*{bwiJ9koUIVl<~G#Bk=AxBYwW`EI^85Z9-n(|}+Px9l^>8J)nH?7*3y4=1uv zc>GYE!JQB&g2U8Fjyu~RQXgyX;}JJ1I06&FL;4BdokOofD8kP5Kw;fd;dOn*r zLzk^XL(j=|8L^o3wI{_-m;nyRN8};}@bW?Ff?X7|6*sWOX !mUt>?57#q6D1!U zC{#c?kRQB95b6wA2iP(7sg}1D 5H+xqujKP5f zT8e#gvfo*-9ee~$5d=+L4&Wb%1OL>hGK|(C5H&Cm{Y*pT F8cc8KajG#ab%!=85u5QA+8eG#wlYH{fv9>W+16Y z6*RRGJks;sT%fyHfpyEIxN*=PmrTY{p&CVcB`Dlax1?s6NTA3z9C@O!&D>~s#tO0J z=7ZdyaBq rw`Lu)ub(ETo3qwN&qlc(K~MgUl>!8XxFx&OkMcMo4%;&^j5#OA zVC^sI7Smi#Yw^g4cc!hS424o9d9j8fazf?4FCThA<#~a)M-k3=v=3GSzOR?rZW44A zd_q)QF+~{1o@23g%K4OBDF1!-C1@Jk$MpaY@YT#OAdglkHT4ly;1(T}2=8{UUsk~; zsnVHfI~f-*=i?W%n0M^GBKrHp%G+&pV&rBm<-labcFh#zsm}?F!Q3FBtq&=MN4vWh@2M7$A9m+6|odb5K5jBb>6x@;b`EZ z;U`-NJFfEpX|V!8IXNkiGEf-NM8H?AQ{;N_jL}tDU5Qgl48{tG0_LJxKyDr?yr3RL zZUSODj4z09w%0U0mZdxUZBxFW{{w=o6wdWUDfM1VH(nA$$M>`v&hHXv|8gtyuwaTn zIS~+K)Z{2pYu3(cG^E9kRv-bn_=KRN!haD>4191n!8`5FI}o}#*>qOH{j3>qpd>VC z^~o(kMTUljhK6WBZj#p@UuHX{UWhapUo?J966O#>!XNBcAFAatT~8lJ*)8v{-`xmD zVxdp%#q1vB2OMPwul;f7IC#T!=wF=_Q%c@$=IUJWhzM NYV S+v;@TGp0YGpudl}nXWtC_T>|+9z)rEBrC|V ze|vzJ6xh!EG5?J*l`eZY#`w~^LG|n0(i>Th$>H?XGjkK5A2UJ{OslDaKxORhxY;G9 zOgtGk$bryhhR{5mgkh*I>slH6Pz47j(3EP({FsxAjJD(%cW0^5#KWPw^~XmQy&x(* zMxin~d;1JD5+|8%Rz&b$nSL;Fugsq%C8gb7rd`)+=G-GF!EZI5)^!IXU5AA}MY!v{ zcBM3481