From 8c0dcf0ac005d5724eb7e3e18722a1d632e99e31 Mon Sep 17 00:00:00 2001 From: SkyratBot <59378654+SkyratBot@users.noreply.github.com> Date: Fri, 13 Jan 2023 06:53:24 +0100 Subject: [PATCH 01/42] [MIRROR] Cleans up AI airlock hacking code [MDB IGNORE] (#18680) * Cleans up AI airlock hacking code (#72550) Took a second look at #72425 and decided to tidy up a bit. :cl: ShizCalev qol: Airlock interfaces will now open up automatically if access is restored early while an AI is hacking it. /:cl: Co-authored-by: Jeremiah <42397676+jlsnow301@ users.noreply.github.com> * Cleans up AI airlock hacking code Co-authored-by: ShizCalev Co-authored-by: Jeremiah <42397676+jlsnow301@ users.noreply.github.com> --- code/game/machinery/doors/airlock.dm | 83 +++++++++++----------------- 1 file changed, 31 insertions(+), 52 deletions(-) diff --git a/code/game/machinery/doors/airlock.dm b/code/game/machinery/doors/airlock.dm index a780946e64a..86091f01119 100644 --- a/code/game/machinery/doors/airlock.dm +++ b/code/game/machinery/doors/airlock.dm @@ -698,6 +698,27 @@ ui_interact(user) +///Performs basic checks to make sure we are still able to hack an airlock. If control is restored early through outside means, opens the airlock's control interface. +/obj/machinery/door/airlock/proc/check_hacking(mob/user, success_message) + if(QDELETED(src)) + to_chat(user, span_warning("Connection lost! Unable to locate airlock on network.")) + aiHacking = FALSE + return FALSE + if(canAIControl(user)) + to_chat(user, span_notice("Alert cancelled. Airlock control has been restored without our assistance.")) + aiHacking = FALSE + if(user) + attack_ai(user) //bring up airlock dialog + return + else if(!canAIHack()) + to_chat(user, span_warning("Connection lost! Unable to hack airlock.")) + aiHacking = FALSE + return + if(success_message) + to_chat(user, span_notice(success_message)) + return TRUE + +///Attemps to override airlocks that have the AI control wire disabled. /obj/machinery/door/airlock/proc/hack(mob/user) set waitfor = 0 if(!aiHacking) @@ -705,75 +726,33 @@ to_chat(user, span_warning("Airlock AI control has been blocked. Beginning fault-detection.")) sleep(5 SECONDS) - - if(QDELETED(src)) - to_chat(user, span_warning("Connection lost! Unable to hack airlock.")) + if(!check_hacking(user, "Fault confirmed: airlock control wire disabled or cut.")) return - if(canAIControl(user)) - to_chat(user, span_notice("Alert cancelled. Airlock control has been restored without our assistance.")) - aiHacking = FALSE - return - else if(!canAIHack()) - to_chat(user, span_warning("Connection lost! Unable to hack airlock.")) - aiHacking = FALSE - return - to_chat(user, span_notice("Fault confirmed: airlock control wire disabled or cut.")) sleep(2 SECONDS) - - if(QDELETED(src)) - to_chat(user, span_warning("Connection lost! Unable to hack airlock.")) + if(!check_hacking(user, "Attempting to hack into airlock. This may take some time.")) return - to_chat(user, span_notice("Attempting to hack into airlock. This may take some time.")) sleep(20 SECONDS) - - if(QDELETED(src)) - to_chat(user, span_warning("Connection lost! Unable to hack airlock.")) + if(!check_hacking(user, "Upload access confirmed. Loading control program into airlock software.")) return - if(canAIControl(user)) - to_chat(user, span_notice("Alert cancelled. Airlock control has been restored without our assistance.")) - aiHacking = FALSE - return - else if(!canAIHack()) - to_chat(user, span_warning("Connection lost! Unable to hack airlock.")) - aiHacking = FALSE - return - to_chat(user, span_notice("Upload access confirmed. Loading control program into airlock software.")) sleep(17 SECONDS) - - if(QDELETED(src)) - to_chat(user, span_warning("Connection lost! Unable to hack airlock.")) + if(!check_hacking(user,"Transfer complete. Forcing airlock to execute program.")) return - if(canAIControl(user)) - to_chat(user, span_notice("Alert cancelled. Airlock control has been restored without our assistance.")) - aiHacking = FALSE - return - else if(!canAIHack()) - to_chat(user, span_warning("Connection lost! Unable to hack airlock.")) - aiHacking = FALSE - return - to_chat(user, span_notice("Transfer complete. Forcing airlock to execute program.")) sleep(5 SECONDS) - - if(QDELETED(src)) - to_chat(user, span_warning("Connection lost! Unable to hack airlock.")) + if(!check_hacking(user, "Receiving control information from airlock.")) return - //disable blocked control - aiControlDisabled = AI_WIRE_HACKED - to_chat(user, span_notice("Receiving control information from airlock.")) + aiControlDisabled = AI_WIRE_HACKED //disable blocked control sleep(1 SECONDS) - - if(QDELETED(src)) - to_chat(user, span_warning("Connection lost! Unable to hack airlock.")) - return - //bring up airlock dialog aiHacking = FALSE + if(QDELETED(src)) + to_chat(user, span_warning("Connection lost! Unable to locate airlock on network.")) + return if(user) - attack_ai(user) + attack_ai(user) //bring up airlock dialog /obj/machinery/door/airlock/attack_animal(mob/user, list/modifiers) if(isElectrified() && shock(user, 100)) From 1b7316cb85917764cb7d8674c4bdcd69cda2bc86 Mon Sep 17 00:00:00 2001 From: SkyratBot <59378654+SkyratBot@users.noreply.github.com> Date: Fri, 13 Jan 2023 06:53:44 +0100 Subject: [PATCH 02/42] [MIRROR] Makes pinpointers tell what they are tracking when examined [MDB IGNORE] (#18676) * Makes pinpointers tell what they are tracking when examined (#72537) ## About The Pull Request Makes pinpointers tell what/who are they tracking when examined. ## Why It's Good For The Game Makes pinpointers more comfortable to use. ## Changelog :cl: qol: Pinpointers now tell what they are tracking when examined /:cl: * Makes pinpointers tell what they are tracking when examined Co-authored-by: SuperSlayer <91609255+SuperSlayer0@users.noreply.github.com> --- code/game/objects/items/pinpointer.dm | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/code/game/objects/items/pinpointer.dm b/code/game/objects/items/pinpointer.dm index f50230ab2c5..82fe4ffae96 100644 --- a/code/game/objects/items/pinpointer.dm +++ b/code/game/objects/items/pinpointer.dm @@ -37,6 +37,11 @@ toggle_on() user.visible_message(span_notice("[user] [active ? "" : "de"]activates [user.p_their()] pinpointer."), span_notice("You [active ? "" : "de"]activate your pinpointer.")) +/obj/item/pinpointer/examine(mob/user) + . = ..() + if(target) + . += "It is currently tracking [target]." + /obj/item/pinpointer/proc/toggle_on() active = !active playsound(src, 'sound/items/screwdriver2.ogg', 50, TRUE) From d4902ba3507acb4047e732b2c3960b1414e7def0 Mon Sep 17 00:00:00 2001 From: SkyratBot <59378654+SkyratBot@users.noreply.github.com> Date: Fri, 13 Jan 2023 06:53:56 +0100 Subject: [PATCH 03/42] Automatic changelog for PR #18680 [ci skip] --- html/changelogs/AutoChangeLog-pr-18680.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-18680.yml diff --git a/html/changelogs/AutoChangeLog-pr-18680.yml b/html/changelogs/AutoChangeLog-pr-18680.yml new file mode 100644 index 00000000000..3bb52f1d948 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-18680.yml @@ -0,0 +1,4 @@ +author: "ShizCalev" +delete-after: True +changes: + - qol: "Airlock interfaces will now open up automatically if access is restored early while an AI is hacking it." \ No newline at end of file From 2855e620d18587a2b0d2235bb5f0601eb8a73e7a Mon Sep 17 00:00:00 2001 From: SkyratBot <59378654+SkyratBot@users.noreply.github.com> Date: Fri, 13 Jan 2023 06:54:16 +0100 Subject: [PATCH 04/42] Automatic changelog for PR #18676 [ci skip] --- html/changelogs/AutoChangeLog-pr-18676.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-18676.yml diff --git a/html/changelogs/AutoChangeLog-pr-18676.yml b/html/changelogs/AutoChangeLog-pr-18676.yml new file mode 100644 index 00000000000..54ca3acc410 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-18676.yml @@ -0,0 +1,4 @@ +author: "SkyratBot" +delete-after: True +changes: + - qol: "Pinpointers now tell what they are tracking when examined" \ No newline at end of file From 0fe3d33f463fb9e2ba6de069c5cf1754d89013d7 Mon Sep 17 00:00:00 2001 From: Useroth <37159550+Useroth@users.noreply.github.com> Date: Fri, 13 Jan 2023 17:14:27 +0100 Subject: [PATCH 05/42] Some more donator stuff (#18688) * Added a donator item; updated a plushie sprite * Small touch-ups * Ah well * Ah well x2 --- .../icons/donator/mob/clothing/mask.dmi | Bin 6181 -> 7181 bytes .../donator/mob/inhands/donator_left.dmi | Bin 1138 -> 1391 bytes .../donator/mob/inhands/donator_right.dmi | Bin 1138 -> 1347 bytes .../icons/donator/obj/clothing/masks.dmi | Bin 2235 -> 2741 bytes .../master_files/icons/obj/plushes.dmi | Bin 59697 -> 65712 bytes .../clothing/~donator/donator_clothing.dm | 14 +++++++++++++- .../donator/personal/donator_personal.dm | 5 +++++ .../modules/modular_items/code/ciggies.dm | 3 +++ 8 files changed, 21 insertions(+), 1 deletion(-) diff --git a/modular_skyrat/master_files/icons/donator/mob/clothing/mask.dmi b/modular_skyrat/master_files/icons/donator/mob/clothing/mask.dmi index fb5c38e7ca378df949710b71aa03f8edee224048..afec444d880223b4f0b4da9750a955cbac6f1765 100644 GIT binary patch literal 7181 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 literal 6181 zcmcIoc{o&W-#@5?Y}v9eg=7y!(NHLrWXX~(#4wi079(ROyND!PgzQw4eodjEKSf1GoF&V816ie&C1{-8%>8I=L>*VA1$j=S#1ptAW&j+j6LX|jct)L{Vqw!KJZn}+`46~W6m3VX0eu}quq%2 zz2L^reOz5c-86sw+-E*fC643KuO$4$f8K^I>S*^^%~qafr+*2rt2NwGY)XGht&N{M z>HJ3cUEY=6ux*Z|iMMbIqqMi?XUnZ4%GV04D&&~L$mMr34bJZ!q3d?JAnHG;br?<* zg%3))HFY?CDLqkLJ+0{K5I_7ra6btE`1lQUb<6@YNt19_p~W|h8|#^2XJiw(Bx3JB zi<4`3sdWo?M_$rGbl9 zmr0~P#M(B_9@`nqH-yJ$)X0@eJjE;o5ReuHo}(zed$y=J=8%2&!1t(bzPE%RVz~)> zmBSuIN|kFG3OV3cu=~7Zp`zzN5iRK==M{B)MHMKt>gww2>z5#yvJ_wJfG8A}00zaC z(FCte8MXF&i#eASoNlm5Jy_3}Ii6oW&s6*?$O<(Iv6k7c*Dcxn@FsecfvTq~VbcER zjZcXE?I6J|0R6eUnGpep!(%Qk72bR)Bq;kaqj+-CHr@Au@Q=}yjGyJ+4fm!}P6_iY zQxT1OlaSPoCD+bTR9=^$(Zn+@a#%J3B5r@?WpQ;fkSwB%;^8_|GQLe9bL=X zTBM&SgZ_X{V?yiN+USzLl}9+xvvFXU#)KAO!5r4wmva|US{XuU1RwX(i$W&j6{#OJDz5}@V*7q=ekYA7v!sO_(KyBut1`xQNzOlm z_$MMSFEkV;0KA~-@BZpitdHpAU;Qy|>c`sinAt`22_q1icBJ}8%Cqk&l6bn`1WZDz zy_-Iba_}?~%_Iu!{igP1E{1v0ditVBn8TaCttB1o*sSWgd5hO72ZiiU>W^|=y&SM} zW7br@7;nP}fTyUgqWhXn`xls1r0lxh&H?9TIo(%<27Swh+mSU{PRn)G6Ku~ATdW`I z+uyvdzGKtG902PPaD}tau|Al{Za{ElPhn!9(5E!FFO-ICk|63MLPZ+nYEQE4QzY|Z zz5o1z;h}g1B;@9#k@zojML_JAc?DT!Fz7*7o~5%D-T36>i#4Z~C5@I}n@KGzoN-xU zexhNMlO$^u_jGW0(a#qn;^WyG*mCmnu3ZU)Gpo=w(*Y0Lpt#_iK6>Cja9aU#0rl9= z@Ax$Q_-m((y6S_$pB8zDW@^yzeap<&PWw!Hz~-=1MozAOnpkmt#3)QPee!va#l6doP|U7W?gI=d^#_kcC-Z>@=QX;CPk4Lj5!so-$CyG zLZAceucWhOSEN{IR~#8^c9_~o0zwE=@$6F>^e>uu=b)nf(U#zjvjKb4O)`hgO8d_2wfFG z2|vAQngR;xuTT`%>%TcGZ#-WFf|?Jmf6iv-OztoRNKC>hid`W^kGVd+eJgI|4nglg ztlaIxh>a(o>q~Mo8=U1ncMzC1tDk4=ZELaJ9<{A#_HG+hHfBH8P;(tQuX6r8J@B## zHTQ+HiA~1W)*>=0iVmprWVm6JrYm8b!XC5AG>OAOMS3Dw_{^?^TheTjZD_glu8aL5 zZowszTb8rUV^T=QW5>=9M6^46d@ndA=;#<6+(!{BSKW{Ex!rbXWQwm#ye(A)3b%L% zd9ma-nXieS9{t6-X>UDSM7F@z$Oe}js2Tt8e7ee5dwYAOCw|u;kUT82yt+c>wnXq> zQN9wgaT|qMhlkcPP6f{0bCpTjFi!b3jzo|;GMbwok3u}Jjo9moAc#v#DT_OlyKOt- z%OG?NsTazaRj1cJ@}kD|MV>j*g+VNS_Q;epsV^>O{1>+Hm9n>xv~OmOD@Ql%y3^-A zcQvE~g@u?6xiDXXNw=7Pj~e28Yr1P{X_@)7YdMv(+B37>dPpYYkz0VE0?F(9%Cp8< zY{KHIHE_pKB+Q2$sD$rb3v6&*YJ9&cNaX;O&h9=sx%EXcFa)oo0k4;Mh%bXMyFXYl zTO(&6YR&O>+&tR$C@q*-k`!1#dZi^FV-up4I_I~|qP<4qs2KDfK)&=xekKgKm0 z)~kEL10Ol79^L5}tt;`gpJ5bpw*ZG(a@T$>o2@J15OG!9Kq?79=b39AOBKb}J@>KQ zu24<9(eX@I0$?7%UrxICXnfZDva@Mx{-}`CD9Sn626ao9V!fT4ZV<@Jsvfgnk`+wo zxc$WuizTifeY%bEBQ{Za__eiz&~}DXEr?IaNfpdhRKaVVRO?DGqU~e5pL3-qWwfrl zRkC6dCBZzO=p}M{uz!oG$f9?3b-ghMW4CwhXt@ku^4D8hv=BWL^fKm#`N)k-y54sr!H!UA{;U4N!Ar9al2mL`w#xXI6j^`0xfr%3Gc5L@H z<3%A^`$vwTbs87}b*AaFXk@!+o8IPEQ=GpuVIwN768&4TANs~0;$huhFzE@P`{!80 zd!@yR?9&bux(96~iVajq?TYf*h}w&u?n>JzH3Y*V$vl%$6Nf2=xBlD=?57&^R_t%V zIAV0mEai@2y_r*{!K~pLWf;I_Rf^2rb`@*t4G?0ivOJM^^^9e6 z{=snN#hmNqK_?U-b)NXG2CsrxT?z9uC+Y46PEDnMe)?4;0WXumELFR3s)j1-M7dRr zN%hsi*B$-3SO|2~k+cW&WZh~!@!$6XDNQ+cT*Lu#Y93V&$&w<^%^ah_ST<_Z4C^9W z)ccGOwjiB1&YT=|UX;Ake6I7Keaz9(#b$@tV%_{mI$d4ZDeeC-&^!u~`~PD19|1@G z5)}}5S-ZpFn!RoDA#r7Wd1{0BoY?5NHsHB-hMzei-=;pUJ8KY$L@qcC?H(wkCMI%< z5xr(kpFXYbGZ(FIF?w_q<3n7RK}&UEaX;9<-Ao!di#^jzQ?2zB?0$IitLL#ROnpWF z&VC{bxK0(d_HnsuERX-G%YKf*LT_wsHH4Q|SK2!E_F7dalxFreJOljUCCd1cx_JgV z5@+yn!er`)Al_SObseG3R`DkAI}W$j_`YM-`%F@ICJwgKKBIJ)8U9a_yAz;|!+qXD zIzbxe0FcPp?hETE$p5-;q%i62C$B!5DlH z@mCs+K6?{9H>v*))oIUAVjiR0*0}oFY$z$=Gyd%MBFM_&M@Rn-K3?cRwnm4JPQaj4 zm2JU`FH5P|jVN}}slyQq`|etIoQVMGz?nEo(x9aulJGdK?YADXVmN>BQ|;zi?w5xd z?a5&pUaA5-IRASzY0AGllxu1unA(w){{HppCxpx4U^^GC)0}XHywof@vsFwwZ~%w> zHsp|(*RHSrS#)ND8mb*+272Cx_p+c#0A4gCJp@DeOrAgUz8qH zalrCH7<4B=NF#SB+5he96~YAUmM3Y}(lYHRASc(GTesu=p>E=2$IX0j1}P~d0FAFN z0swh=JcBzSeBjMx6^(%mj&qMC&3u6W#l<8I29w!NoOqbU64n05_F`r8?YM-B2GM+2 z3Cg`x-q*L@*wmLVHkPHh{7vi6pY$g0K3U$sxi3Orhy+~S=tNM52H+$deSTe9SnxWS z3VFPD+sK{)-J7kZ=ARY6EQ1E?!faxyb;0en>sCF`-T7KBIQbI4?SGr3Ef+x%kw{N` zbJXCnX;FSnDbe)7{P#+*LWM!e2T0U4b9c(~%LhS4K+dMmhjC4>y;ZXs0;$j>Km~Q@ zj@|WJEJ_*(twjW8vOy(meB9a<24i@^ma|WxOkuTkZ%zndIrELKA3+P%uFT5`=%$EX zjz3)>bnwr@^2NCHN>RBSogVy@ zG@w~y%_g)Lqq)`V)%rF-T2P?wrjt`?1;x$7BY83F@|i;U8a36w;M|jg!bt|k5Q##? z=g-SSudUyCy_k(~2{1;U-Iw^iIg9n(VVoBMUDiULD_D#+e1-=7ZO1PjiUTe5pv407 z)V)sl)vZr>j{A0WwiA<)AT%RaiOk_zhNp&0gtkRrJxSN7G{=Wn-@p0x-8 zM*`}YSkp-u4A%b5#HvD#Z|s8`Q&JMn*wi$tpuo(f^xeDmxjBE2i4Sw`2iid=s5|wg z02*^RZ*)9rHxFFh{cdSYL_~yDnrX-Ndp>~Pzf{B>__xBw9UkwAfAp`qMucnzYC<72 z)3l#3)CKJ)nfG;k6LJxAN>cgwH)m8c4KEs2FZ0mY2tA!v_Lql5^ zaQfoOjj>?Q{zNkZ`G;oU10Z!y3C7X^;4nNkX(8Os`~MF~`X6qweBz?vhzUxpiGHt@ zoyx?gNQEwZpIT*{*&z{A_N5e%;+hobT@;_Im)FEZb%BiO?CaN;!rKox6Ht-M%kJs! z*AjY8Zthlaq%m2oc5ITL=qQQ%{liqUWy7mEiSQ}(I9wlN0U;*uA3$90nXlqDni&W6 zd6*;SM&?*SV~v~72roXlK?p^>x^brLYyYhiqPZvk(zTED|H0o>&JD815-n0XX+w3d zz5l4DW(B&Jq#ox8$Li?L$)M}JCKYBjLV%XGHjf33NDfY(yroZ$X&cI|PF~oFu|3uI zHU>VDx_UEeIV%e?X!P$l95rfcwaVf2gFn7WnI_>z=l6n^1sRGPd61kz;HLh`#f9Bn zBf8~jHyCUy*q7|6TK}OuJ%#Xl%Y@`gs9o5^EHBP0sUiAcUT#SvcBR=!OVU^&gs67P zjdJcB`o6X2^4b-2*ViEzF{Bf@tE)))@)H(tj=lX;=Pdb?lMq{UEm>MxzkbFtJ{-sr zp$oO*ms2RL%tNN8U9{P$16w%-^6o^9p`l$(p;U#{{?kgRQG({DfC@$N58z!8DfR|J zA#k$k+6A{+*%fY&uPIXFO$VPo`a-3+E;%_V4-XH|{2@EI*8sYq!OdQ3Hh#zU7p~Oa zc`DFaKtSmtgdI>Cplz>MG&ghF1#hBl8o6a%ooW}qmNyg_!rY02-+sh>3RtJtb~#a} zsyZDboz*fo%-y5Kc6lNo#!cmu7La~{kI!^k<`lT#!1*F;ZL(ikVIiBpzYzfZkxJex zk^5(;hp_|3*49y-o!oYT)T6=si;z@`p#@WK4>4lVzGcxqIKHslFfAi{R}u||c|hLr zD=eRwXncux0PfZQ`n3QnGe`I<-$|>F|8;3u39$zT(-|XPe;gycA&&7 ztNEyktSA~qmw5Bfr5+=Pv4%3bM35$biu0WVz?mp;jN?BC_EAE7xw{+tzazo_{(ynr L9o_d=AB6rF@@d9& diff --git a/modular_skyrat/master_files/icons/donator/mob/inhands/donator_left.dmi b/modular_skyrat/master_files/icons/donator/mob/inhands/donator_left.dmi index 03ce692af5f5c97572be8147a86e4db835333927..08778840e272a25b236e62ecc134d548a597dfac 100644 GIT binary patch delta 1339 zcmV-B1;qOD2=59?iBL{Q4GJ0x0000DNk~Le0003X000312m=5B03`8Sga7~lfly3T zMZmzoS6yvVU}^aL|1>~G&3)UKN2Gx+h`-F(Kt@$2E-{fT9u*W26C4fzyA-~j3!&RC z-irv1psl)*eH$l98~}~Y_g-6IX{*sfe5Sy_z#3qjg8%>k0d!JMQvg8b*k%9#0LGE9 z6@SeN!Y~ko&&^W=y%w?lpcgM<5fAzbvQ4&4Xl-S8ReXD+9)ePlxy-_R%&Y;^fMBo#3sf@{gaegWPy7T`QWBi->9d#= zFyaj~1zp(vP1hZrxxy9$(;p6tEH-ctc7KsBB6;pijdBAqKU!uHoTo2E_yl}K>)9D! z0Uf)t{JZoUY5R#~Y|YXSsiDpfo7eXrPm^%=^A)d@000BZNkl6o%m# zrWSDtnrhU9R;{@F|36ryQM1g1W!cJ}3J z>OAEs-lsIALdu?jm%y=$U+Mwe1%H}e$-UEy+UrkKRoCmw)N?jTr2h6@+-Ro$9HH`w zH5bm_z<@8%Q5?_bp7D?7^VpZ4F+zVSpw#jO3U)Fw z^SLJ9%iBY(3a^DnvojxYX&-`z^rb>QcG|9^GZkG}Ia%0cq{W$oWDd9I(`M;z!uH;$#5vZv6t$|${1 z-r|;K6&{Y@{7-+B3$z4qs(k!TX#S^1%7D^#0Ouoqqpnb3ynm)o$^}|>Sn1<;0^>D( zQZCT;b5OGj0RR9100000004lY%k$Uu1FsDQaFpY0=6@Os0M(rz000000000000000 z*kzsPZ{F4qyfrkxa-2MWUqA5P)CUj&000000000000000J4~6Q=|BI|(&rBW00000 x0000000000yCh7RqiHRFLyiXk007tv{{WqjJ-tNni68&~002ovPDHLkV1ic*b;1Au delta 1084 zcmV-C1jGC93i1dniBL{Q4GJ0x0000DNk~Le0002M0002M2m=5B0A&K4H2?qra!^cE zMZmzokxCvj91Z{!5EEBjZBk%q`27DgKt|1d+m}bAKt@%+%-Df0h@h>yCN43%6uzDd zq1!IriwKU9eH$3Sz`#37(J=r300DGTPE!Ct=GbNc0066zzZHK?3xYrphR?gdV$rKa zABLwcp@fJ05999SE}F{hl=SagEAUdpT%H%+hZ!bT$Kq60DnFO>lywxo-=Pd+1KRaE)w15Y5dOi4G_p?d%T0{2NoK~#90 z?b~fr+CUJ%aa0IWg`|>_fTUIG_y3Fy^kHmsx3|Y0Ug-RPZ=4}_`v8f9n>d*O07mO3 zcL9E?(r#|!)|=_Gyemz&==MW8P-ls*e{3DZ*FUxn!iIkz(sgyw0Dl9E`|$2!YHh%s zuFG}cxUjzp>^G~*r!Tcoz_PA48{rLHZZ@^F zzY6TPS|2ks6YpEpAKz@k#|83!005AKads7iaB7sAm-{0d_e3SH<&}?;)MNNNOYnGXAk5qNLYs=NYFR#jWX9@c= z_O|~U#vCP-wN!Y-wj{u_Sziz=lhed>KBJbG2j2De$kO+4Dz- zPN9D>%=f!j#|680UD@N*9lpN~itW0+_SaB;ZwJ?}(eCZzD>;|*WVxC%2mk;8007`> z38Q%3e9tuBPmo`jqv|HCrr~UY{K6<+H>9`B_fzB-M)Ce5;YF&wC+1JU7{IegeGYX8 z-$k%@jeU~`aE|wn1Aa|zIg7utgaMr6{nLMdUz7XDIbQ!2TQy@h2Jmd}^z(85N@WaV z0M8-@`~Uy|0001EmwUc%%%6Y0Z_S^5zHiNMdVXJCstn>-7Lh*xDdbufa|T(T-?!hO z7#0xo?*r!N_pLW590eTH>pQSMzki7v6mkDPV10i75;rKgy8r+H0001RarWo;b2Bs# zXLB<@zn|O78Ary%JRZ-@{QQ1y=J9xT=J7ZHDE$C$>^O|z{Ki560000R0!}d|+*bSZB+Yeh9G!v^Ffy~1cAcllR*9u*!chzAz z0n3rCmEMJ_@Zszb&PoW*(Io+D+&={t!B{P7rNpH9s?kzBGs5u-zM{e+gtDe@UA6%87^C zV}c_$msX?PSG1_^b8mh+3E9qTRPa8VM6YE=oD&S|*RTilZ;52)KFqi;OGfpD001rX zz_|n@mP+19{6_5%8K(?*ue5Y_8tQbPXJf5pVA>u_e`^k}z}7u??I2jPHM< zj{u!tBu31}2Q4TN5g;yJuXD=}5GzGDwKL&a_v@s|&j-X7h*2=Xa-^bGQS~T%Y0gM(r=WhpCwHZB%Agx@}xr8fKGd zGq$d)g>u>SvC*liDcnit11y;{cK>V@t<*+%le6z7R|3in*e(LJjV0ocZWWZ43b)*tic{_fzRurKv`Ff&_br2k#IQV zKR5ce?&_gLr`j2@L((PFw=rrimCSV--UJi)Fa@=MA0aw15i7&i z%adC`*a_{jAq$ZCm@a%gPZ{Nx#Qkmr>L1%sHe?Ah8|g==dFbUc$Gy|pjdiFrdQa?B zY=H=sWxjZ~Z#qR;;=NHAm8~F1EoO8dn&Nbmmm;c>sYqZ8-11M&4*~$FMk=eaGAet> zt5hLKor`_Z!R68`%&koA-pWnl9r-XpcklQnu98paygsK@ocXU$J|*em{pLSbAn(e_ z5#bc8wvCUE?js#QHJELM$-1RzAN!Jeg_+F}0*q>R$y-+AyS;4rYU@6f|9SOaBdb4j3<69$ImNr znp9oM5@OpUA|{bG-b<)ICF-@<0X^k3L97SJ@p*}a^L&W&1UeY7aw0NWbZq&GfC5&g zdT5-Z*xqS{Cs2)V-G#QfZAeC`Muwt5R+zYsDZ2AllNzqP;8NJPUDy2C-W zUT(D@_i?%Sy_agCE9jY0s!leml!)&Q&R;LaHTu({2_e^6B-9fbXrza`H?Gb#?8^V5 C?qlQt delta 1084 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
r0PjF{PL@*vaFGRk+FC((= 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 F{{ttc_tyXb literal 59697 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 Date: Fri, 13 Jan 2023 23:52:59 +0100 Subject: [PATCH 06/42] [MIRROR] [NO GBP] Fixes a runtime caused by basic ghost mobs [MDB IGNORE] (#18695) * [NO GBP] Fixes a runtime caused by basic ghost mobs (#72622) ## About The Pull Request Fixes a runtime that was causing the CI to fail. The Bald hairstyle and Shaved facial hairstyle had no associated sprites in the hairstyle global lists. This would cause a runtime when trying to generate the hair/beard sprite. Bonus behind-the-scenes picture of the debug process: ![image](https://user-images.githubusercontent.com/28870487/211610958-fa7432a2-d848-4757-9ae1-e2f91d573ac3.png) ## Why It's Good For The Game I get scared every time Fikou pings me and this will make him stop. ## Changelog :cl: fix: Bald/Shaved ghosts will no longer cause a runtime and spawn without a name. /:cl: * [NO GBP] Fixes a runtime caused by basic ghost mobs Co-authored-by: Rhials --- code/modules/mob/living/basic/retaliate/ghost.dm | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/code/modules/mob/living/basic/retaliate/ghost.dm b/code/modules/mob/living/basic/retaliate/ghost.dm index f687fc373e0..ca6aef5e381 100644 --- a/code/modules/mob/living/basic/retaliate/ghost.dm +++ b/code/modules/mob/living/basic/retaliate/ghost.dm @@ -68,14 +68,14 @@ ghost_facial_hairstyle = random_facial_hairstyle() ghost_facial_hair_color = ghost_hair_color - if(!isnull(ghost_hairstyle)) + if(!isnull(ghost_hairstyle) && ghost_hairstyle != "Bald") //Bald hairstyle and the Shaved facial hairstyle lack an associated sprite and will not properly generate hair, and just cause runtimes. var/datum/sprite_accessory/hair_style = GLOB.hairstyles_list[ghost_hairstyle] //We use the hairstyle name to get the sprite accessory, which we copy the icon_state from. ghost_hair = mutable_appearance('icons/mob/species/human/human_face.dmi', "[hair_style.icon_state]", -HAIR_LAYER) ghost_hair.alpha = 200 ghost_hair.color = ghost_hair_color add_overlay(ghost_hair) - if(!isnull(ghost_facial_hairstyle)) + if(!isnull(ghost_facial_hairstyle) && ghost_facial_hairstyle != "Shaved") var/datum/sprite_accessory/facial_hair_style = GLOB.facial_hairstyles_list[ghost_facial_hairstyle] ghost_facial_hair = mutable_appearance('icons/mob/species/human/human_face.dmi', "[facial_hair_style.icon_state]", -HAIR_LAYER) ghost_facial_hair.alpha = 200 From c092ac78e1c9b0cae6895ca246b2079efbb6d6a0 Mon Sep 17 00:00:00 2001 From: SkyratBot <59378654+SkyratBot@users.noreply.github.com> Date: Fri, 13 Jan 2023 23:53:26 +0100 Subject: [PATCH 07/42] [MIRROR] Light Replacer cleanup and afterattack improvement [MDB IGNORE] (#18694) * Light Replacer cleanup and afterattack improvement (#72566) ## About The Pull Request Makes a few code improvements to the light replacer. * increment, decrement, and bulb shards were three values unnecessarily stored as vars on the light replacer. They are now defines, as they were static values either way. * Autodocs variables on the light replacer. * Everything uses snake case, and the single-character vars have all been smote from existence. * Changes some 0/1 use to FALSE/TRUE In addition to this cleanup, the afterattack chain has been cleaned up a lot. It now allows you to click on either the light, OR the turf under it to replace a light. As a bonus, you now get some balloon alerts when trying to replace lights while empty. ## Why It's Good For The Game Closes #72557. Cleans up the code I had to shuffle through to do so. ## Changelog :cl: Rhials qol: the light replacer now allows you to click on either the light, or the floor beneath it, to refill lights. code: light replacer code is now a bit prettier. /:cl: * Light Replacer cleanup and afterattack improvement Co-authored-by: Rhials --- .../objects/items/devices/lightreplacer.dm | 195 +++++++++--------- code/modules/power/floodlight.dm | 2 +- code/modules/power/lighting/light.dm | 2 +- 3 files changed, 105 insertions(+), 94 deletions(-) diff --git a/code/game/objects/items/devices/lightreplacer.dm b/code/game/objects/items/devices/lightreplacer.dm index 98414aaefd0..bb0f20cdb02 100644 --- a/code/game/objects/items/devices/lightreplacer.dm +++ b/code/game/objects/items/devices/lightreplacer.dm @@ -27,12 +27,13 @@ // examines you when you're holding it in your hand, you will be discovered. // +#define GLASS_SHEET_USES 5 +#define LIGHTBULB_COST 1 +#define BULB_SHARDS_REQUIRED 4 /obj/item/lightreplacer - name = "light replacer" desc = "A device to automatically replace lights. Refill with broken or working light bulbs, or sheets of glass." - icon = 'icons/obj/janitor.dmi' icon_state = "lightreplacer" inhand_icon_state = "electronic" @@ -44,97 +45,95 @@ slot_flags = ITEM_SLOT_BELT force = 8 - var/max_uses = 20 + /// How many uses does our light replacer have? var/uses = 10 - // How much to increase per each glass? - var/increment = 5 - // How much to take from the glass? - var/decrement = 1 + /// The maximum number of lights this replacer can hold + var/max_uses = 20 + /// The light replacer's charge increment (used for adding to cyborg light replacers) var/charge = 1 - // Eating used bulbs gives us bulb shards + /// Eating used bulbs gives us bulb shards. Requires BULB_SHARDS_MAXIMUM to produce a new light. var/bulb_shards = 0 - // when we get this many shards, we get a free bulb. - var/shards_required = 4 - // whether it is "bluespace powered" (can be used at a range) + /// whether it is "bluespace powered" (can be used at a range) var/bluespace_toggle = FALSE /obj/item/lightreplacer/examine(mob/user) . = ..() . += status_string() -/obj/item/lightreplacer/attackby(obj/item/W, mob/user, params) +/obj/item/lightreplacer/attackby(obj/item/insert, mob/user, params) - if(istype(W, /obj/item/stack/sheet/glass)) - var/obj/item/stack/sheet/glass/G = W + if(istype(insert, /obj/item/stack/sheet/glass)) + var/obj/item/stack/sheet/glass/glass_to_insert = insert if(uses >= max_uses) to_chat(user, span_warning("[src.name] is full.")) return - else if(G.use(decrement)) - AddUses(increment) + else if(glass_to_insert.use(LIGHTBULB_COST)) + add_uses(GLASS_SHEET_USES) to_chat(user, span_notice("You insert a piece of glass into \the [src.name]. You have [uses] light\s remaining.")) return else to_chat(user, span_warning("You need one sheet of glass to replace lights!")) - if(istype(W, /obj/item/shard)) + if(istype(insert, /obj/item/shard)) if(uses >= max_uses) to_chat(user, span_warning("\The [src] is full.")) return - if(!user.temporarilyRemoveItemFromInventory(W)) + if(!user.temporarilyRemoveItemFromInventory(insert)) return - AddUses(round(increment*0.75)) + add_uses(round(GLASS_SHEET_USES*0.75)) to_chat(user, span_notice("You insert a shard of glass into \the [src]. You have [uses] light\s remaining.")) - qdel(W) + qdel(insert) return - if(istype(W, /obj/item/light)) - var/obj/item/light/L = W - if(L.status == 0) // LIGHT OKAY + if(istype(insert, /obj/item/light)) + var/obj/item/light/light_to_insert = insert + if(light_to_insert.status == 0) // LIGHT OKAY if(uses < max_uses) - if(!user.temporarilyRemoveItemFromInventory(W)) + if(!user.temporarilyRemoveItemFromInventory(insert)) return - AddUses(1) - qdel(L) + add_uses(1) + qdel(light_to_insert) else - if(!user.temporarilyRemoveItemFromInventory(W)) + if(!user.temporarilyRemoveItemFromInventory(insert)) return - to_chat(user, span_notice("You insert [L] into \the [src].")) - AddShards(1, user) - qdel(L) + to_chat(user, span_notice("You insert [light_to_insert] into \the [src].")) + add_shards(1, user) + qdel(light_to_insert) return - if(istype(W, /obj/item/storage)) - var/obj/item/storage/S = W + if(istype(insert, /obj/item/storage)) + var/obj/item/storage/storage_to_empty = insert var/found_lightbulbs = FALSE var/replaced_something = TRUE - for(var/obj/item/I in S.contents) - if(istype(I, /obj/item/light)) - var/obj/item/light/L = I - found_lightbulbs = TRUE - if(src.uses >= max_uses) - break - if(L.status == LIGHT_OK) - replaced_something = TRUE - AddUses(1) - qdel(L) + for(var/obj/item/item_to_check in storage_to_empty.contents) + if(!istype(item_to_check, /obj/item/light)) + continue + var/obj/item/light/found_light = item_to_check + found_lightbulbs = TRUE + if(src.uses >= max_uses) + break + if(found_light.status == LIGHT_OK) + replaced_something = TRUE + add_uses(1) + qdel(found_light) - else if(L.status == LIGHT_BROKEN || L.status == LIGHT_BURNED) - replaced_something = TRUE - AddShards(1, user) - qdel(L) + else if(found_light.status == LIGHT_BROKEN || found_light.status == LIGHT_BURNED) + replaced_something = TRUE + add_shards(1, user) + qdel(found_light) if(!found_lightbulbs) - to_chat(user, span_warning("\The [S] contains no bulbs.")) + to_chat(user, span_warning("\The [storage_to_empty] contains no bulbs.")) return if(!replaced_something && src.uses == max_uses) to_chat(user, span_warning("\The [src] is full!")) return - to_chat(user, span_notice("You fill \the [src] with lights from \the [S]. " + status_string() + "")) + to_chat(user, span_notice("You fill \the [src] with lights from \the [storage_to_empty]. " + status_string() + "")) /obj/item/lightreplacer/emag_act() if(obj_flags & EMAGGED) @@ -143,9 +142,35 @@ /obj/item/lightreplacer/attack_self(mob/user) for(var/obj/machinery/light/target in user.loc) - ReplaceLight(target, user) + replace_light(target, user) to_chat(user, status_string()) +/obj/item/lightreplacer/afterattack(atom/target, mob/user, proximity) + . = ..() + if(!can_use(user)) + balloon_alert(user, "no more lights!") + return + + if(!proximity && !bluespace_toggle) + return + + if(!isturf(target)) + if(istype(target, /obj/machinery/light)) + if(!proximity && bluespace_toggle) + if(replace_light(target, user)) + user.Beam(target, icon_state = "rped_upgrade", time = 1 SECONDS) + playsound(src, 'sound/items/pshoom.ogg', 40, 1) + return + + for(var/atom/target_atom in target) + if(!can_use(user)) //We check inside the loop in case we're filling multiple lights with one click + balloon_alert(user, "no more lights!") + return + replace_light(target_atom, user) + if(bluespace_toggle) + user.Beam(target, icon_state = "rped_upgrade", time = 1 SECONDS) + playsound(src, 'sound/items/pshoom.ogg', 40, 1) + /obj/item/lightreplacer/update_icon_state() icon_state = "[initial(icon_state)][(obj_flags & EMAGGED ? "-emagged" : "")]" return ..() @@ -155,19 +180,19 @@ /obj/item/lightreplacer/proc/Use(mob/user) playsound(src.loc, 'sound/machines/click.ogg', 50, TRUE) - AddUses(-1) - return 1 + add_uses(-1) + return TRUE // Negative numbers will subtract -/obj/item/lightreplacer/proc/AddUses(amount = 1) +/obj/item/lightreplacer/proc/add_uses(amount = 1) uses = clamp(uses + amount, 0, max_uses) -/obj/item/lightreplacer/proc/AddShards(amount = 1, user) +/obj/item/lightreplacer/proc/add_shards(amount = 1, user) bulb_shards += amount - var/new_bulbs = round(bulb_shards / shards_required) + var/new_bulbs = round(bulb_shards / BULB_SHARDS_REQUIRED) if(new_bulbs > 0) - AddUses(new_bulbs) - bulb_shards = bulb_shards % shards_required + add_uses(new_bulbs) + bulb_shards = bulb_shards % BULB_SHARDS_REQUIRED if(new_bulbs != 0) to_chat(user, span_notice("\The [src] fabricates a new bulb from the broken glass it has stored. It now has [uses] uses.")) playsound(src.loc, 'sound/machines/ding.ogg', 50, TRUE) @@ -176,19 +201,22 @@ /obj/item/lightreplacer/proc/Charge(mob/user) charge += 1 if(charge > 3) - AddUses(1) + add_uses(1) charge = 1 -/obj/item/lightreplacer/proc/ReplaceLight(obj/machinery/light/target, mob/living/U) +/obj/item/lightreplacer/proc/replace_light(obj/machinery/light/target, mob/living/user) + + if(!istype(target)) //Confirm that it's a light we're testing, because afterattack runs this for everything on a given turf and will runtime + return if(target.status != LIGHT_OK) - if(CanUse(U)) - if(!Use(U)) - return - to_chat(U, span_notice("You replace \the [target.fitting] with \the [src].")) + if(can_use(user)) + if(!Use(user)) + return FALSE + to_chat(user, span_notice("You replace \the [target.fitting] with \the [src].")) if(target.status != LIGHT_EMPTY) - AddShards(1, U) + add_shards(1, user) target.status = LIGHT_EMPTY target.update() @@ -203,14 +231,14 @@ target.on = target.has_power() target.update() qdel(L2) - return + return TRUE else - to_chat(U, span_warning("\The [src]'s refill light blinks red.")) - return + to_chat(user, span_warning("\The [src]'s refill light blinks red.")) + return FALSE else - to_chat(U, span_warning("There is a working [target.fitting] already inserted!")) - return + to_chat(user, span_warning("There is a working [target.fitting] already inserted!")) + return FALSE /obj/item/lightreplacer/proc/Emag() obj_flags ^= EMAGGED @@ -221,33 +249,12 @@ name = initial(name) update_appearance() -/obj/item/lightreplacer/proc/CanUse(mob/living/user) +/obj/item/lightreplacer/proc/can_use(mob/living/user) src.add_fingerprint(user) if(uses > 0) - return 1 + return TRUE else - return 0 - -/obj/item/lightreplacer/afterattack(atom/T, mob/U, proximity) - . = ..() - if(!proximity && !bluespace_toggle) - return - if(!isturf(T)) - return - - var/used = FALSE - for(var/atom/A in T) - if(!CanUse(U)) - break - used = TRUE - if(istype(A, /obj/machinery/light)) - if(!proximity && bluespace_toggle) - U.Beam(A, icon_state = "rped_upgrade", time = 1 SECONDS) - playsound(src, 'sound/items/pshoom.ogg', 40, 1) - ReplaceLight(A, U) - - if(!used) - to_chat(U, span_warning("\The [src]'s refill light blinks red.")) + return FALSE /obj/item/lightreplacer/cyborg/Initialize(mapload) . = ..() @@ -261,3 +268,7 @@ /obj/item/lightreplacer/blue/emag_act() return // balancing against longrange explosions + +#undef GLASS_SHEET_USES +#undef LIGHTBULB_COST +#undef BULB_SHARDS_REQUIRED diff --git a/code/modules/power/floodlight.dm b/code/modules/power/floodlight.dm index 70fe6f86fa0..8b0769ec8e6 100644 --- a/code/modules/power/floodlight.dm +++ b/code/modules/power/floodlight.dm @@ -45,7 +45,7 @@ return if(istype(O, /obj/item/lightreplacer)) var/obj/item/lightreplacer/L = O - if(state == FLOODLIGHT_NEEDS_LIGHTS && L.CanUse(user)) + if(state == FLOODLIGHT_NEEDS_LIGHTS && L.can_use(user)) L.Use(user) to_chat(user, span_notice("You put lights in [src].")) new /obj/machinery/power/floodlight(loc) diff --git a/code/modules/power/lighting/light.dm b/code/modules/power/lighting/light.dm index 3ad66fc93bb..6d7d651fe25 100644 --- a/code/modules/power/lighting/light.dm +++ b/code/modules/power/lighting/light.dm @@ -337,7 +337,7 @@ //Light replacer code if(istype(tool, /obj/item/lightreplacer)) var/obj/item/lightreplacer/replacer = tool - replacer.ReplaceLight(src, user) + replacer.replace_light(src, user) return // attempt to insert light From 2691501986b048b71678d9642c97a8074edc427d Mon Sep 17 00:00:00 2001 From: SkyratBot <59378654+SkyratBot@users.noreply.github.com> Date: Fri, 13 Jan 2023 23:53:30 +0100 Subject: [PATCH 08/42] Automatic changelog for PR #18695 [ci skip] --- html/changelogs/AutoChangeLog-pr-18695.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-18695.yml diff --git a/html/changelogs/AutoChangeLog-pr-18695.yml b/html/changelogs/AutoChangeLog-pr-18695.yml new file mode 100644 index 00000000000..bc538d70b51 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-18695.yml @@ -0,0 +1,4 @@ +author: "SkyratBot" +delete-after: True +changes: + - bugfix: "Bald/Shaved ghosts will no longer cause a runtime and spawn without a name." \ No newline at end of file From 60b413c1283f7128f6cadd00bd090381fe128fc5 Mon Sep 17 00:00:00 2001 From: SkyratBot <59378654+SkyratBot@users.noreply.github.com> Date: Fri, 13 Jan 2023 23:53:44 +0100 Subject: [PATCH 09/42] [MIRROR] Fixes a neck slice runtime [MDB IGNORE] (#18696) * Fixes a neck slice runtime (#72582) ## About The Pull Request The neck slice status effect didn't remove or react properly in tick, and kept going after deleting itself. Adds some returns. Also adds an examine message since i'm here. ## Why It's Good For The Game Less runtime ## Changelog :cl: Melbert fix: Fixed a runtime from neck slices on headless mobs. qol: Neck sliced folk now have an examine message saying as much. /:cl: * Fixes a neck slice runtime Co-authored-by: MrMelbert <51863163+MrMelbert@users.noreply.github.com> --- code/datums/status_effects/debuffs/debuffs.dm | 28 +++++++++++++------ 1 file changed, 19 insertions(+), 9 deletions(-) diff --git a/code/datums/status_effects/debuffs/debuffs.dm b/code/datums/status_effects/debuffs/debuffs.dm index 5d53d9f1cad..519904aaabf 100644 --- a/code/datums/status_effects/debuffs/debuffs.dm +++ b/code/datums/status_effects/debuffs/debuffs.dm @@ -417,23 +417,33 @@ alert_type = null duration = -1 +/datum/status_effect/neck_slice/on_apply() + if(!ishuman(owner)) + return FALSE + if(!owner.get_bodypart(BODY_ZONE_HEAD)) + return FALSE + return TRUE + /datum/status_effect/neck_slice/tick() - var/mob/living/carbon/human/H = owner - var/obj/item/bodypart/throat = H.get_bodypart(BODY_ZONE_HEAD) - if(H.stat == DEAD || !throat) - H.remove_status_effect(/datum/status_effect/neck_slice) + var/obj/item/bodypart/throat = owner.get_bodypart(BODY_ZONE_HEAD) + if(owner.stat == DEAD || !throat) // they can lose their head while it's going. + qdel(src) + return var/still_bleeding = FALSE - for(var/thing in throat.wounds) - var/datum/wound/W = thing - if(W.wound_type == WOUND_SLASH && W.severity > WOUND_SEVERITY_MODERATE) + for(var/datum/wound/bleeding_thing as anything in throat.wounds) + if(bleeding_thing.wound_type == WOUND_SLASH && bleeding_thing.severity > WOUND_SEVERITY_MODERATE) still_bleeding = TRUE break if(!still_bleeding) - H.remove_status_effect(/datum/status_effect/neck_slice) + qdel(src) + return if(prob(10)) - H.emote(pick("gasp", "gag", "choke")) + owner.emote(pick("gasp", "gag", "choke")) + +/datum/status_effect/neck_slice/get_examine_text() + return span_warning("[owner.p_their(TRUE)] neck is cut and is bleeding profusely!") /mob/living/proc/apply_necropolis_curse(set_curse) var/datum/status_effect/necropolis_curse/C = has_status_effect(/datum/status_effect/necropolis_curse) From b0eb509531f7f270400ee6bb3d3b9c00b1be2b8d Mon Sep 17 00:00:00 2001 From: SkyratBot <59378654+SkyratBot@users.noreply.github.com> Date: Fri, 13 Jan 2023 23:55:49 +0100 Subject: [PATCH 10/42] Automatic changelog for PR #18694 [ci skip] --- html/changelogs/AutoChangeLog-pr-18694.yml | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-18694.yml diff --git a/html/changelogs/AutoChangeLog-pr-18694.yml b/html/changelogs/AutoChangeLog-pr-18694.yml new file mode 100644 index 00000000000..fcd1ffc218a --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-18694.yml @@ -0,0 +1,5 @@ +author: "Rhials" +delete-after: True +changes: + - qol: "the light replacer now allows you to click on either the light, or the floor beneath it, to refill lights." + - code_imp: "light replacer code is now a bit prettier." \ No newline at end of file From f7afa27cebf0707158136b0f8c9638f358351ecf Mon Sep 17 00:00:00 2001 From: SkyratBot <59378654+SkyratBot@users.noreply.github.com> Date: Fri, 13 Jan 2023 23:57:17 +0100 Subject: [PATCH 11/42] Automatic changelog for PR #18696 [ci skip] --- html/changelogs/AutoChangeLog-pr-18696.yml | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-18696.yml diff --git a/html/changelogs/AutoChangeLog-pr-18696.yml b/html/changelogs/AutoChangeLog-pr-18696.yml new file mode 100644 index 00000000000..0e14e8e7154 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-18696.yml @@ -0,0 +1,5 @@ +author: "Melbert" +delete-after: True +changes: + - bugfix: "Fixed a runtime from neck slices on headless mobs." + - qol: "Neck sliced folk now have an examine message saying as much." \ No newline at end of file From 8fabd54ad6486a5f84411ee10e3ba4490b0a6a41 Mon Sep 17 00:00:00 2001 From: Zonespace <41448081+Zonespace27@users.noreply.github.com> Date: Fri, 13 Jan 2023 15:05:12 -0800 Subject: [PATCH 12/42] Mirrors #72354 (#18654) * [no gbp] removes all duplicate armor datums (#72354) closes #72348 Title My bad Heres the script I used this time if you want to ```cs var baseDir = Environment.CurrentDirectory; var allFiles = Directory.EnumerateFiles($@"{baseDir}\code", "*.dm", SearchOption.AllDirectories).ToList(); var known = new Dictionary>>(); foreach (var file in allFiles) { var fileLines = File.ReadAllLines(file); for (var i = 0; i < fileLines.Length; i++) { var line = fileLines[i]; if (line.StartsWith("/datum/armor/")) { var armorName = line.Replace("/datum/armor/", "").Trim(); if (!known.ContainsKey(armorName)) known[armorName] = new List>(); var knownList = known[armorName]; knownList.Add(new KeyValuePair(file, i)); } } } Console.WriteLine($"There are {known.Sum(d => d.Value.Count)} duplicate armor datums."); var duplicates = new Dictionary>(); foreach (var (_, entries) in known) { var actuals = entries.Skip(1).ToList(); foreach (var actual in actuals) { if (!duplicates.ContainsKey(actual.Key)) duplicates[actual.Key] = new List(); duplicates[actual.Key].Add(actual.Value); } } Console.WriteLine($"There are {duplicates.Count} files to update."); foreach (var (file, idxes) in duplicates) { var fileContents = File.ReadAllLines(file).ToList(); foreach (var idx in idxes.OrderByDescending(i => i)) { string line; do { line = fileContents[idx]; fileContents.RemoveAt(idx); } while (!String.IsNullOrWhiteSpace(line)); } File.WriteAllLines(file, fileContents); } ``` * modular Co-authored-by: Zephyr <12817816+ZephyrTFA@users.noreply.github.com> --- code/game/machinery/buttons.dm | 27 -- code/game/machinery/deployable.dm | 16 -- code/game/machinery/doors/door.dm | 9 - code/game/machinery/doors/firedoor.dm | 18 -- code/game/machinery/doors/poddoor.dm | 9 - code/game/machinery/firealarm.dm | 8 - code/game/machinery/hologram.dm | 21 -- code/game/machinery/igniter.dm | 9 - .../machinery/porta_turret/portable_turret.dm | 90 ------- code/game/machinery/roulette_machine.dm | 9 - code/game/machinery/spaceheater.dm | 8 - .../telecomms/machines/message_server.dm | 28 -- code/game/objects/items/RCD.dm | 32 --- code/game/objects/items/cards_ids.dm | 40 --- code/game/objects/items/defib.dm | 16 -- code/game/objects/items/dualsaber.dm | 4 - code/game/objects/items/fireaxe.dm | 4 - code/game/objects/items/handcuffs.dm | 32 --- code/game/objects/items/kitchen.dm | 12 - code/game/objects/items/melee/baton.dm | 15 -- code/game/objects/items/melee/energy.dm | 24 -- code/game/objects/items/pneumaticCannon.dm | 4 - code/game/objects/items/puzzle_pieces.dm | 30 --- code/game/objects/items/shields.dm | 32 --- code/game/objects/items/singularityhammer.dm | 8 - code/game/objects/items/spear.dm | 8 - .../game/objects/items/stacks/sheets/glass.dm | 8 - .../items/stacks/sheets/sheet_types.dm | 21 -- code/game/objects/items/storage/backpack.dm | 92 ------- code/game/objects/items/tanks/watertank.dm | 36 --- code/game/objects/items/teleportation.dm | 10 - code/game/objects/items/tools/crowbar.dm | 16 -- code/game/objects/items/tools/screwdriver.dm | 12 - code/game/objects/items/tools/weldingtool.dm | 20 -- code/game/objects/items/tools/wrench.dm | 8 - code/game/objects/items/weaponry.dm | 68 ----- .../crates_lockers/crates/secure.dm | 24 -- code/game/objects/structures/displaycase.dm | 24 -- code/game/objects/structures/holosign.dm | 42 --- code/game/objects/structures/lattice.dm | 15 -- code/game/objects/structures/mineral_doors.dm | 21 -- code/game/objects/structures/tables_racks.dm | 44 ---- code/game/objects/structures/window.dm | 13 - .../antagonists/blob/structures/_blob.dm | 4 - .../antagonists/blob/structures/shield.dm | 4 - .../changeling/powers/mutations.dm | 5 - .../antagonists/clown_ops/clown_weapons.dm | 50 ---- .../atmospherics/machinery/airalarm.dm | 40 --- .../components/unary_devices/thermomachine.dm | 10 - .../atmospherics/machinery/other/meter.dm | 8 - .../machinery/portable/canister.dm | 27 -- .../awaymissions/mission_code/snowdin.dm | 112 -------- code/modules/cargo/supplypod.dm | 9 - code/modules/clothing/chameleon.dm | 67 ----- code/modules/clothing/glasses/_glasses.dm | 36 --- code/modules/clothing/gloves/plasmaman.dm | 90 ------- code/modules/clothing/gloves/tacklers.dm | 6 - code/modules/clothing/head/hardhat.dm | 44 ---- code/modules/clothing/neck/_neck.dm | 8 - code/modules/clothing/shoes/costume.dm | 3 - code/modules/clothing/spacesuits/pirate.dm | 10 - code/modules/clothing/spacesuits/syndi.dm | 240 ------------------ code/modules/clothing/suits/ablativecoat.dm | 8 - code/modules/clothing/suits/armor.dm | 11 - code/modules/clothing/suits/chaplainsuits.dm | 217 ---------------- code/modules/clothing/suits/costume.dm | 28 -- code/modules/clothing/suits/jacket.dm | 12 - code/modules/clothing/suits/labcoat.dm | 15 -- .../modules/clothing/suits/reactive_armour.dm | 36 --- code/modules/clothing/suits/wintercoats.dm | 13 - code/modules/clothing/under/_under.dm | 4 - code/modules/clothing/under/costume.dm | 72 ------ .../under/jobs/Plasmaman/civilian_service.dm | 5 - .../clothing/under/jobs/Plasmaman/command.dm | 7 - code/modules/clothing/under/jobs/command.dm | 12 - .../clothing/under/jobs/engineering.dm | 25 -- code/modules/clothing/under/jobs/medical.dm | 54 ---- code/modules/clothing/under/jobs/rnd.dm | 39 --- code/modules/clothing/under/jobs/security.dm | 182 ------------- code/modules/clothing/under/miscellaneous.dm | 36 --- .../industrial_lift/industrial_lift.dm | 5 - code/modules/library/bookcase.dm | 6 - .../ruins/lavalandruin_code/puzzle.dm | 9 - .../modules/mining/equipment/explorer_gear.dm | 10 - .../modules/mining/lavaland/megafauna_loot.dm | 81 ------ code/modules/mining/lavaland/tendril_loot.dm | 54 ---- .../carbon/human/species_types/golems.dm | 54 ---- .../hostile/mining_mobs/elites/elite.dm | 20 -- .../reagents/reagent_containers/cups/_cup.dm | 4 - code/modules/recycling/disposal/bin.dm | 16 -- code/modules/recycling/disposal/pipe.dm | 24 -- .../xenobiology/crossbreeding/_clothing.dm | 18 -- .../xenobiology/crossbreeding/_misc.dm | 8 - .../xenobiology/crossbreeding/_weapons.dm | 16 -- code/modules/vehicles/atv.dm | 8 - code/modules/vehicles/cars/vim.dm | 8 - code/modules/vehicles/mecha/combat/durand.dm | 9 - code/modules/vehicles/mecha/combat/gygax.dm | 8 - .../modules/vehicles/mecha/combat/marauder.dm | 27 -- code/modules/vehicles/mecha/combat/phazon.dm | 18 -- .../vehicles/mecha/combat/savannah_ivanov.dm | 27 -- code/modules/vehicles/mecha/working/clarke.dm | 27 -- code/modules/vehicles/mecha/working/ripley.dm | 27 -- code/modules/vending/_vending.dm | 10 - .../code/modules/clothing/under/jobs/cargo.dm | 5 - .../modules/clothing/under/jobs/command.dm | 5 - .../clothing/under/jobs/engineering.dm | 5 - .../modules/clothing/under/jobs/medical.dm | 5 - .../code/modules/clothing/under/jobs/rnd.dm | 5 - .../modules/SEVA_suit/code/seva_obj.dm | 11 - .../blueshield/code/blueshield_clothing.dm | 8 +- .../code/emergency_spacesuit.dm | 3 - .../game/objects/items/gladiator_items.dm | 10 - .../modules/hev_suit/code/hev_suit.dm | 22 -- .../medievalcrate_skyrat/code/vintageitems.dm | 9 - .../modules/nanotrasen_rep/code/clothing.dm | 8 +- .../modules/novaya_ert/code/head.dm | 11 - 117 files changed, 8 insertions(+), 3129 deletions(-) diff --git a/code/game/machinery/buttons.dm b/code/game/machinery/buttons.dm index 94556192c56..8700a36ddaf 100644 --- a/code/game/machinery/buttons.dm +++ b/code/game/machinery/buttons.dm @@ -214,15 +214,6 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/machinery/button/door, 24) /obj/machinery/button/door/indestructible resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | UNACIDABLE | ACID_PROOF -/datum/armor/machinery_button - melee = 50 - bullet = 50 - laser = 50 - energy = 50 - bomb = 10 - fire = 90 - acid = 70 - /obj/machinery/button/door/setup_device() if(!device) if(normaldoorcontrol) @@ -321,15 +312,6 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/machinery/button/door, 24) device_type = /obj/item/assembly/control/curtain var/sync_doors = TRUE -/datum/armor/machinery_button - melee = 50 - bullet = 50 - laser = 50 - energy = 50 - bomb = 10 - fire = 90 - acid = 70 - /obj/machinery/button/curtain/setup_device() var/obj/item/assembly/control/curtain = device curtain.sync_doors = sync_doors @@ -366,15 +348,6 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/machinery/button/door, 24) /// The specific lift id of the tram we're calling. var/lift_id = MAIN_STATION_TRAM -/datum/armor/machinery_button - melee = 50 - bullet = 50 - laser = 50 - energy = 50 - bomb = 10 - fire = 90 - acid = 70 - /obj/machinery/button/tram/setup_device() var/obj/item/assembly/control/tram/tram_device = device tram_device.initial_id = id diff --git a/code/game/machinery/deployable.dm b/code/game/machinery/deployable.dm index 57c1e531d36..ab73335d865 100644 --- a/code/game/machinery/deployable.dm +++ b/code/game/machinery/deployable.dm @@ -174,14 +174,6 @@ actions_types = list(/datum/action/item_action/toggle_barrier_spread) var/mode = SINGLE -/datum/armor/barricade_security - melee = 10 - bullet = 50 - laser = 50 - energy = 50 - bomb = 10 - fire = 10 - /obj/item/grenade/barrier/examine(mob/user) . = ..() . += span_notice("Alt-click to toggle modes.") @@ -240,14 +232,6 @@ w_class = WEIGHT_CLASS_BULKY slot_flags = ITEM_SLOT_BACK -/datum/armor/barricade_security - melee = 10 - bullet = 50 - laser = 50 - energy = 50 - bomb = 10 - fire = 10 - /obj/item/deployable_turret_folded/Initialize(mapload) . = ..() AddComponent(/datum/component/deployable, 5 SECONDS, /obj/machinery/deployable_turret/hmg, delete_on_use = TRUE) diff --git a/code/game/machinery/doors/door.dm b/code/game/machinery/doors/door.dm index 7f1a0ab079d..62f025f1435 100644 --- a/code/game/machinery/doors/door.dm +++ b/code/game/machinery/doors/door.dm @@ -472,15 +472,6 @@ /obj/machinery/door/morgue icon = 'icons/obj/doors/doormorgue.dmi' -/datum/armor/machinery_door - melee = 30 - bullet = 30 - laser = 20 - energy = 20 - bomb = 10 - fire = 80 - acid = 70 - /obj/machinery/door/get_dumping_location() return null diff --git a/code/game/machinery/doors/firedoor.dm b/code/game/machinery/doors/firedoor.dm index d511123f8c1..6b1f6fdea95 100644 --- a/code/game/machinery/doors/firedoor.dm +++ b/code/game/machinery/doors/firedoor.dm @@ -685,15 +685,6 @@ density = TRUE alarm_type = FIRELOCK_ALARM_TYPE_GENERIC -/datum/armor/door_firedoor - melee = 10 - bullet = 30 - laser = 20 - energy = 20 - bomb = 30 - fire = 95 - acid = 70 - /obj/machinery/door/firedoor/border_only/Initialize(mapload) . = ..() adjust_lights_starting_offset() @@ -766,15 +757,6 @@ var/constructionStep = CONSTRUCTION_NO_CIRCUIT var/reinforced = 0 -/datum/armor/door_firedoor - melee = 10 - bullet = 30 - laser = 20 - energy = 20 - bomb = 30 - fire = 95 - acid = 70 - /obj/structure/firelock_frame/examine(mob/user) . = ..() switch(constructionStep) diff --git a/code/game/machinery/doors/poddoor.dm b/code/game/machinery/doors/poddoor.dm index 217891471df..947def3087e 100644 --- a/code/game/machinery/doors/poddoor.dm +++ b/code/game/machinery/doors/poddoor.dm @@ -176,15 +176,6 @@ var/checkdir = 4 //door won't open if turf in this dir is `turftype` var/turftype = /turf/open/space -/datum/armor/door_poddoor - melee = 50 - bullet = 100 - laser = 100 - energy = 100 - bomb = 50 - fire = 100 - acid = 70 - /obj/machinery/door/poddoor/shuttledock/proc/check() var/turf/turf = get_step(src, checkdir) if(!istype(turf, turftype)) diff --git a/code/game/machinery/firealarm.dm b/code/game/machinery/firealarm.dm index 86115ed501f..cef95421321 100644 --- a/code/game/machinery/firealarm.dm +++ b/code/game/machinery/firealarm.dm @@ -441,10 +441,6 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/machinery/firealarm, 26) desc = "Cuban Pete is in the house!" var/static/party_overlay -/datum/armor/machinery_firealarm - fire = 90 - acid = 30 - /obj/machinery/firealarm/partyalarm/reset() if (machine_stat & (NOPOWER|BROKEN)) return @@ -481,10 +477,6 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/machinery/firealarm, 26) var/obj/machinery/firealarm/attached_alarm -/datum/armor/machinery_firealarm - fire = 90 - acid = 30 - /obj/item/circuit_component/firealarm/populate_ports() alarm_trigger = add_input_port("Set", PORT_TYPE_SIGNAL) reset_trigger = add_input_port("Reset", PORT_TYPE_SIGNAL) diff --git a/code/game/machinery/hologram.dm b/code/game/machinery/hologram.dm index c043b9c29ce..4b499ec6fce 100644 --- a/code/game/machinery/hologram.dm +++ b/code/game/machinery/hologram.dm @@ -105,13 +105,6 @@ Possible to do for anyone motivated enough: desc = "It's a floor-mounted device for projecting holographic images. This one will refuse to auto-connect incoming calls." secure = TRUE -/datum/armor/machinery_holopad - melee = 50 - bullet = 20 - laser = 20 - energy = 20 - fire = 50 - /obj/machinery/holopad/secure/Initialize(mapload) . = ..() var/obj/item/circuitboard/machine/holopad/board = circuit @@ -126,13 +119,6 @@ Possible to do for anyone motivated enough: var/datum/proximity_monitor/proximity_monitor var/proximity_range = 1 -/datum/armor/machinery_holopad - melee = 50 - bullet = 20 - laser = 20 - energy = 20 - fire = 50 - /obj/machinery/holopad/tutorial/Initialize(mapload) . = ..() if(proximity_range) @@ -877,13 +863,6 @@ For the other part of the code, check silicon say.dm. Particularly robot talk.*/ var/mob/living/Impersonation var/datum/holocall/HC -/datum/armor/machinery_holopad - melee = 50 - bullet = 20 - laser = 20 - energy = 20 - fire = 50 - /obj/effect/overlay/holo_pad_hologram/Destroy() Impersonation = null if(!QDELETED(HC)) diff --git a/code/game/machinery/igniter.dm b/code/game/machinery/igniter.dm index 34a613e1c87..83f237d2e9d 100644 --- a/code/game/machinery/igniter.dm +++ b/code/game/machinery/igniter.dm @@ -80,15 +80,6 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/machinery/sparker, 26) /obj/machinery/sparker/ordmix id = INCINERATOR_ORDMIX_IGNITER -/datum/armor/machinery_igniter - melee = 50 - bullet = 30 - laser = 70 - energy = 50 - bomb = 20 - fire = 100 - acid = 70 - /obj/machinery/sparker/Initialize(mapload) . = ..() spark_system = new /datum/effect_system/spark_spread diff --git a/code/game/machinery/porta_turret/portable_turret.dm b/code/game/machinery/porta_turret/portable_turret.dm index 82426663dac..12980a91f3c 100644 --- a/code/game/machinery/porta_turret/portable_turret.dm +++ b/code/game/machinery/porta_turret/portable_turret.dm @@ -656,15 +656,6 @@ DEFINE_BITFIELD(turret_flags, list( button_icon = 'icons/mob/actions/actions_mecha.dmi' button_icon_state = "mech_cycle_equip_off" -/datum/armor/machinery_porta_turret - melee = 50 - bullet = 30 - laser = 30 - energy = 30 - bomb = 30 - fire = 90 - acid = 90 - /datum/action/turret_toggle/Trigger(trigger_flags) var/obj/machinery/porta_turret/P = target if(!istype(P)) @@ -676,15 +667,6 @@ DEFINE_BITFIELD(turret_flags, list( button_icon = 'icons/mob/actions/actions_mecha.dmi' button_icon_state = "mech_eject" -/datum/armor/machinery_porta_turret - melee = 50 - bullet = 30 - laser = 30 - energy = 30 - bomb = 30 - fire = 90 - acid = 90 - /datum/action/turret_quit/Trigger(trigger_flags) var/obj/machinery/porta_turret/P = target if(!istype(P)) @@ -751,15 +733,6 @@ DEFINE_BITFIELD(turret_flags, list( faction = list(ROLE_SYNDICATE) desc = "A ballistic machine gun auto-turret." -/datum/armor/machinery_porta_turret - melee = 50 - bullet = 30 - laser = 30 - energy = 30 - bomb = 30 - fire = 90 - acid = 90 - /obj/machinery/porta_turret/syndicate/Initialize(mapload) . = ..() AddElement(/datum/element/empprotection, EMP_PROTECT_SELF | EMP_PROTECT_WIRES) @@ -830,15 +803,6 @@ DEFINE_BITFIELD(turret_flags, list( faction = list("silicon") turret_flags = TURRET_FLAG_SHOOT_CRIMINALS | TURRET_FLAG_SHOOT_ANOMALOUS | TURRET_FLAG_SHOOT_HEADS -/datum/armor/syndicate_shuttle - melee = 50 - bullet = 30 - laser = 30 - energy = 30 - bomb = 80 - fire = 90 - acid = 90 - /obj/machinery/porta_turret/ai/assess_perp(mob/living/carbon/human/perp) return 10 //AI turrets shoot at everything not in their faction @@ -851,15 +815,6 @@ DEFINE_BITFIELD(turret_flags, list( mode = TURRET_LETHAL //It would be useless in stun mode anyway faction = list(FACTION_NEUTRAL,"silicon","turret") //Minebots, medibots, etc that should not be shot. -/datum/armor/syndicate_shuttle - melee = 50 - bullet = 30 - laser = 30 - energy = 30 - bomb = 80 - fire = 90 - acid = 90 - /obj/machinery/porta_turret/aux_base/assess_perp(mob/living/carbon/human/perp) return 0 //Never shoot humanoids. You are on your own if Ashwalkers or the like attack! @@ -890,15 +845,6 @@ DEFINE_BITFIELD(turret_flags, list( faction = list(FACTION_NEUTRAL,"silicon","turret") mode = TURRET_LETHAL -/datum/armor/syndicate_shuttle - melee = 50 - bullet = 30 - laser = 30 - energy = 30 - bomb = 80 - fire = 90 - acid = 90 - /obj/machinery/porta_turret/centcom_shuttle/Initialize(mapload) . = ..() AddElement(/datum/element/empprotection, EMP_PROTECT_SELF | EMP_PROTECT_WIRES) @@ -946,15 +892,6 @@ DEFINE_BITFIELD(turret_flags, list( /// List of weakrefs to all turrets var/list/turrets = list() -/datum/armor/syndicate_shuttle - melee = 50 - bullet = 30 - laser = 30 - energy = 30 - bomb = 80 - fire = 90 - acid = 90 - /obj/machinery/turretid/Initialize(mapload, ndir = 0, built = 0) . = ..() if(built) @@ -1114,15 +1051,6 @@ DEFINE_BITFIELD(turret_flags, list( custom_materials = list(/datum/material/iron=MINERAL_MATERIAL_AMOUNT) pixel_shift = 29 -/datum/armor/syndicate_shuttle - melee = 50 - bullet = 30 - laser = 30 - energy = 30 - bomb = 80 - fire = 90 - acid = 90 - /obj/item/gun/proc/get_turret_properties() . = list() .["lethal_projectile"] = null @@ -1183,15 +1111,6 @@ DEFINE_BITFIELD(turret_flags, list( turret_flags = TURRET_FLAG_AUTH_WEAPONS var/team_color -/datum/armor/syndicate_shuttle - melee = 50 - bullet = 30 - laser = 30 - energy = 30 - bomb = 80 - fire = 90 - acid = 90 - /obj/machinery/porta_turret/lasertag/assess_perp(mob/living/carbon/human/perp) . = 0 if(team_color == "blue") //Lasertag turrets target the opposing team, how great is that? -Sieve @@ -1235,15 +1154,6 @@ DEFINE_BITFIELD(turret_flags, list( installation = /obj/item/gun/energy/laser/bluetag team_color = "blue" -/datum/armor/syndicate_shuttle - melee = 50 - bullet = 30 - laser = 30 - energy = 30 - bomb = 80 - fire = 90 - acid = 90 - /obj/machinery/porta_turret/lasertag/bullet_act(obj/projectile/P) . = ..() if(on) diff --git a/code/game/machinery/roulette_machine.dm b/code/game/machinery/roulette_machine.dm index 4bd8a9b1b66..d6c5b6f32a6 100644 --- a/code/game/machinery/roulette_machine.dm +++ b/code/game/machinery/roulette_machine.dm @@ -443,15 +443,6 @@ icon_state = "floor_beacon" var/used -/datum/armor/machinery_roulette - melee = 45 - bullet = 30 - laser = 30 - energy = 30 - bomb = 10 - fire = 30 - acid = 30 - /obj/item/roulette_wheel_beacon/attack_self() if(used) return diff --git a/code/game/machinery/spaceheater.dm b/code/game/machinery/spaceheater.dm index c27351f7765..7587ba9efc4 100644 --- a/code/game/machinery/spaceheater.dm +++ b/code/game/machinery/spaceheater.dm @@ -281,10 +281,6 @@ /obj/machinery/space_heater/constructed cell = null -/datum/armor/machinery_space_heater - fire = 80 - acid = 10 - /obj/machinery/space_heater/constructed/Initialize(mapload) . = ..() set_panel_open(TRUE) @@ -313,10 +309,6 @@ var/chem_heating_power = 1 display_panel = FALSE -/datum/armor/machinery_space_heater - fire = 80 - acid = 10 - /obj/machinery/space_heater/improvised_chem_heater/Destroy() . = ..() QDEL_NULL(beaker) diff --git a/code/game/machinery/telecomms/machines/message_server.dm b/code/game/machinery/telecomms/machines/message_server.dm index a5fc968fe19..b27d18802ab 100644 --- a/code/game/machinery/telecomms/machines/message_server.dm +++ b/code/game/machinery/telecomms/machines/message_server.dm @@ -89,13 +89,6 @@ var/decryptkey = "password" var/calibrating = 15 MINUTES //Init reads this and adds world.time, then becomes 0 when that time has passed and the machine works -/datum/armor/machinery_blackbox_recorder - melee = 25 - bullet = 10 - laser = 10 - fire = 50 - acid = 70 - /obj/machinery/telecomms/message_server/Initialize(mapload) . = ..() if (!decryptkey) @@ -167,13 +160,6 @@ server_type = /obj/machinery/telecomms/message_server var/datum/logged -/datum/armor/machinery_blackbox_recorder - melee = 25 - bullet = 10 - laser = 10 - fire = 50 - acid = 70 - /datum/signal/subspace/messaging/New(init_source, init_data) source = init_source data = init_data @@ -224,13 +210,6 @@ var/datum/picture/picture // attached photo var/automated = 0 //automated message -/datum/armor/machinery_blackbox_recorder - melee = 25 - bullet = 10 - laser = 10 - fire = 50 - acid = 70 - /datum/data_tablet_msg/New(param_rec, param_sender, param_message, param_photo) if(param_rec) recipient = param_rec @@ -260,13 +239,6 @@ var/id_auth = "Unauthenticated" var/priority = "Normal" -/datum/armor/machinery_blackbox_recorder - melee = 25 - bullet = 10 - laser = 10 - fire = 50 - acid = 70 - /datum/data_rc_msg/New(param_rec, param_sender, param_message, param_stamp, param_id_auth, param_priority) if(param_rec) rec_dpt = param_rec diff --git a/code/game/objects/items/RCD.dm b/code/game/objects/items/RCD.dm index 7bb81b30c99..e8352cf4e96 100644 --- a/code/game/objects/items/RCD.dm +++ b/code/game/objects/items/RCD.dm @@ -442,10 +442,6 @@ GLOBAL_VAR_INIT(icon_holographic_window, init_holographic_window()) // `initial` does not work here. Neither does instantiating a wall/whatever // and referencing that. I don't know why. -/datum/armor/item_construction - fire = 100 - acid = 50 - /proc/init_holographic_wall() return getHologramIcon( icon('icons/turf/walls/wall.dmi', "wall-0"), @@ -519,10 +515,6 @@ GLOBAL_VAR_INIT(icon_holographic_window, init_holographic_window()) name = "hologram" mouse_opacity = MOUSE_OPACITY_TRANSPARENT -/datum/armor/item_construction - fire = 100 - acid = 50 - /obj/effect/rcd_hologram/Initialize(mapload) . = ..() QDEL_IN(src, RCD_HOLOGRAM_FADE_TIME) @@ -786,10 +778,6 @@ GLOBAL_VAR_INIT(icon_holographic_window, init_holographic_window()) var/energyfactor = 72 -/datum/armor/item_construction - fire = 100 - acid = 50 - /obj/item/construction/rcd/borg/useResource(amount, mob/user) if(!iscyborg(user)) return 0 @@ -887,10 +875,6 @@ GLOBAL_VAR_INIT(icon_holographic_window, init_holographic_window()) inhand_icon_state = "oldrcd" has_ammobar = FALSE -/datum/armor/item_construction - fire = 100 - acid = 50 - /obj/item/construction/rcd/arcd/afterattack(atom/A, mob/user) . = ..() if(range_check(A,user)) @@ -951,10 +935,6 @@ GLOBAL_VAR_INIT(icon_holographic_window, init_holographic_window()) var/list/display_options = list() var/color_choice = null -/datum/armor/item_construction - fire = 100 - acid = 50 - /obj/item/construction/rld/Initialize(mapload) . = ..() for(var/option in original_options) @@ -1153,10 +1133,6 @@ GLOBAL_VAR_INIT(icon_holographic_window, init_holographic_window()) "Fifth Layer" = 5, ) -/datum/armor/item_construction - fire = 100 - acid = 50 - /obj/item/construction/plumbing/Initialize(mapload) . = ..() @@ -1410,10 +1386,6 @@ GLOBAL_VAR_INIT(icon_holographic_window, init_holographic_window()) righthand_file = 'icons/mob/inhands/equipment/tools_righthand.dmi' has_ammobar = TRUE -/datum/armor/item_construction - fire = 100 - acid = 50 - /obj/item/construction/plumbing/research/set_plumbing_designs() plumbing_design_types = list( //category 1 synthesizers @@ -1440,10 +1412,6 @@ GLOBAL_VAR_INIT(icon_holographic_window, init_holographic_window()) icon_state = "plumberer_service" has_ammobar = TRUE -/datum/armor/item_construction - fire = 100 - acid = 50 - /obj/item/construction/plumbing/service/set_plumbing_designs() plumbing_design_types = list( //category 1 synthesizers diff --git a/code/game/objects/items/cards_ids.dm b/code/game/objects/items/cards_ids.dm index 2ca038bceba..7e49b7d8015 100644 --- a/code/game/objects/items/cards_ids.dm +++ b/code/game/objects/items/cards_ids.dm @@ -844,10 +844,6 @@ desc = "An ID card that allows access to bots maintenance protocols." trim = /datum/id_trim/away/old/robo -/datum/armor/card_id - fire = 100 - acid = 100 - /obj/item/card/id/away/deep_storage //deepstorage.dmm space ruin name = "bunker access ID" @@ -859,10 +855,6 @@ var/department_name = ACCOUNT_CIV_NAME registered_age = null -/datum/armor/card_id - fire = 100 - acid = 100 - /obj/item/card/id/departmental_budget/Initialize(mapload) . = ..() var/datum/bank_account/B = SSeconomy.get_dep_account(department_ID) @@ -886,10 +878,6 @@ department_name = ACCOUNT_CAR_NAME icon_state = "car_budget" //saving up for a new tesla -/datum/armor/card_id - fire = 100 - acid = 100 - /obj/item/card/id/departmental_budget/AltClick(mob/living/user) registered_account.bank_card_talk(span_warning("Withdrawing is not compatible with this card design."), TRUE) //prevents the vault bank machine being useless and putting money from the budget to your card to go over personal crates @@ -919,10 +907,6 @@ /// If this is set, will manually override the trim shown for SecHUDs. Intended for admins to VV edit and chameleon ID cards. var/sechud_icon_state_override = null -/datum/armor/card_id - fire = 100 - acid = 100 - /obj/item/card/id/advanced/Initialize(mapload) . = ..() RegisterSignal(src, COMSIG_ITEM_EQUIPPED, PROC_REF(update_intern_status)) @@ -1085,10 +1069,6 @@ assigned_icon_state = "assigned_gold" wildcard_slots = WILDCARD_LIMIT_GOLD -/datum/armor/card_id - fire = 100 - acid = 100 - /obj/item/card/id/advanced/gold/Initialize(mapload) . = ..() ADD_TRAIT(src, TRAIT_TASTEFULLY_THICK_ID_CARD, ROUNDSTART_TRAIT) @@ -1100,10 +1080,6 @@ trim = /datum/id_trim/job/captain registered_age = null -/datum/armor/card_id - fire = 100 - acid = 100 - /obj/item/card/id/advanced/gold/captains_spare/update_label() //so it doesn't change to Captain's ID card (Captain) on a sneeze if(registered_name == "Captain") name = "[initial(name)][(!assignment || assignment == "Captain") ? "" : " ([assignment])"]" @@ -1197,10 +1173,6 @@ registered_name = "Captain" registered_age = null -/datum/armor/card_id - fire = 100 - acid = 100 - /obj/item/card/id/advanced/black/syndicate_command/captain_id/syndie_spare/update_label() if(registered_name == "Captain") name = "[initial(name)][(!assignment || assignment == "Captain") ? "" : " ([assignment])"]" @@ -1217,10 +1189,6 @@ trim = /datum/id_trim/admin wildcard_slots = WILDCARD_LIMIT_ADMIN -/datum/armor/card_id - fire = 100 - acid = 100 - /obj/item/card/id/advanced/debug/Initialize(mapload) . = ..() registered_account = SSeconomy.get_dep_account(ACCOUNT_CAR) @@ -1249,10 +1217,6 @@ /// Time left on a card till they can leave. var/time_left = 0 -/datum/armor/card_id - fire = 100 - acid = 100 - /obj/item/card/id/advanced/prisoner/attackby(obj/item/card/id/C, mob/user) ..() var/list/id_access = C.GetAccess() @@ -1362,10 +1326,6 @@ /// Weak ref to the ID card we're currently attempting to steal access from. var/datum/weakref/theft_target -/datum/armor/card_id - fire = 100 - acid = 100 - /obj/item/card/id/advanced/chameleon/Initialize(mapload) . = ..() diff --git a/code/game/objects/items/defib.dm b/code/game/objects/items/defib.dm index 60235435cdd..14bf5b32df8 100644 --- a/code/game/objects/items/defib.dm +++ b/code/game/objects/items/defib.dm @@ -294,10 +294,6 @@ nocell_state = "defibcompact-nocell" emagged_state = "defibcompact-emagged" -/datum/armor/item_defibrillator - fire = 50 - acid = 50 - /obj/item/defibrillator/compact/item_action_slot_check(slot, mob/user) if(slot & user.getBeltSlot()) return TRUE @@ -324,10 +320,6 @@ /obj/item/defibrillator/compact/combat/loaded cell_removable = FALSE // Don't let people just have an infinite power cell -/datum/armor/item_defibrillator - fire = 50 - acid = 50 - /obj/item/defibrillator/compact/combat/loaded/Initialize(mapload) . = ..() cell = new /obj/item/stock_parts/cell/infinite(src) @@ -372,10 +364,6 @@ var/recharge_time = 6 SECONDS // Only applies to defibs that do not require a defibrilator. See: do_success() var/combat = FALSE //If it penetrates armor and gives additional functionality -/datum/armor/item_defibrillator - fire = 50 - acid = 50 - /obj/item/shockpaddles/Initialize(mapload) . = ..() AddElement(/datum/element/update_icon_updates_onmob, ITEM_SLOT_HANDS|ITEM_SLOT_BACK) @@ -706,10 +694,6 @@ inhand_icon_state = "defibpaddles0" req_defib = FALSE -/datum/armor/item_defibrillator - fire = 50 - acid = 50 - /obj/item/shockpaddles/cyborg/attack(mob/M, mob/user) if(iscyborg(user)) var/mob/living/silicon/robot/R = user diff --git a/code/game/objects/items/dualsaber.dm b/code/game/objects/items/dualsaber.dm index d8488d8d79d..3145cf4a43b 100644 --- a/code/game/objects/items/dualsaber.dm +++ b/code/game/objects/items/dualsaber.dm @@ -197,10 +197,6 @@ /obj/item/dualsaber/purple possible_colors = list("purple") -/datum/armor/item_dualsaber - fire = 100 - acid = 70 - /obj/item/dualsaber/attackby(obj/item/W, mob/user, params) if(W.tool_behaviour == TOOL_MULTITOOL) if(!hacked) diff --git a/code/game/objects/items/fireaxe.dm b/code/game/objects/items/fireaxe.dm index ca0b7303548..196834642bc 100644 --- a/code/game/objects/items/fireaxe.dm +++ b/code/game/objects/items/fireaxe.dm @@ -75,10 +75,6 @@ /* * Metal Hydrogen Axe */ -/datum/armor/item_fireaxe - fire = 100 - acid = 30 - /obj/item/fireaxe/metal_h2_axe icon_state = "metalh2_axe0" base_icon_state = "metalh2_axe" diff --git a/code/game/objects/items/handcuffs.dm b/code/game/objects/items/handcuffs.dm index 45aeb93018f..cde81033443 100644 --- a/code/game/objects/items/handcuffs.dm +++ b/code/game/objects/items/handcuffs.dm @@ -152,10 +152,6 @@ breakouttime = 30 SECONDS cuffsound = 'sound/weapons/cablecuff.ogg' -/datum/armor/restraints_handcuffs - fire = 50 - acid = 50 - /obj/item/restraints/handcuffs/cable/Initialize(mapload, new_color) . = ..() @@ -274,10 +270,6 @@ cable_color = CABLE_COLOR_WHITE inhand_icon_state = "coil_white" -/datum/armor/restraints_handcuffs - fire = 50 - acid = 50 - /obj/item/restraints/handcuffs/cable/attackby(obj/item/I, mob/user, params) //Slapcrafting if(istype(I, /obj/item/stack/rods)) var/obj/item/stack/rods/R = I @@ -335,10 +327,6 @@ desc = "A pair of broken zipties." icon_state = "cuff_used" -/datum/armor/restraints_handcuffs - fire = 50 - acid = 50 - /obj/item/restraints/handcuffs/cable/zipties/used/attack() return @@ -395,10 +383,6 @@ /obj/item/restraints/legcuffs/beartrap/prearmed armed = TRUE -/datum/armor/restraints_handcuffs - fire = 50 - acid = 50 - /obj/item/restraints/legcuffs/beartrap/Initialize(mapload) . = ..() update_appearance() @@ -488,10 +472,6 @@ item_flags = DROPDEL flags_1 = NONE -/datum/armor/restraints_handcuffs - fire = 50 - acid = 50 - /obj/item/restraints/legcuffs/beartrap/energy/Initialize(mapload) . = ..() addtimer(CALLBACK(src, PROC_REF(dissipate)), 100) @@ -527,10 +507,6 @@ ///Amount of time to knock the target down for once it's hit in deciseconds. var/knockdown = 0 -/datum/armor/restraints_handcuffs - fire = 50 - acid = 50 - /obj/item/restraints/legcuffs/bola/throw_at(atom/target, range, speed, mob/thrower, spin=1, diagonals_first = 0, datum/callback/callback, gentle = FALSE, quickstart = TRUE) if(!..()) return @@ -583,10 +559,6 @@ breakouttime = 6 SECONDS custom_price = PAYCHECK_COMMAND * 0.35 -/datum/armor/restraints_handcuffs - fire = 50 - acid = 50 - /obj/item/restraints/legcuffs/bola/energy/Initialize(mapload) . = ..() ADD_TRAIT(src, TRAIT_UNCATCHABLE, TRAIT_GENERIC) // People said energy bolas being uncatchable is a feature. @@ -611,10 +583,6 @@ slowdown = 0 var/datum/status_effect/gonbola_pacify/effectReference -/datum/armor/restraints_handcuffs - fire = 50 - acid = 50 - /obj/item/restraints/legcuffs/bola/gonbola/throw_impact(atom/hit_atom, datum/thrownthing/throwingdatum) . = ..() if(iscarbon(hit_atom)) diff --git a/code/game/objects/items/kitchen.dm b/code/game/objects/items/kitchen.dm index cedc9ab4e73..139777dd757 100644 --- a/code/game/objects/items/kitchen.dm +++ b/code/game/objects/items/kitchen.dm @@ -75,10 +75,6 @@ custom_materials = list(/datum/material/plastic=80) custom_price = PAYCHECK_LOWER * 2 -/datum/armor/kitchen_fork - fire = 50 - acid = 30 - /obj/item/kitchen/fork/plastic/Initialize(mapload) . = ..() AddElement(/datum/element/easily_fragmented, PLASTIC_BREAK_PROBABILITY) @@ -102,10 +98,6 @@ sharpness = SHARP_EDGED custom_price = PAYCHECK_LOWER * 2 -/datum/armor/kitchen_fork - fire = 50 - acid = 30 - /obj/item/knife/plastic/Initialize(mapload) . = ..() AddElement(/datum/element/easily_fragmented, PLASTIC_BREAK_PROBABILITY) @@ -139,10 +131,6 @@ custom_price = PAYCHECK_CREW * 2 bare_wound_bonus = 14 -/datum/armor/kitchen_fork - fire = 50 - acid = 30 - /obj/item/kitchen/rollingpin/suicide_act(mob/living/carbon/user) user.visible_message(span_suicide("[user] begins flattening [user.p_their()] head with \the [src]! It looks like [user.p_theyre()] trying to commit suicide!")) return BRUTELOSS diff --git a/code/game/objects/items/melee/baton.dm b/code/game/objects/items/melee/baton.dm index 1063fd76323..ace8f16e823 100644 --- a/code/game/objects/items/melee/baton.dm +++ b/code/game/objects/items/melee/baton.dm @@ -654,11 +654,6 @@ convertible = FALSE var/obj/item/assembly/igniter/sparkler -/datum/armor/baton_security - bomb = 50 - fire = 80 - acid = 80 - /obj/item/melee/baton/security/cattleprod/Initialize(mapload) . = ..() sparkler = new (src) @@ -701,11 +696,6 @@ convertible = FALSE custom_materials = list(/datum/material/iron = 10000, /datum/material/glass = 4000, /datum/material/silver = 10000, /datum/material/gold = 2000) -/datum/armor/baton_security - bomb = 50 - fire = 80 - acid = 80 - /obj/item/melee/baton/security/boomerang/Initialize(mapload) . = ..() AddComponent(/datum/component/boomerang, throw_range+2, TRUE) @@ -729,11 +719,6 @@ inhand_icon_state = "teleprod" slot_flags = null -/datum/armor/baton_security - bomb = 50 - fire = 80 - acid = 80 - /obj/item/melee/baton/security/cattleprod/teleprod/clumsy_check(mob/living/carbon/human/user) . = ..() if(!.) diff --git a/code/game/objects/items/melee/energy.dm b/code/game/objects/items/melee/energy.dm index 928adb32587..a08ed38ab28 100644 --- a/code/game/objects/items/melee/energy.dm +++ b/code/game/objects/items/melee/energy.dm @@ -160,10 +160,6 @@ active_throwforce = 30 active_w_class = WEIGHT_CLASS_HUGE -/datum/armor/melee_energy - fire = 100 - acid = 30 - /obj/item/melee/energy/axe/make_transformable() AddComponent(/datum/component/transforming, \ force_on = active_force, \ @@ -194,10 +190,6 @@ block_chance = 50 embedding = list("embed_chance" = 75, "impact_pain_mult" = 10) -/datum/armor/melee_energy - fire = 100 - acid = 30 - /obj/item/melee/energy/sword/hit_reaction(mob/living/carbon/human/owner, atom/movable/hitby, attack_text = "the attack", final_block_chance = 0, damage = 0, attack_type = MELEE_ATTACK) if(blade_active) return ..() @@ -209,10 +201,6 @@ /// The cell cost of hitting something. var/hitcost = 50 -/datum/armor/melee_energy - fire = 100 - acid = 30 - /obj/item/melee/energy/sword/cyborg/attack(mob/target, mob/living/silicon/robot/user) if(!user.cell) return @@ -262,10 +250,6 @@ var/hacked = FALSE var/hacked_color -/datum/armor/melee_energy - fire = 100 - acid = 30 - /obj/item/melee/energy/sword/saber/Initialize(mapload) . = ..() if(!sword_color_icon && LAZYLEN(possible_sword_colors)) @@ -301,10 +285,6 @@ /obj/item/melee/energy/sword/saber/purple sword_color_icon = "purple" -/datum/armor/melee_energy - fire = 100 - acid = 30 - /obj/item/melee/energy/sword/saber/multitool_act(mob/living/user, obj/item/tool) if(hacked) to_chat(user, span_warning("It's already fabulous!")) @@ -348,10 +328,6 @@ var/datum/effect_system/spark_spread/spark_system //Most of the other special functions are handled in their own files. aka special snowflake code so kewl -/datum/armor/melee_energy - fire = 100 - acid = 30 - /obj/item/melee/energy/blade/Initialize(mapload) . = ..() spark_system = new /datum/effect_system/spark_spread() diff --git a/code/game/objects/items/pneumaticCannon.dm b/code/game/objects/items/pneumaticCannon.dm index 187162f480c..43c1cb6d355 100644 --- a/code/game/objects/items/pneumaticCannon.dm +++ b/code/game/objects/items/pneumaticCannon.dm @@ -312,10 +312,6 @@ clumsyCheck = FALSE var/static/list/pie_typecache = typecacheof(/obj/item/food/pie) -/datum/armor/item_pneumatic_cannon - fire = 60 - acid = 50 - /obj/item/pneumatic_cannon/pie/Initialize(mapload) . = ..() allowed_typecache = pie_typecache diff --git a/code/game/objects/items/puzzle_pieces.dm b/code/game/objects/items/puzzle_pieces.dm index c3e06b64d94..b176d2b6823 100644 --- a/code/game/objects/items/puzzle_pieces.dm +++ b/code/game/objects/items/puzzle_pieces.dm @@ -88,16 +88,6 @@ /obj/machinery/door/puzzle/keycard desc = "This door only opens when a keycard is swiped. It looks virtually indestructible." -/datum/armor/door_puzzle - melee = 100 - bullet = 100 - laser = 100 - energy = 100 - bomb = 100 - bio = 100 - fire = 100 - acid = 100 - /obj/machinery/door/puzzle/keycard/attackby(obj/item/attacking_item, mob/user, params) . = ..() if(!istype(attacking_item, /obj/item/keycard)) @@ -120,16 +110,6 @@ /obj/machinery/door/puzzle/light desc = "This door only opens when a linked mechanism is powered. It looks virtually indestructible." -/datum/armor/door_puzzle - melee = 100 - bullet = 100 - laser = 100 - energy = 100 - bomb = 100 - bio = 100 - fire = 100 - acid = 100 - /obj/machinery/door/puzzle/light/Initialize(mapload) . = ..() RegisterSignal(SSdcs, COMSIG_GLOB_LIGHT_MECHANISM_COMPLETED, PROC_REF(check_mechanism)) @@ -171,16 +151,6 @@ var/reward = /obj/item/food/cookie var/claimed = FALSE -/datum/armor/door_puzzle - melee = 100 - bullet = 100 - laser = 100 - energy = 100 - bomb = 100 - bio = 100 - fire = 100 - acid = 100 - /obj/item/pressure_plate/hologrid/Initialize(mapload) . = ..() if(undertile_pressureplate) diff --git a/code/game/objects/items/shields.dm b/code/game/objects/items/shields.dm index 0d4020961d6..cf487dfcd3c 100644 --- a/code/game/objects/items/shields.dm +++ b/code/game/objects/items/shields.dm @@ -110,14 +110,6 @@ shield_break_sound = 'sound/effects/glassbr3.ogg' shield_break_leftover = /obj/item/shard -/datum/armor/item_shield - melee = 50 - bullet = 50 - laser = 50 - bomb = 30 - fire = 80 - acid = 70 - /obj/item/shield/riot/attackby(obj/item/attackby_item, mob/user, params) if(istype(attackby_item, /obj/item/melee/baton)) if(!COOLDOWN_FINISHED(src, baton_bash)) @@ -144,14 +136,6 @@ inhand_icon_state = "flashshield" var/obj/item/assembly/flash/handheld/embedded_flash = /obj/item/assembly/flash/handheld -/datum/armor/item_shield - melee = 50 - bullet = 50 - laser = 50 - bomb = 30 - fire = 80 - acid = 70 - /obj/item/shield/riot/flash/Initialize(mapload) . = ..() AddElement(/datum/element/update_icon_updates_onmob) @@ -269,14 +253,6 @@ /// Whether clumsy people can transform this without side effects. var/can_clumsy_use = FALSE -/datum/armor/item_shield - melee = 50 - bullet = 50 - laser = 50 - bomb = 30 - fire = 80 - acid = 70 - /obj/item/shield/energy/Initialize(mapload) . = ..() AddComponent(/datum/component/transforming, \ @@ -321,14 +297,6 @@ /// Whether the shield is extended and protecting the user.. var/extended = FALSE -/datum/armor/item_shield - melee = 50 - bullet = 50 - laser = 50 - bomb = 30 - fire = 80 - acid = 70 - /obj/item/shield/riot/tele/Initialize(mapload) . = ..() AddComponent(/datum/component/transforming, \ diff --git a/code/game/objects/items/singularityhammer.dm b/code/game/objects/items/singularityhammer.dm index 6b3e3bba249..6d03ad595d6 100644 --- a/code/game/objects/items/singularityhammer.dm +++ b/code/game/objects/items/singularityhammer.dm @@ -90,14 +90,6 @@ throw_range = 7 w_class = WEIGHT_CLASS_HUGE -/datum/armor/item_singularityhammer - melee = 50 - bullet = 50 - laser = 50 - bomb = 50 - fire = 100 - acid = 100 - /obj/item/mjollnir/Initialize(mapload) . = ..() AddComponent(/datum/component/two_handed, \ diff --git a/code/game/objects/items/spear.dm b/code/game/objects/items/spear.dm index f199f70839c..07d5b926827 100644 --- a/code/game/objects/items/spear.dm +++ b/code/game/objects/items/spear.dm @@ -107,10 +107,6 @@ icon_prefix = "spearbomb" var/obj/item/grenade/explosive = null -/datum/armor/item_spear - fire = 50 - acid = 30 - /obj/item/spear/explosive/Initialize(mapload) . = ..() set_explosive(new /obj/item/grenade/iedcasing/spawned()) //For admin-spawned explosive lances @@ -189,10 +185,6 @@ force_unwielded = 15 force_wielded = 25 -/datum/armor/item_spear - fire = 50 - acid = 30 - /obj/item/spear/grey_tide/afterattack(atom/movable/AM, mob/living/user, proximity) . = ..() if(!proximity) diff --git a/code/game/objects/items/stacks/sheets/glass.dm b/code/game/objects/items/stacks/sheets/glass.dm index 61e08a54313..ace9849e80d 100644 --- a/code/game/objects/items/stacks/sheets/glass.dm +++ b/code/game/objects/items/stacks/sheets/glass.dm @@ -44,10 +44,6 @@ GLOBAL_LIST_INIT(glass_recipes, list ( \ /obj/item/stack/sheet/glass/fifty amount = 50 -/datum/armor/sheet_glass - fire = 50 - acid = 100 - /obj/item/stack/sheet/glass/get_main_recipes() . = ..() . += GLOB.glass_recipes @@ -181,10 +177,6 @@ GLOBAL_LIST_INIT(reinforced_glass_recipes, list ( \ /// The amount of energy this draws from the glass source per stack unit. var/glacost = 500 -/datum/armor/sheet_rglass - fire = 70 - acid = 100 - /obj/item/stack/sheet/rglass/cyborg/get_amount() return min(round(source.energy / cost), round(glasource.energy / glacost)) diff --git a/code/game/objects/items/stacks/sheets/sheet_types.dm b/code/game/objects/items/stacks/sheets/sheet_types.dm index b9d32c7e334..0448841fdba 100644 --- a/code/game/objects/items/stacks/sheets/sheet_types.dm +++ b/code/game/objects/items/stacks/sheets/sheet_types.dm @@ -457,9 +457,6 @@ GLOBAL_LIST_INIT(cloth_recipes, list ( \ pickup_sound = 'sound/items/handling/cloth_pickup.ogg' grind_results = list(/datum/reagent/cellulose = 20) -/datum/armor/mineral_bamboo - fire = 50 - /obj/item/stack/sheet/cloth/get_main_recipes() . = ..() . += GLOB.cloth_recipes @@ -490,9 +487,6 @@ GLOBAL_LIST_INIT(durathread_recipes, list ( \ drop_sound = 'sound/items/handling/cloth_drop.ogg' pickup_sound = 'sound/items/handling/cloth_pickup.ogg' -/datum/armor/mineral_bamboo - fire = 50 - /obj/item/stack/sheet/durathread/get_main_recipes() . = ..() . += GLOB.durathread_recipes @@ -591,9 +585,6 @@ GLOBAL_LIST_INIT(cardboard_recipes, list ( \ null, \ )) -/datum/armor/mineral_bamboo - fire = 50 - /obj/item/stack/sheet/cardboard //BubbleWrap //it's cardboard you fuck name = "cardboard" desc = "Large sheets of card, like boxes folded flat." @@ -616,9 +607,6 @@ GLOBAL_LIST_INIT(cardboard_recipes, list ( \ /obj/item/stack/sheet/cardboard/fifty amount = 50 -/datum/armor/mineral_bamboo - fire = 50 - /obj/item/stack/sheet/cardboard/attackby(obj/item/I, mob/user, params) if(istype(I, /obj/item/stamp/clown) && !istype(loc, /obj/item/storage)) var/atom/droploc = drop_location() @@ -680,9 +668,6 @@ GLOBAL_LIST_INIT(bronze_recipes, list ( \ walltype = /turf/closed/wall/mineral/bronze has_unique_girder = TRUE -/datum/armor/mineral_bamboo - fire = 50 - /obj/item/stack/sheet/bronze/get_main_recipes() . = ..() . += GLOB.bronze_recipes @@ -765,9 +750,6 @@ GLOBAL_LIST_INIT(plastic_recipes, list( /obj/item/stack/sheet/plastic/five amount = 5 -/datum/armor/mineral_bamboo - fire = 50 - /obj/item/stack/sheet/plastic/get_main_recipes() . = ..() . += GLOB.plastic_recipes @@ -788,9 +770,6 @@ new /datum/stack_recipe("paper frame door", /obj/structure/mineral_door/paperfra grind_results = list(/datum/reagent/cellulose = 20) material_type = /datum/material/paper -/datum/armor/mineral_bamboo - fire = 50 - /obj/item/stack/sheet/paperframes/get_main_recipes() . = ..() . += GLOB.paperframe_recipes diff --git a/code/game/objects/items/storage/backpack.dm b/code/game/objects/items/storage/backpack.dm index 77c71fcca12..dcbb28f504f 100644 --- a/code/game/objects/items/storage/backpack.dm +++ b/code/game/objects/items/storage/backpack.dm @@ -83,10 +83,6 @@ inhand_icon_state = "giftbag" w_class = WEIGHT_CLASS_BULKY -/datum/armor/backpack_holding - fire = 60 - acid = 50 - /obj/item/storage/backpack/santabag/Initialize(mapload) . = ..() regenerate_presents() @@ -232,10 +228,6 @@ worn_icon = 'icons/mob/clothing/back/ethereal.dmi' icon_state = "saddlepack" -/datum/armor/backpack_holding - fire = 60 - acid = 50 - /obj/item/storage/backpack/saddlepack/Initialize(mapload) . = ..() atom_storage.max_total_storage = 26 @@ -256,10 +248,6 @@ icon_state = "satchel-leather" inhand_icon_state = "satchel" -/datum/armor/backpack_holding - fire = 60 - acid = 50 - /obj/item/storage/backpack/satchel/leather/withwallet/PopulateContents() new /obj/item/storage/wallet/random(src) @@ -334,10 +322,6 @@ inhand_icon_state = "satchel-flat" w_class = WEIGHT_CLASS_NORMAL //Can fit in backpacks itself. -/datum/armor/backpack_holding - fire = 60 - acid = 50 - /obj/item/storage/backpack/satchel/flat/Initialize(mapload) . = ..() AddElement(/datum/element/undertile, TRAIT_T_RAY_VISIBLE, INVISIBILITY_MAXIMUM, use_anchor = TRUE) // SKYRAT EDIT - Ghosts can't see smuggler's satchels @@ -369,10 +353,6 @@ //slowdown = 1 //ORIGINAL slowdown = 0.5 //SKYRAT EDIT CHANGE -/datum/armor/backpack_holding - fire = 60 - acid = 50 - /obj/item/storage/backpack/duffelbag/Initialize(mapload) . = ..() atom_storage.max_total_storage = 30 @@ -387,10 +367,6 @@ slowdown = 2 max_integrity = 100 -/datum/armor/backpack_holding - fire = 60 - acid = 50 - /obj/item/storage/backpack/duffelbag/cursed/Initialize(mapload) . = ..() AddComponent(/datum/component/curse_of_hunger, add_dropdel = TRUE) @@ -449,10 +425,6 @@ -/datum/armor/backpack_holding - fire = 60 - acid = 50 - /obj/item/storage/backpack/duffelbag/med/surgery/PopulateContents() new /obj/item/scalpel(src) new /obj/item/hemostat(src) @@ -477,10 +449,6 @@ name = "surgical duffel bag" desc = "A large duffel bag for holding extra supplies - this one has a material inlay with space for various sharp-looking tools." -/datum/armor/backpack_holding - fire = 60 - acid = 50 - /obj/item/storage/backpack/duffelbag/sec/surgery/PopulateContents() new /obj/item/scalpel(src) new /obj/item/hemostat(src) @@ -508,10 +476,6 @@ inhand_icon_state = "duffel-drone" resistance_flags = FIRE_PROOF -/datum/armor/backpack_holding - fire = 60 - acid = 50 - /obj/item/storage/backpack/duffelbag/drone/PopulateContents() new /obj/item/screwdriver(src) new /obj/item/wrench(src) @@ -527,10 +491,6 @@ icon_state = "duffel-clown" inhand_icon_state = "duffel-clown" -/datum/armor/backpack_holding - fire = 60 - acid = 50 - /obj/item/storage/backpack/duffelbag/clown/cream_pie/PopulateContents() for(var/i in 1 to 10) new /obj/item/food/pie/cream(src) @@ -548,10 +508,6 @@ special_desc_requirement = EXAMINE_CHECK_SYNDICATE // Skyrat edit special_desc = "This duffel bag has the Syndicate logo stiched on the inside. It appears to be made from lighter yet sturdier materials." // Skyrat edit -/datum/armor/backpack_holding - fire = 60 - acid = 50 - /obj/item/storage/backpack/duffelbag/syndie/Initialize(mapload) . = ..() atom_storage.silent = TRUE @@ -561,10 +517,6 @@ icon_state = "duffel-syndieammo" inhand_icon_state = "duffel-syndieammo" -/datum/armor/backpack_holding - fire = 60 - acid = 50 - /obj/item/storage/backpack/duffelbag/syndie/hitman/PopulateContents() new /obj/item/clothing/under/suit/black(src) new /obj/item/clothing/neck/tie/red/hitman(src) @@ -587,10 +539,6 @@ icon_state = "duffel-syndiemed" inhand_icon_state = "duffel-syndiemed" -/datum/armor/backpack_holding - fire = 60 - acid = 50 - /obj/item/storage/backpack/duffelbag/syndie/surgery/PopulateContents() new /obj/item/scalpel(src) new /obj/item/hemostat(src) @@ -615,10 +563,6 @@ /obj/item/storage/backpack/duffelbag/syndie/ammo/shotgun desc = "A large duffel bag, packed to the brim with Bulldog shotgun magazines." -/datum/armor/backpack_holding - fire = 60 - acid = 50 - /obj/item/storage/backpack/duffelbag/syndie/ammo/shotgun/PopulateContents() for(var/i in 1 to 6) new /obj/item/ammo_box/magazine/m12g(src) @@ -629,10 +573,6 @@ /obj/item/storage/backpack/duffelbag/syndie/ammo/smg desc = "A large duffel bag, packed to the brim with C-20r magazines." -/datum/armor/backpack_holding - fire = 60 - acid = 50 - /obj/item/storage/backpack/duffelbag/syndie/ammo/smg/PopulateContents() for(var/i in 1 to 9) new /obj/item/ammo_box/magazine/smgm45(src) @@ -640,10 +580,6 @@ /obj/item/storage/backpack/duffelbag/syndie/ammo/mech desc = "A large duffel bag, packed to the brim with various exosuit ammo." -/datum/armor/backpack_holding - fire = 60 - acid = 50 - /obj/item/storage/backpack/duffelbag/syndie/ammo/mech/PopulateContents() new /obj/item/mecha_ammo/scattershot(src) new /obj/item/mecha_ammo/scattershot(src) @@ -654,10 +590,6 @@ /obj/item/storage/backpack/duffelbag/syndie/ammo/mauler desc = "A large duffel bag, packed to the brim with various exosuit ammo." -/datum/armor/backpack_holding - fire = 60 - acid = 50 - /obj/item/storage/backpack/duffelbag/syndie/ammo/mauler/PopulateContents() new /obj/item/mecha_ammo/lmg(src) new /obj/item/mecha_ammo/lmg(src) @@ -672,10 +604,6 @@ /obj/item/storage/backpack/duffelbag/syndie/c20rbundle desc = "A large duffel bag containing a C-20r, some magazines, and a cheap looking suppressor." -/datum/armor/backpack_holding - fire = 60 - acid = 50 - /obj/item/storage/backpack/duffelbag/syndie/c20rbundle/PopulateContents() new /obj/item/ammo_box/magazine/smgm45(src) new /obj/item/ammo_box/magazine/smgm45(src) @@ -685,10 +613,6 @@ /obj/item/storage/backpack/duffelbag/syndie/bulldogbundle desc = "A large duffel bag containing a Bulldog, some drums, and a pair of thermal imaging glasses." -/datum/armor/backpack_holding - fire = 60 - acid = 50 - /obj/item/storage/backpack/duffelbag/syndie/bulldogbundle/PopulateContents() new /obj/item/gun/ballistic/shotgun/bulldog(src) new /obj/item/ammo_box/magazine/m12g(src) @@ -698,10 +622,6 @@ /obj/item/storage/backpack/duffelbag/syndie/med/medicalbundle desc = "A large duffel bag containing a medical equipment, a Donksoft LMG, a big jumbo box of riot darts, and a magboot MODsuit module." -/datum/armor/backpack_holding - fire = 60 - acid = 50 - /obj/item/storage/backpack/duffelbag/syndie/med/medicalbundle/PopulateContents() new /obj/item/mod/module/magboot(src) new /obj/item/storage/medkit/tactical(src) @@ -711,10 +631,6 @@ /obj/item/storage/backpack/duffelbag/syndie/med/bioterrorbundle desc = "A large duffel bag containing deadly chemicals, a handheld chem sprayer, Bioterror foam grenade, a Donksoft assault rifle, box of riot grade darts, a dart pistol, and a box of syringes." -/datum/armor/backpack_holding - fire = 60 - acid = 50 - /obj/item/storage/backpack/duffelbag/syndie/med/bioterrorbundle/PopulateContents() new /obj/item/reagent_containers/spray/chemsprayer/bioterror(src) new /obj/item/storage/box/syndie_kit/chemical(src) @@ -737,10 +653,6 @@ /obj/item/storage/backpack/duffelbag/syndie/firestarter desc = "A large duffel bag containing a New Russian pyro backpack sprayer, Elite MODsuit, a Stechkin APS pistol, minibomb, ammo, and other equipment." -/datum/armor/backpack_holding - fire = 60 - acid = 50 - /obj/item/storage/backpack/duffelbag/syndie/firestarter/PopulateContents() new /obj/item/clothing/under/syndicate/soviet(src) new /obj/item/mod/control/pre_equipped/elite/flamethrower(src) @@ -782,10 +694,6 @@ icon_state = "duffel-explorer" inhand_icon_state = "duffel-explorer" -/datum/armor/backpack_holding - fire = 60 - acid = 50 - /obj/item/storage/backpack/duffelbag/mining_conscript/PopulateContents() new /obj/item/clothing/glasses/meson(src) new /obj/item/t_scanner/adv_mining_scanner/lesser(src) diff --git a/code/game/objects/items/tanks/watertank.dm b/code/game/objects/items/tanks/watertank.dm index 35881b372e4..782ca62cf1c 100644 --- a/code/game/objects/items/tanks/watertank.dm +++ b/code/game/objects/items/tanks/watertank.dm @@ -133,10 +133,6 @@ var/obj/item/watertank/tank -/datum/armor/item_watertank - fire = 100 - acid = 30 - /obj/item/reagent_containers/spray/mister/Initialize(mapload) . = ..() tank = loc @@ -161,10 +157,6 @@ inhand_icon_state = "waterbackpackjani" custom_price = PAYCHECK_CREW * 5 -/datum/armor/item_watertank - fire = 100 - acid = 30 - /obj/item/watertank/janitor/Initialize(mapload) . = ..() reagents.add_reagent(/datum/reagent/space_cleaner, 500) @@ -181,10 +173,6 @@ possible_transfer_amounts = list(5, 10) current_range = 5 -/datum/armor/item_watertank - fire = 100 - acid = 30 - /obj/item/watertank/janitor/make_noz() return new /obj/item/reagent_containers/spray/mister/janitor(src) @@ -201,10 +189,6 @@ custom_price = PAYCHECK_CREW * 2 volume = 1000 -/datum/armor/item_watertank - fire = 100 - acid = 30 - /obj/item/watertank/pepperspray/Initialize(mapload) . = ..() reagents.add_reagent(/datum/reagent/consumable/condensedcapsaicin, 1000) @@ -221,10 +205,6 @@ possible_transfer_amounts = list(5, 10) current_range = 6 -/datum/armor/item_watertank - fire = 100 - acid = 30 - /obj/item/watertank/pepperspray/make_noz() return new /obj/item/reagent_containers/spray/mister/pepperspray(src) @@ -246,10 +226,6 @@ volume = 200 slowdown = 0 -/datum/armor/item_watertank - fire = 100 - acid = 30 - /obj/item/watertank/atmos/Initialize(mapload) . = ..() reagents.add_reagent(/datum/reagent/water, 200) @@ -286,10 +262,6 @@ var/metal_synthesis_cooldown = 0 COOLDOWN_DECLARE(resin_cooldown) -/datum/armor/item_watertank - fire = 100 - acid = 30 - /obj/item/extinguisher/mini/nozzle/Initialize(mapload) . = ..() tank = loc @@ -397,10 +369,6 @@ pass_flags = PASSTABLE anchored = TRUE -/datum/armor/item_watertank - fire = 100 - acid = 30 - /obj/effect/resin_container/proc/Smoke() var/datum/effect_system/fluid_spread/foam/metal/resin/foaming = new foaming.set_up(4, holder = src, location = loc) @@ -441,10 +409,6 @@ fill_icon_thresholds = list(0, 15, 60) fill_icon_state = "backpack" -/datum/armor/item_watertank - fire = 100 - acid = 30 - /obj/item/reagent_containers/chemtank/ui_action_click() toggle_injection() diff --git a/code/game/objects/items/teleportation.dm b/code/game/objects/items/teleportation.dm index b53fc626f00..220a8688691 100644 --- a/code/game/objects/items/teleportation.dm +++ b/code/game/objects/items/teleportation.dm @@ -343,11 +343,6 @@ //How far the emergency teleport checks for a safe position var/parallel_teleport_distance = 3 -/datum/armor/item_hand_tele - bomb = 30 - fire = 100 - acid = 100 - /obj/item/syndicate_teleporter/Initialize(mapload) . = ..() START_PROCESSING(SSobj, src) @@ -517,11 +512,6 @@ /obj/item/storage/box/syndie_kit/syndicate_teleporter name = "syndicate teleporter kit" -/datum/armor/item_hand_tele - bomb = 30 - fire = 100 - acid = 100 - /obj/item/storage/box/syndie_kit/syndicate_teleporter/PopulateContents() new /obj/item/syndicate_teleporter(src) new /obj/item/paper/syndicate_teleporter(src) diff --git a/code/game/objects/items/tools/crowbar.dm b/code/game/objects/items/tools/crowbar.dm index 94eeff6e96e..f4c730782f9 100644 --- a/code/game/objects/items/tools/crowbar.dm +++ b/code/game/objects/items/tools/crowbar.dm @@ -70,10 +70,6 @@ desc = "It's a bulky crowbar. It almost seems deliberately designed to not be able to fit inside of a backpack." w_class = WEIGHT_CLASS_BULKY -/datum/armor/item_crowbar - fire = 50 - acid = 30 - /obj/item/crowbar/large/heavy //from space ruin name = "heavy crowbar" desc = "It's a big crowbar. It doesn't fit in your pockets, because it's big. It feels oddly heavy.." @@ -87,10 +83,6 @@ throwforce = 10 throw_speed = 2 -/datum/armor/item_crowbar - fire = 50 - acid = 30 - /obj/item/crowbar/large/old/Initialize(mapload) . = ..() if(prob(50)) @@ -111,10 +103,6 @@ toolspeed = 0.7 force_opens = TRUE -/datum/armor/item_crowbar - fire = 50 - acid = 30 - /obj/item/crowbar/power/Initialize(mapload) . = ..() AddComponent(/datum/component/transforming, \ @@ -146,10 +134,6 @@ toolspeed = 0.5 force_opens = TRUE -/datum/armor/item_crowbar - fire = 50 - acid = 30 - /obj/item/crowbar/power/examine() . = ..() . += " It's fitted with a [tool_behaviour == TOOL_CROWBAR ? "prying" : "cutting"] head." diff --git a/code/game/objects/items/tools/screwdriver.dm b/code/game/objects/items/tools/screwdriver.dm index 6d302be3640..5f7e170041b 100644 --- a/code/game/objects/items/tools/screwdriver.dm +++ b/code/game/objects/items/tools/screwdriver.dm @@ -72,10 +72,6 @@ greyscale_config_inhand_left = null greyscale_config_inhand_right = null -/datum/armor/item_screwdriver - fire = 50 - acid = 30 - /obj/item/screwdriver/abductor/get_belt_overlay() return mutable_appearance('icons/obj/clothing/belt_overlays.dmi', "screwdriver_alien") @@ -105,10 +101,6 @@ greyscale_config_inhand_left = null greyscale_config_inhand_right = null -/datum/armor/item_screwdriver - fire = 50 - acid = 30 - /obj/item/screwdriver/power/Initialize(mapload) . = ..() AddComponent(/datum/component/transforming, \ @@ -157,10 +149,6 @@ /obj/item/screwdriver/red random_color = FALSE -/datum/armor/item_screwdriver - fire = 50 - acid = 30 - /obj/item/screwdriver/red/Initialize(mapload) . = ..() set_greyscale(colors=list(screwdriver_colors["red"])) diff --git a/code/game/objects/items/tools/weldingtool.dm b/code/game/objects/items/tools/weldingtool.dm index 88600ff793d..bb1f72fba2d 100644 --- a/code/game/objects/items/tools/weldingtool.dm +++ b/code/game/objects/items/tools/weldingtool.dm @@ -349,10 +349,6 @@ max_fuel = 40 custom_materials = list(/datum/material/glass=60) -/datum/armor/item_weldingtool - fire = 100 - acid = 30 - /obj/item/weldingtool/largetank/flamethrower_screwdriver() return @@ -366,10 +362,6 @@ icon_state = "indwelder_cyborg" toolspeed = 0.5 -/datum/armor/item_weldingtool - fire = 100 - acid = 30 - /obj/item/weldingtool/largetank/cyborg/cyborg_unequip(mob/user) if(!isOn()) return @@ -385,10 +377,6 @@ custom_materials = list(/datum/material/iron=30, /datum/material/glass=10) change_icons = FALSE -/datum/armor/item_weldingtool - fire = 100 - acid = 30 - /obj/item/weldingtool/mini/flamethrower_screwdriver() return @@ -406,10 +394,6 @@ light_range = 0 change_icons = FALSE -/datum/armor/item_weldingtool - fire = 100 - acid = 30 - /obj/item/weldingtool/abductor/process() if(get_fuel() <= max_fuel) reagents.add_reagent(/datum/reagent/fuel, 1) @@ -438,10 +422,6 @@ var/last_gen = 0 var/nextrefueltick = 0 -/datum/armor/item_weldingtool - fire = 100 - acid = 30 - /obj/item/weldingtool/experimental/process() ..() if(get_fuel() < max_fuel && nextrefueltick < world.time) diff --git a/code/game/objects/items/tools/wrench.dm b/code/game/objects/items/tools/wrench.dm index 6975ecdbac4..e5c609bad62 100644 --- a/code/game/objects/items/tools/wrench.dm +++ b/code/game/objects/items/tools/wrench.dm @@ -59,10 +59,6 @@ ///var to hold the name of the person who suicided var/suicider -/datum/armor/item_wrench - fire = 50 - acid = 30 - /obj/item/wrench/medical/examine(mob/user) . = ..() if(suicider) @@ -105,10 +101,6 @@ tool_behaviour = null toolspeed = null -/datum/armor/item_wrench - fire = 50 - acid = 30 - /obj/item/wrench/combat/Initialize(mapload) . = ..() AddComponent(/datum/component/transforming, \ diff --git a/code/game/objects/items/weaponry.dm b/code/game/objects/items/weaponry.dm index 24f01dd8aad..9ba205ecbb7 100644 --- a/code/game/objects/items/weaponry.dm +++ b/code/game/objects/items/weaponry.dm @@ -55,10 +55,6 @@ for further reading, please see: https://github.com/tgstation/tgstation/pull/301 attack_verb_continuous = list("attacks", "slashes", "stabs", "slices", "tears", "lacerates", "rips", "dices", "cuts") attack_verb_simple = list("attack", "slash", "stab", "slice", "tear", "lacerate", "rip", "dice", "cut") -/datum/armor/item_banhammer - fire = 100 - acid = 70 - /obj/item/sord/suicide_act(mob/living/user) user.visible_message(span_suicide("[user] is trying to impale [user.p_them()]self with [src]! It might be a suicide attempt if it weren't so shitty."), \ span_suicide("You try to impale yourself with [src], but it's USELESS...")) @@ -114,10 +110,6 @@ for further reading, please see: https://github.com/tgstation/tgstation/pull/301 throw_range = 5 armour_penetration = 35 -/datum/armor/item_claymore - fire = 100 - acid = 50 - /obj/item/claymore/highlander //ALL COMMENTS MADE REGARDING THIS SWORD MUST BE MADE IN ALL CAPS desc = "THERE CAN BE ONLY ONE, AND IT WILL BE YOU!!!\nActivate it in your hand to point to the nearest victim." flags_1 = CONDUCT_1 @@ -312,10 +304,6 @@ for further reading, please see: https://github.com/tgstation/tgstation/pull/301 attack_verb_continuous = list("hits", "bludgeons", "whacks", "bonks") attack_verb_simple = list("hit", "bludgeon", "whack", "bonk") -/datum/armor/item_katana - fire = 100 - acid = 50 - /obj/item/wirerod/Initialize(mapload) . = ..() @@ -418,10 +406,6 @@ for further reading, please see: https://github.com/tgstation/tgstation/pull/301 /// Whether the switchblade starts extended or not. var/start_extended = FALSE -/datum/armor/item_katana - fire = 100 - acid = 50 - /obj/item/switchblade/Initialize(mapload) . = ..() AddElement(/datum/element/update_icon_updates_onmob, ITEM_SLOT_HANDS) @@ -471,10 +455,6 @@ for further reading, please see: https://github.com/tgstation/tgstation/pull/301 attack_verb_simple = list("call", "ring") hitsound = 'sound/weapons/ring.ogg' -/datum/armor/item_katana - fire = 100 - acid = 50 - /obj/item/phone/suicide_act(mob/living/user) if(locate(/obj/structure/chair/stool) in user.loc) user.visible_message(span_suicide("[user] begins to tie a noose with [src]'s cord! It looks like [user.p_theyre()] trying to commit suicide!")) @@ -508,10 +488,6 @@ for further reading, please see: https://github.com/tgstation/tgstation/pull/301 w_class = WEIGHT_CLASS_SMALL custom_materials = list(/datum/material/iron = 600) -/datum/armor/item_katana - fire = 100 - acid = 50 - /obj/item/cane/white/Initialize(mapload) . = ..() AddComponent(/datum/component/transforming, \ @@ -582,10 +558,6 @@ for further reading, please see: https://github.com/tgstation/tgstation/pull/301 icon = 'icons/obj/wizard.dmi' icon_state = "ectoplasm" -/datum/armor/item_katana - fire = 100 - acid = 50 - /obj/item/ectoplasm/suicide_act(mob/living/user) user.visible_message(span_suicide("[user] is inhaling [src]! It looks like [user.p_theyre()] trying to visit the astral plane!")) return OXYLOSS @@ -618,10 +590,6 @@ for further reading, please see: https://github.com/tgstation/tgstation/pull/301 tool_behaviour = TOOL_SAW toolspeed = 1 -/datum/armor/item_katana - fire = 100 - acid = 50 - /obj/item/mounted_chainsaw/Initialize(mapload) . = ..() ADD_TRAIT(src, TRAIT_NODROP, HAND_REPLACEMENT_TRAIT) @@ -651,10 +619,6 @@ for further reading, please see: https://github.com/tgstation/tgstation/pull/301 attack_verb_simple = list("bust") var/impressiveness = 45 -/datum/armor/item_katana - fire = 100 - acid = 50 - /obj/item/statuebust/Initialize(mapload) . = ..() AddElement(/datum/element/art, impressiveness) @@ -703,10 +667,6 @@ for further reading, please see: https://github.com/tgstation/tgstation/pull/301 ///The vehicle counterpart for the board var/board_item_type = /obj/vehicle/ridden/scooter/skateboard -/datum/armor/item_katana - fire = 100 - acid = 50 - /obj/item/melee/skateboard/attack_self(mob/user) var/obj/vehicle/ridden/scooter/skateboard/S = new board_item_type(get_turf(user))//this probably has fucky interactions with telekinesis but for the record it wasn't my fault S.buckle_mob(user) @@ -765,10 +725,6 @@ for further reading, please see: https://github.com/tgstation/tgstation/pull/301 /// List of all thrown datums we sent. var/list/thrown_datums = list() -/datum/armor/item_katana - fire = 100 - acid = 50 - /obj/item/melee/baseball_bat/Initialize(mapload) . = ..() if(prob(1)) @@ -887,10 +843,6 @@ for further reading, please see: https://github.com/tgstation/tgstation/pull/301 throwforce = 15 mob_thrower = TRUE -/datum/armor/item_katana - fire = 100 - acid = 50 - /obj/item/melee/baseball_bat/ablative/IsReflect()//some day this will reflect thrown items instead of lasers playsound(src, pick('sound/weapons/effects/batreflect1.ogg', 'sound/weapons/effects/batreflect2.ogg'), 50, TRUE) return TRUE @@ -916,10 +868,6 @@ for further reading, please see: https://github.com/tgstation/tgstation/pull/301 /// How much extra damage the fly swatter does against mobs it is strong against var/extra_strength_damage = 24 -/datum/armor/item_katana - fire = 100 - acid = 50 - /obj/item/melee/flyswatter/Initialize(mapload) . = ..() splattable = typecacheof(list( @@ -977,10 +925,6 @@ for further reading, please see: https://github.com/tgstation/tgstation/pull/301 name = "\improper ACME Extendo-Hand" desc = "A novelty extendo-hand produced by the ACME corporation. Originally designed to knock out roadrunners." -/datum/armor/item_katana - fire = 100 - acid = 50 - /obj/item/extendohand/attack(atom/M, mob/living/carbon/human/user, params) var/dist = get_dist(M, user) if(dist < min_reach) @@ -1050,10 +994,6 @@ for further reading, please see: https://github.com/tgstation/tgstation/pull/301 /// The previous target we attacked var/datum/weakref/previous_target -/datum/armor/item_katana - fire = 100 - acid = 50 - /obj/item/highfrequencyblade/Initialize(mapload) . = ..() AddComponent(/datum/component/two_handed, \ @@ -1145,10 +1085,6 @@ for further reading, please see: https://github.com/tgstation/tgstation/pull/301 layer = ABOVE_ALL_MOB_LAYER plane = ABOVE_GAME_PLANE -/datum/armor/item_katana - fire = 100 - acid = 50 - /obj/effect/temp_visual/slash/Initialize(mapload, atom/target, x_slashed, y_slashed, slash_color) . = ..() if(!target) @@ -1173,10 +1109,6 @@ for further reading, please see: https://github.com/tgstation/tgstation/pull/301 wound_bonus = 20 bare_wound_bonus = 25 -/datum/armor/item_katana - fire = 100 - acid = 50 - /obj/item/highfrequencyblade/wizard/attack_self(mob/user, modifiers) if(!IS_WIZARD(user)) balloon_alert(user, "you're too weak!") diff --git a/code/game/objects/structures/crates_lockers/crates/secure.dm b/code/game/objects/structures/crates_lockers/crates/secure.dm index 4f2235f53bf..4698c8469d2 100644 --- a/code/game/objects/structures/crates_lockers/crates/secure.dm +++ b/code/game/objects/structures/crates_lockers/crates/secure.dm @@ -55,14 +55,6 @@ name = "secure hydroponics crate" icon_state = "hydrosecurecrate" -/datum/armor/crate_secure - melee = 30 - bullet = 50 - laser = 50 - energy = 100 - fire = 80 - acid = 80 - /obj/structure/closet/crate/secure/freezer //for consistency with other "freezer" closets/crates desc = "An insulated crate with a lock on it, used to secure perishables." name = "secure kitchen crate" @@ -74,14 +66,6 @@ req_access = list(ACCESS_KITCHEN) tamperproof = 10 -/datum/armor/crate_secure - melee = 30 - bullet = 50 - laser = 50 - energy = 100 - fire = 80 - acid = 80 - /obj/structure/closet/crate/secure/freezer/pizza/PopulateContents() . = ..() new /obj/effect/spawner/random/food_or_drink/pizzaparty(src) @@ -109,14 +93,6 @@ ///Is the crate being bought by a person, or a budget card? var/department_purchase = FALSE -/datum/armor/crate_secure - melee = 30 - bullet = 50 - laser = 50 - energy = 100 - fire = 80 - acid = 80 - /obj/structure/closet/crate/secure/owned/examine(mob/user) . = ..() . += span_notice("It's locked with a privacy lock, and can only be unlocked by the buyer's ID.") diff --git a/code/game/objects/structures/displaycase.dm b/code/game/objects/structures/displaycase.dm index 6795bb7f7a4..785eeb330f3 100644 --- a/code/game/objects/structures/displaycase.dm +++ b/code/game/objects/structures/displaycase.dm @@ -233,12 +233,6 @@ var/obj/item/electronics/airlock/electronics -/datum/armor/structure_displaycase - melee = 30 - bomb = 10 - fire = 70 - acid = 100 - /obj/structure/displaycase_chassis/attackby(obj/item/I, mob/user, params) if(I.tool_behaviour == TOOL_WRENCH) //The player can only deconstruct the wooden frame to_chat(user, span_notice("You start disassembling [src]...")) @@ -319,12 +313,6 @@ ///the trophy message var/trophy_message = "" -/datum/armor/structure_displaycase - melee = 30 - bomb = 10 - fire = 70 - acid = 100 - /obj/structure/displaycase/trophy/Initialize(mapload) . = ..() GLOB.trophy_cases += src @@ -441,12 +429,6 @@ /obj/item/showpiece_dummy name = "holographic replica" -/datum/armor/structure_displaycase - melee = 30 - bomb = 10 - fire = 70 - acid = 100 - /obj/item/showpiece_dummy/Initialize(mapload, path) . = ..() var/obj/item/item_path = path @@ -472,12 +454,6 @@ ///The Account which will receive payment for purchases. Set by the first ID to swipe the tray. var/datum/bank_account/payments_acc = null -/datum/armor/structure_displaycase - melee = 30 - bomb = 10 - fire = 70 - acid = 100 - /obj/structure/displaycase/forsale/update_icon_state() icon_state = "[initial(icon_state)][broken ? "_broken" : (open ? "_open" : (!showpiece ? "_empty" : null))]" return ..() diff --git a/code/game/objects/structures/holosign.dm b/code/game/objects/structures/holosign.dm index dd4372139b7..941f86fd081 100644 --- a/code/game/objects/structures/holosign.dm +++ b/code/game/objects/structures/holosign.dm @@ -66,13 +66,6 @@ max_integrity = 20 var/allow_walk = TRUE //can we pass through it on walk intent -/datum/armor/structure_holosign - bullet = 50 - laser = 50 - energy = 50 - fire = 20 - acid = 20 - /obj/structure/holosign/barrier/CanAllowThrough(atom/movable/mover, border_dir) . = ..() if(.) @@ -90,13 +83,6 @@ icon = 'icons/effects/effects.dmi' icon_state = "holosign" -/datum/armor/structure_holosign - bullet = 50 - laser = 50 - energy = 50 - fire = 20 - acid = 20 - /obj/structure/holosign/barrier/wetsign/CanAllowThrough(atom/movable/mover, border_dir) . = ..() if(iscarbon(mover)) @@ -130,13 +116,6 @@ max_integrity = 150 icon_state = "holo_tram" -/datum/armor/structure_holosign - bullet = 50 - laser = 50 - energy = 50 - fire = 20 - acid = 20 - /obj/structure/holosign/barrier/atmos/Initialize(mapload) . = ..() air_update_turf(TRUE, TRUE) @@ -156,13 +135,6 @@ max_integrity = 10 allow_walk = FALSE -/datum/armor/structure_holosign - bullet = 50 - laser = 50 - energy = 50 - fire = 20 - acid = 20 - /obj/structure/holosign/barrier/cyborg/bullet_act(obj/projectile/P) take_damage((P.damage / 5) , BRUTE, MELEE, 1) //Doesn't really matter what damage flag it is. if(istype(P, /obj/projectile/energy/electrode)) @@ -179,13 +151,6 @@ var/force_allaccess = FALSE var/buzzcd = 0 -/datum/armor/structure_holosign - bullet = 50 - laser = 50 - energy = 50 - fire = 20 - acid = 20 - /obj/structure/holosign/barrier/medical/examine(mob/user) . = ..() . += span_notice("The biometric scanners are [force_allaccess ? "off" : "on"].") @@ -231,13 +196,6 @@ max_integrity = 20 var/shockcd = 0 -/datum/armor/structure_holosign - bullet = 50 - laser = 50 - energy = 50 - fire = 20 - acid = 20 - /obj/structure/holosign/barrier/cyborg/hacked/bullet_act(obj/projectile/P) take_damage(P.damage, BRUTE, MELEE, 1) //Yeah no this doesn't get projectile resistance. return BULLET_ACT_HIT diff --git a/code/game/objects/structures/lattice.dm b/code/game/objects/structures/lattice.dm index ddf3deb8080..eb7a0d0196e 100644 --- a/code/game/objects/structures/lattice.dm +++ b/code/game/objects/structures/lattice.dm @@ -86,11 +86,6 @@ canSmoothWith = SMOOTH_GROUP_CATWALK obj_flags = CAN_BE_HIT | BLOCK_Z_OUT_DOWN | BLOCK_Z_IN_UP -/datum/armor/structure_lattice - melee = 50 - fire = 80 - acid = 50 - /obj/structure/lattice/catwalk/deconstruction_hints(mob/user) return span_notice("The supporting rods look like they could be cut.") @@ -111,11 +106,6 @@ desc = "A heavily reinforced catwalk used to build bridges in hostile environments. It doesn't look like anything could make this budge." resistance_flags = INDESTRUCTIBLE -/datum/armor/structure_lattice - melee = 50 - fire = 80 - acid = 50 - /obj/structure/lattice/catwalk/mining/deconstruction_hints(mob/user) return @@ -133,11 +123,6 @@ obj_flags = CAN_BE_HIT | BLOCK_Z_OUT_DOWN | BLOCK_Z_IN_UP resistance_flags = FIRE_PROOF | LAVA_PROOF -/datum/armor/structure_lattice - melee = 50 - fire = 80 - acid = 50 - /obj/structure/lattice/lava/deconstruction_hints(mob/user) return span_notice("The rods look like they could be cut, but the heat treatment will shatter off. There's space for a tile.") diff --git a/code/game/objects/structures/mineral_doors.dm b/code/game/objects/structures/mineral_doors.dm index 588413bcc96..5baacb8a651 100644 --- a/code/game/objects/structures/mineral_doors.dm +++ b/code/game/objects/structures/mineral_doors.dm @@ -248,13 +248,6 @@ opacity = FALSE rad_insulation = RAD_VERY_LIGHT_INSULATION -/datum/armor/structure_mineral_door - melee = 10 - energy = 100 - bomb = 10 - fire = 50 - acid = 50 - /obj/structure/mineral_door/transparent/Close() ..() set_opacity(FALSE) @@ -281,13 +274,6 @@ max_integrity = 200 rad_insulation = RAD_VERY_LIGHT_INSULATION -/datum/armor/structure_mineral_door - melee = 10 - energy = 100 - bomb = 10 - fire = 50 - acid = 50 - /obj/structure/mineral_door/wood/pickaxe_door(mob/living/user, obj/item/I) return @@ -314,13 +300,6 @@ resistance_flags = FLAMMABLE max_integrity = 20 -/datum/armor/structure_mineral_door - melee = 10 - energy = 100 - bomb = 10 - fire = 50 - acid = 50 - /obj/structure/mineral_door/paperframe/Initialize(mapload) . = ..() if(smoothing_flags & (SMOOTH_CORNERS|SMOOTH_BITMASK)) diff --git a/code/game/objects/structures/tables_racks.dm b/code/game/objects/structures/tables_racks.dm index 173fe27f7af..bfef72d6ab1 100644 --- a/code/game/objects/structures/tables_racks.dm +++ b/code/game/objects/structures/tables_racks.dm @@ -484,10 +484,6 @@ smoothing_groups = SMOOTH_GROUP_WOOD_TABLES //Don't smooth with SMOOTH_GROUP_TABLES canSmoothWith = SMOOTH_GROUP_WOOD_TABLES -/datum/armor/table_glass - fire = 80 - acid = 100 - /obj/structure/table/wood/narsie_act(total_override = TRUE) if(!total_override) ..() @@ -516,10 +512,6 @@ canSmoothWith = SMOOTH_GROUP_FANCY_WOOD_TABLES var/smooth_icon = 'icons/obj/smooth_structures/fancy_table.dmi' // see Initialize() -/datum/armor/table_glass - fire = 80 - acid = 100 - /obj/structure/table/wood/fancy/Initialize(mapload) . = ..() // Needs to be set dynamically because table smooth sprites are 32x34, @@ -653,15 +645,6 @@ smoothing_groups = SMOOTH_GROUP_BRONZE_TABLES //Don't smooth with SMOOTH_GROUP_TABLES canSmoothWith = SMOOTH_GROUP_BRONZE_TABLES -/datum/armor/table_reinforced - melee = 10 - bullet = 30 - laser = 30 - energy = 100 - bomb = 20 - fire = 80 - acid = 70 - /obj/structure/table/bronze/tablepush(mob/living/user, mob/living/pushed_mob) ..() playsound(src, 'sound/magic/clockwork/fellowship_armory.ogg', 50, TRUE) @@ -725,15 +708,6 @@ var/mob/living/carbon/patient = null var/obj/machinery/computer/operating/computer = null -/datum/armor/table_reinforced - melee = 10 - bullet = 30 - laser = 30 - energy = 100 - bomb = 20 - fire = 80 - acid = 70 - /obj/structure/table/optable/Initialize(mapload) . = ..() for(var/direction in GLOB.alldirs) @@ -807,15 +781,6 @@ pass_flags_self = LETPASSTHROW //You can throw objects over this, despite it's density. max_integrity = 20 -/datum/armor/table_reinforced - melee = 10 - bullet = 30 - laser = 30 - energy = 100 - bomb = 20 - fire = 80 - acid = 70 - /obj/structure/rack/examine(mob/user) . = ..() . += span_notice("It's held together by a couple of bolts.") @@ -897,15 +862,6 @@ custom_materials = list(/datum/material/iron=2000) var/building = FALSE -/datum/armor/table_reinforced - melee = 10 - bullet = 30 - laser = 30 - energy = 100 - bomb = 20 - fire = 80 - acid = 70 - /obj/item/rack_parts/attackby(obj/item/W, mob/user, params) if (W.tool_behaviour == TOOL_WRENCH) new /obj/item/stack/sheet/iron(user.loc) diff --git a/code/game/objects/structures/window.dm b/code/game/objects/structures/window.dm index 99d55960787..088a5c08b2e 100644 --- a/code/game/objects/structures/window.dm +++ b/code/game/objects/structures/window.dm @@ -740,13 +740,6 @@ glass_amount = 2 //there is a sub shuttle window in survival_pod.dm for mining pods -/datum/armor/reinforced_plasma - melee = 80 - bullet = 20 - bomb = 60 - fire = 99 - acid = 100 - /obj/structure/window/reinforced/shuttle//this is called reinforced because it is reinforced w/titanium name = "shuttle window" desc = "A reinforced, air-locked pod window." @@ -862,12 +855,6 @@ var/static/mutable_appearance/torn = mutable_appearance('icons/obj/smooth_structures/paperframes.dmi',icon_state = "torn", layer = ABOVE_OBJ_LAYER - 0.1) var/static/mutable_appearance/paper = mutable_appearance('icons/obj/smooth_structures/paperframes.dmi',icon_state = "paper", layer = ABOVE_OBJ_LAYER - 0.1) -/datum/armor/plasma_plastitanium - melee = 95 - bomb = 50 - fire = 80 - acid = 100 - /obj/structure/window/paperframe/Initialize(mapload) . = ..() update_appearance() diff --git a/code/modules/antagonists/blob/structures/_blob.dm b/code/modules/antagonists/blob/structures/_blob.dm index 991342ddf3f..b9f0337b295 100644 --- a/code/modules/antagonists/blob/structures/_blob.dm +++ b/code/modules/antagonists/blob/structures/_blob.dm @@ -355,10 +355,6 @@ health_regen = BLOB_REGULAR_HP_REGEN brute_resist = BLOB_BRUTE_RESIST * 0.5 -/datum/armor/structure_blob - fire = 80 - acid = 70 - /obj/structure/blob/normal/Initialize(mapload, owner_overmind) . = ..() update_integrity(initial_integrity) diff --git a/code/modules/antagonists/blob/structures/shield.dm b/code/modules/antagonists/blob/structures/shield.dm index 2d33d02ab91..0699d70f3f2 100644 --- a/code/modules/antagonists/blob/structures/shield.dm +++ b/code/modules/antagonists/blob/structures/shield.dm @@ -57,9 +57,5 @@ max_integrity = BLOB_REFLECTOR_MAX_HP health_regen = BLOB_REFLECTOR_HP_REGEN -/datum/armor/blob_shield - fire = 90 - acid = 90 - /obj/structure/blob/shield/reflective/core // Automatically generated by the core point_return = 0 diff --git a/code/modules/antagonists/changeling/powers/mutations.dm b/code/modules/antagonists/changeling/powers/mutations.dm index 375714eb6cf..04c9ebceb1f 100644 --- a/code/modules/antagonists/changeling/powers/mutations.dm +++ b/code/modules/antagonists/changeling/powers/mutations.dm @@ -520,11 +520,6 @@ armor_type = /datum/armor/space_changeling flags_cover = HEADCOVERSEYES | HEADCOVERSMOUTH -/datum/armor/space_changeling - bio = 100 - fire = 90 - acid = 90 - /obj/item/clothing/head/helmet/space/changeling/Initialize(mapload) . = ..() ADD_TRAIT(src, TRAIT_NODROP, CHANGELING_TRAIT) diff --git a/code/modules/antagonists/clown_ops/clown_weapons.dm b/code/modules/antagonists/clown_ops/clown_weapons.dm index ef6b2d97d1f..2f0a44d45cc 100644 --- a/code/modules/antagonists/clown_ops/clown_weapons.dm +++ b/code/modules/antagonists/clown_ops/clown_weapons.dm @@ -98,16 +98,6 @@ /// Cooldown for making a trombone noise for failing to make a bananium desword COOLDOWN_DECLARE(next_trombone_allowed) -/datum/armor/banana_shoes_combat - melee = 25 - bullet = 25 - laser = 25 - energy = 25 - bomb = 50 - bio = 50 - fire = 90 - acid = 50 - /obj/item/melee/energy/sword/bananium/make_transformable() AddComponent(/datum/component/transforming, \ throw_speed_on = 4, \ @@ -174,16 +164,6 @@ active_throw_speed = 1 can_clumsy_use = TRUE -/datum/armor/banana_shoes_combat - melee = 25 - bullet = 25 - laser = 25 - energy = 25 - bomb = 50 - bio = 50 - fire = 90 - acid = 50 - /obj/item/shield/energy/bananium/on_transform(obj/item/source, mob/user, active) . = ..() adjust_comedy() @@ -229,16 +209,6 @@ var/det_time = 50 var/obj/item/grenade/syndieminibomb/bomb -/datum/armor/banana_shoes_combat - melee = 25 - bullet = 25 - laser = 25 - energy = 25 - bomb = 50 - bio = 50 - fire = 90 - acid = 50 - /obj/item/grown/bananapeel/bombanana/Initialize(mapload) . = ..() AddComponent(/datum/component/slippery, det_time) @@ -266,16 +236,6 @@ icon_state = "moustacheg" clumsy_check = GRENADE_NONCLUMSY_FUMBLE -/datum/armor/banana_shoes_combat - melee = 25 - bullet = 25 - laser = 25 - energy = 25 - bomb = 50 - bio = 50 - fire = 90 - acid = 50 - /obj/item/grenade/chem_grenade/teargas/moustache/detonate(mob/living/lanced_by) var/myloc = get_turf(src) . = ..() @@ -291,16 +251,6 @@ /obj/item/clothing/mask/fakemoustache/sticky var/unstick_time = 600 -/datum/armor/banana_shoes_combat - melee = 25 - bullet = 25 - laser = 25 - energy = 25 - bomb = 50 - bio = 50 - fire = 90 - acid = 50 - /obj/item/clothing/mask/fakemoustache/sticky/Initialize(mapload) . = ..() ADD_TRAIT(src, TRAIT_NODROP, STICKY_MOUSTACHE_TRAIT) diff --git a/code/modules/atmospherics/machinery/airalarm.dm b/code/modules/atmospherics/machinery/airalarm.dm index 25adcb4a131..2a735bab880 100644 --- a/code/modules/atmospherics/machinery/airalarm.dm +++ b/code/modules/atmospherics/machinery/airalarm.dm @@ -933,11 +933,6 @@ GLOBAL_LIST_EMPTY_TYPED(air_alarms, /obj/machinery/airalarm) req_access = null req_one_access = null -/datum/armor/machinery_airalarm - energy = 100 - fire = 90 - acid = 30 - /obj/machinery/airalarm/syndicate //general syndicate access req_access = list(ACCESS_SYNDICATE) @@ -969,11 +964,6 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/machinery/airalarm, 24) var/static/list/options_map -/datum/armor/machinery_airalarm - energy = 100 - fire = 90 - acid = 30 - /obj/item/circuit_component/air_alarm_general/populate_options() if(!options_map) options_map = list( @@ -1086,11 +1076,6 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/machinery/airalarm, 24) var/list/alarm_duplicates = list() var/max_alarm_duplicates = 20 -/datum/armor/machinery_airalarm - energy = 100 - fire = 90 - acid = 30 - /obj/item/circuit_component/air_alarm/ui_perform_action(mob/user, action) if(length(alarm_duplicates) >= max_alarm_duplicates) return @@ -1140,11 +1125,6 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/machinery/airalarm, 24) circuit_size = 0 ui_buttons = list() -/datum/armor/machinery_airalarm - energy = 100 - fire = 90 - acid = 30 - /obj/item/circuit_component/air_alarm/duplicate/removed_from(obj/item/integrated_circuit/removed_from) if(!QDELING(src)) qdel(src) @@ -1251,11 +1231,6 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/machinery/airalarm, 24) var/max_scrubber_duplicates = 20 var/list/scrubber_duplicates = list() -/datum/armor/machinery_airalarm - energy = 100 - fire = 90 - acid = 30 - /obj/item/circuit_component/air_alarm_scrubbers/ui_perform_action(mob/user, action) if(length(scrubber_duplicates) >= max_scrubber_duplicates) return @@ -1296,11 +1271,6 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/machinery/airalarm, 24) circuit_size = 0 ui_buttons = list() -/datum/armor/machinery_airalarm - energy = 100 - fire = 90 - acid = 30 - /obj/item/circuit_component/air_alarm_scrubbers/duplicate/Destroy() connected_alarm = null return ..() @@ -1480,11 +1450,6 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/machinery/airalarm, 24) var/max_vent_duplicates = 20 var/list/vent_duplicates = list() -/datum/armor/machinery_airalarm - energy = 100 - fire = 90 - acid = 30 - /obj/item/circuit_component/air_alarm_vents/ui_perform_action(mob/user, action) if(length(vent_duplicates) >= max_vent_duplicates) return @@ -1533,11 +1498,6 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/machinery/airalarm, 24) circuit_size = 0 ui_buttons = list() -/datum/armor/machinery_airalarm - energy = 100 - fire = 90 - acid = 30 - /obj/item/circuit_component/air_alarm_vents/duplicate/removed_from(obj/item/integrated_circuit/removed_from) if(!QDELING(src)) qdel(src) diff --git a/code/modules/atmospherics/machinery/components/unary_devices/thermomachine.dm b/code/modules/atmospherics/machinery/components/unary_devices/thermomachine.dm index 40f371e044d..111380b92d3 100644 --- a/code/modules/atmospherics/machinery/components/unary_devices/thermomachine.dm +++ b/code/modules/atmospherics/machinery/components/unary_devices/thermomachine.dm @@ -300,11 +300,6 @@ on = TRUE icon_state = "thermo_base_1" -/datum/armor/unary_thermomachine - energy = 100 - fire = 80 - acid = 30 - /obj/machinery/atmospherics/components/unary/thermomachine/freezer/on/Initialize(mapload) . = ..() if(target_temperature == initial(target_temperature)) @@ -314,11 +309,6 @@ icon_state = "thermo_base_1" greyscale_colors = COLOR_CYAN -/datum/armor/unary_thermomachine - energy = 100 - fire = 80 - acid = 30 - /obj/machinery/atmospherics/components/unary/thermomachine/freezer/on/coldroom/Initialize(mapload) . = ..() target_temperature = COLD_ROOM_TEMP diff --git a/code/modules/atmospherics/machinery/other/meter.dm b/code/modules/atmospherics/machinery/other/meter.dm index 53722991054..12ac25680fd 100644 --- a/code/modules/atmospherics/machinery/other/meter.dm +++ b/code/modules/atmospherics/machinery/other/meter.dm @@ -162,10 +162,6 @@ ///The component parent object var/obj/machinery/meter/connected_meter -/datum/armor/machinery_meter - energy = 100 - fire = 40 - /obj/item/circuit_component/atmos_meter/populate_ports() request_data = add_input_port("Request Meter Data", PORT_TYPE_SIGNAL, trigger = PROC_REF(request_meter_data)) @@ -193,10 +189,6 @@ // why are you yelling? /obj/machinery/meter/turf -/datum/armor/machinery_meter - energy = 100 - fire = 40 - /obj/machinery/meter/turf/reattach_to_layer() target = loc diff --git a/code/modules/atmospherics/machinery/portable/canister.dm b/code/modules/atmospherics/machinery/portable/canister.dm index cc3da760a5f..01d06951299 100644 --- a/code/modules/atmospherics/machinery/portable/canister.dm +++ b/code/modules/atmospherics/machinery/portable/canister.dm @@ -289,15 +289,6 @@ GLOBAL_LIST_INIT(gas_id_to_canister, init_gas_id_to_canister()) temp_limit = 1e12 pressure_limit = 1e14 -/datum/armor/portable_atmospherics_canister - melee = 50 - bullet = 50 - laser = 50 - energy = 100 - bomb = 10 - fire = 80 - acid = 50 - /obj/machinery/portable_atmospherics/canister/fusion_test/create_gas() air_contents.add_gases(/datum/gas/hydrogen, /datum/gas/tritium) air_contents.gases[/datum/gas/hydrogen][MOLES] = 300 @@ -311,15 +302,6 @@ GLOBAL_LIST_INIT(gas_id_to_canister, init_gas_id_to_canister()) greyscale_config = /datum/greyscale_config/canister/double_stripe greyscale_colors = "#9fba6c#3d4680" -/datum/armor/portable_atmospherics_canister - melee = 50 - bullet = 50 - laser = 50 - energy = 100 - bomb = 10 - fire = 80 - acid = 50 - /obj/machinery/portable_atmospherics/canister/anesthetic_mix/create_gas() air_contents.add_gases(/datum/gas/oxygen, /datum/gas/nitrous_oxide) air_contents.gases[/datum/gas/oxygen][MOLES] = (O2_ANESTHETIC * maximum_pressure * filled) * air_contents.volume / (R_IDEAL_GAS_EQUATION * air_contents.temperature) @@ -370,15 +352,6 @@ GLOBAL_LIST_INIT(gas_id_to_canister, init_gas_id_to_canister()) * Called on Initialize(), fill the canister with the gas_type specified up to the filled level (half if 0.5, full if 1) * Used for canisters spawned in maps and by admins */ -/datum/armor/portable_atmospherics_canister - melee = 50 - bullet = 50 - laser = 50 - energy = 100 - bomb = 10 - fire = 80 - acid = 50 - /obj/machinery/portable_atmospherics/canister/proc/create_gas() if(!gas_type) return diff --git a/code/modules/awaymissions/mission_code/snowdin.dm b/code/modules/awaymissions/mission_code/snowdin.dm index 6904aa746cb..73da55ad2fe 100644 --- a/code/modules/awaymissions/mission_code/snowdin.dm +++ b/code/modules/awaymissions/mission_code/snowdin.dm @@ -391,25 +391,11 @@ desc = "High speed, low drag combat boots, now with an added layer of insulation." min_cold_protection_temperature = FIRE_SUIT_MIN_TEMP_PROTECT -/datum/armor/syndicate_coldres - melee = 20 - bullet = 10 - energy = 5 - fire = 25 - acid = 25 - /obj/item/gun/magic/wand/fireball/inert name = "weakened wand of fireball" desc = "This wand shoots scorching balls of fire that explode into destructive flames. The years of the cold have weakened the magic inside the wand." max_charges = 4 -/datum/armor/syndicate_coldres - melee = 20 - bullet = 10 - energy = 5 - fire = 25 - acid = 25 - /obj/item/gun/magic/wand/resurrection/inert name = "weakened wand of healing" desc = "This wand uses healing magics to heal and revive. The years of the cold have weakened the magic inside the wand." @@ -417,142 +403,44 @@ //decals//-- -/datum/armor/syndicate_coldres - melee = 20 - bullet = 10 - energy = 5 - fire = 25 - acid = 25 - /obj/effect/turf_decal/snowdin_station_sign icon_state = "AOP1" -/datum/armor/syndicate_coldres - melee = 20 - bullet = 10 - energy = 5 - fire = 25 - acid = 25 - /obj/effect/turf_decal/snowdin_station_sign/two icon_state = "AOP2" -/datum/armor/syndicate_coldres - melee = 20 - bullet = 10 - energy = 5 - fire = 25 - acid = 25 - /obj/effect/turf_decal/snowdin_station_sign/three icon_state = "AOP3" -/datum/armor/syndicate_coldres - melee = 20 - bullet = 10 - energy = 5 - fire = 25 - acid = 25 - /obj/effect/turf_decal/snowdin_station_sign/four icon_state = "AOP4" -/datum/armor/syndicate_coldres - melee = 20 - bullet = 10 - energy = 5 - fire = 25 - acid = 25 - /obj/effect/turf_decal/snowdin_station_sign/five icon_state = "AOP5" -/datum/armor/syndicate_coldres - melee = 20 - bullet = 10 - energy = 5 - fire = 25 - acid = 25 - /obj/effect/turf_decal/snowdin_station_sign/six icon_state = "AOP6" -/datum/armor/syndicate_coldres - melee = 20 - bullet = 10 - energy = 5 - fire = 25 - acid = 25 - /obj/effect/turf_decal/snowdin_station_sign/seven icon_state = "AOP7" -/datum/armor/syndicate_coldres - melee = 20 - bullet = 10 - energy = 5 - fire = 25 - acid = 25 - /obj/effect/turf_decal/snowdin_station_sign/up icon_state = "AOPU1" -/datum/armor/syndicate_coldres - melee = 20 - bullet = 10 - energy = 5 - fire = 25 - acid = 25 - /obj/effect/turf_decal/snowdin_station_sign/up/two icon_state = "AOPU2" -/datum/armor/syndicate_coldres - melee = 20 - bullet = 10 - energy = 5 - fire = 25 - acid = 25 - /obj/effect/turf_decal/snowdin_station_sign/up/three icon_state = "AOPU3" -/datum/armor/syndicate_coldres - melee = 20 - bullet = 10 - energy = 5 - fire = 25 - acid = 25 - /obj/effect/turf_decal/snowdin_station_sign/up/four icon_state = "AOPU4" -/datum/armor/syndicate_coldres - melee = 20 - bullet = 10 - energy = 5 - fire = 25 - acid = 25 - /obj/effect/turf_decal/snowdin_station_sign/up/five icon_state = "AOPU5" -/datum/armor/syndicate_coldres - melee = 20 - bullet = 10 - energy = 5 - fire = 25 - acid = 25 - /obj/effect/turf_decal/snowdin_station_sign/up/six icon_state = "AOPU6" -/datum/armor/syndicate_coldres - melee = 20 - bullet = 10 - energy = 5 - fire = 25 - acid = 25 - /obj/effect/turf_decal/snowdin_station_sign/up/seven icon_state = "AOPU7" diff --git a/code/modules/cargo/supplypod.dm b/code/modules/cargo/supplypod.dm index b9dfa4c755d..828f7eeb27e 100644 --- a/code/modules/cargo/supplypod.dm +++ b/code/modules/cargo/supplypod.dm @@ -577,15 +577,6 @@ icon_state = "LZ_Slider" layer = PROJECTILE_HIT_THRESHHOLD_LAYER -/datum/armor/closet_supplypod - melee = 30 - bullet = 50 - laser = 50 - energy = 100 - bomb = 100 - fire = 100 - acid = 80 - /obj/effect/pod_landingzone_effect/Initialize(mapload, obj/structure/closet/supplypod/pod) . = ..() if(!pod) diff --git a/code/modules/clothing/chameleon.dm b/code/modules/clothing/chameleon.dm index 0d5c0e64908..f252ed3b05f 100644 --- a/code/modules/clothing/chameleon.dm +++ b/code/modules/clothing/chameleon.dm @@ -594,13 +594,6 @@ armor_type = /datum/armor/none // which means it offers no protection, it's just air and light -/datum/armor/head_chameleon - melee = 5 - bullet = 5 - laser = 5 - fire = 50 - acid = 50 - /obj/item/clothing/head/chameleon/drone/Initialize(mapload) . = ..() ADD_TRAIT(src, TRAIT_NODROP, ABSTRACT_ITEM_TRAIT) @@ -670,14 +663,6 @@ // Can drones use the voice changer part? Let's not find out. voice_change = 0 -/datum/armor/mask_chameleon - melee = 5 - bullet = 5 - laser = 5 - bio = 100 - fire = 50 - acid = 50 - /obj/item/clothing/mask/chameleon/drone/Initialize(mapload) . = ..() ADD_TRAIT(src, TRAIT_NODROP, ABSTRACT_ITEM_TRAIT) @@ -739,14 +724,6 @@ special_desc = "A pair of chameleon shoes with an anti-slip coating employed by the Syndicate in infiltration operations." // Skyrat edit -/datum/armor/shoes_chameleon - melee = 10 - bullet = 10 - laser = 10 - bio = 90 - fire = 50 - acid = 50 - /obj/item/clothing/shoes/chameleon/noslip/broken/Initialize(mapload) . = ..() chameleon_action.emp_randomise(INFINITY) @@ -758,14 +735,6 @@ var/datum/action/item_action/chameleon/change/chameleon_action -/datum/armor/shoes_chameleon - melee = 10 - bullet = 10 - laser = 10 - bio = 90 - fire = 50 - acid = 50 - /obj/item/storage/backpack/chameleon/Initialize(mapload) . = ..() chameleon_action = new(src) @@ -796,14 +765,6 @@ var/datum/action/item_action/chameleon/change/chameleon_action -/datum/armor/shoes_chameleon - melee = 10 - bullet = 10 - laser = 10 - bio = 90 - fire = 50 - acid = 50 - /obj/item/storage/belt/chameleon/Initialize(mapload) . = ..() @@ -836,14 +797,6 @@ var/datum/action/item_action/chameleon/change/chameleon_action -/datum/armor/shoes_chameleon - melee = 10 - bullet = 10 - laser = 10 - bio = 90 - fire = 50 - acid = 50 - /obj/item/radio/headset/chameleon/Initialize(mapload) . = ..() chameleon_action = new(src) @@ -870,14 +823,6 @@ name = "tablet" var/datum/action/item_action/chameleon/change/tablet/chameleon_action -/datum/armor/shoes_chameleon - melee = 10 - bullet = 10 - laser = 10 - bio = 90 - fire = 50 - acid = 50 - /obj/item/modular_computer/pda/chameleon/Initialize(mapload) . = ..() chameleon_action = new(src) @@ -904,14 +849,6 @@ /obj/item/stamp/chameleon var/datum/action/item_action/chameleon/change/chameleon_action -/datum/armor/shoes_chameleon - melee = 10 - bullet = 10 - laser = 10 - bio = 90 - fire = 50 - acid = 50 - /obj/item/stamp/chameleon/Initialize(mapload) . = ..() chameleon_action = new(src) @@ -983,10 +920,6 @@ /// The badmin mode. Makes your projectiles act like the real deal. var/real_hits = FALSE -/datum/armor/neck_chameleon - fire = 50 - acid = 50 - /obj/item/gun/energy/laser/chameleon/Initialize(mapload) . = ..() chameleon_action = new(src) diff --git a/code/modules/clothing/glasses/_glasses.dm b/code/modules/clothing/glasses/_glasses.dm index 35eba387ee3..24ad308a413 100644 --- a/code/modules/clothing/glasses/_glasses.dm +++ b/code/modules/clothing/glasses/_glasses.dm @@ -245,10 +245,6 @@ inhand_icon_state = "glasses" vision_correction = TRUE //corrects nearsightedness -/datum/armor/glasses_science - fire = 80 - acid = 100 - /obj/item/clothing/glasses/regular/Initialize(mapload) . = ..() AddComponent(/datum/component/knockoff, 25, list(BODY_ZONE_PRECISE_EYES), slot_flags) @@ -388,10 +384,6 @@ glass_colour_type = /datum/client_colour/glass_colour/gray alternate_worn_layer = ABOVE_BODY_FRONT_HEAD_LAYER // SKYRAT EDIT - Just so it works until I make the change upstream -/datum/armor/glasses_science - fire = 80 - acid = 100 - /obj/item/clothing/glasses/welding/attack_self(mob/user) weldingvisortoggle(user) @@ -409,10 +401,6 @@ darkness_view = 1 dog_fashion = /datum/dog_fashion/head -/datum/armor/glasses_science - fire = 80 - acid = 100 - /obj/item/clothing/glasses/blindfold/equipped(mob/living/carbon/human/user, slot) . = ..() if(slot & ITEM_SLOT_EYES) @@ -435,10 +423,6 @@ inhand_icon_state = null var/colored_before = FALSE -/datum/armor/glasses_science - fire = 80 - acid = 100 - /obj/item/clothing/glasses/blindfold/white/visual_equipped(mob/living/carbon/human/user, slot) if(ishuman(user) && (slot & ITEM_SLOT_EYES)) update_icon(ALL, user) @@ -477,10 +461,6 @@ flash_protect = FLASH_PROTECTION_SENSITIVE glass_colour_type = /datum/client_colour/glass_colour/red -/datum/armor/glasses_science - fire = 80 - acid = 100 - /obj/item/clothing/glasses/thermal/emp_act(severity) . = ..() if(. & EMP_PROTECT_SELF) @@ -492,10 +472,6 @@ desc = "A pair of xray goggles manufactured by the Syndicate." vision_flags = SEE_TURFS|SEE_MOBS|SEE_OBJS -/datum/armor/glasses_science - fire = 80 - acid = 100 - /obj/item/clothing/glasses/thermal/xray/equipped(mob/living/carbon/human/user, slot) . = ..() if(!(slot & ITEM_SLOT_EYES) || !istype(user)) @@ -535,10 +511,6 @@ icon_state = "thermoncle" flags_1 = null //doesn't protect eyes because it's a monocle, duh -/datum/armor/glasses_science - fire = 80 - acid = 100 - /obj/item/clothing/glasses/thermal/monocle/examine(mob/user) //Different examiners see a different description! if(user.gender == MALE) desc = replacetext(desc, "person", "man") @@ -618,10 +590,6 @@ var/list/hudlist = list(DATA_HUD_MEDICAL_ADVANCED, DATA_HUD_DIAGNOSTIC_ADVANCED, DATA_HUD_SECURITY_ADVANCED) var/xray = FALSE -/datum/armor/glasses_science - fire = 80 - acid = 100 - /obj/item/clothing/glasses/debug/equipped(mob/user, slot) . = ..() if(!(slot & ITEM_SLOT_EYES)) @@ -672,10 +640,6 @@ ///Tells us who the current wearer([BIGSHOT]) is. var/mob/living/carbon/human/bigshot -/datum/armor/glasses_science - fire = 80 - acid = 100 - /obj/item/clothing/glasses/salesman/equipped(mob/living/carbon/human/user, slot) ..() if(!(slot & ITEM_SLOT_EYES)) diff --git a/code/modules/clothing/gloves/plasmaman.dm b/code/modules/clothing/gloves/plasmaman.dm index 3447fda2cf4..0ca552773ec 100644 --- a/code/modules/clothing/gloves/plasmaman.dm +++ b/code/modules/clothing/gloves/plasmaman.dm @@ -20,11 +20,6 @@ icon_state = "blackplasma" greyscale_colors = "#2f2e31" -/datum/armor/color_plasmaman - bio = 100 - fire = 95 - acid = 95 - /obj/item/clothing/gloves/color/plasmaman/plasmanitrile name = "nitrile envirogloves" desc = "Pricy nitrile gloves made for plasmamen." @@ -32,82 +27,42 @@ greyscale_colors = "#913b00" clothing_traits = list(TRAIT_QUICKER_CARRY, TRAIT_FASTMED) -/datum/armor/color_plasmaman - bio = 100 - fire = 95 - acid = 95 - /obj/item/clothing/gloves/color/plasmaman/white name = "white envirogloves" icon_state = "whiteplasma" greyscale_colors = "#ffffff" -/datum/armor/color_plasmaman - bio = 100 - fire = 95 - acid = 95 - /obj/item/clothing/gloves/color/plasmaman/robot name = "roboticist envirogloves" icon_state = "robotplasma" greyscale_colors = "#932500" -/datum/armor/color_plasmaman - bio = 100 - fire = 95 - acid = 95 - /obj/item/clothing/gloves/color/plasmaman/janny name = "janitor envirogloves" icon_state = "jannyplasma" greyscale_colors = "#883391" -/datum/armor/color_plasmaman - bio = 100 - fire = 95 - acid = 95 - /obj/item/clothing/gloves/color/plasmaman/cargo name = "cargo envirogloves" icon_state = "cargoplasma" greyscale_colors = "#bb9042" -/datum/armor/color_plasmaman - bio = 100 - fire = 95 - acid = 95 - /obj/item/clothing/gloves/color/plasmaman/engineer name = "engineering envirogloves" icon_state = "engieplasma" greyscale_colors = "#d75600" siemens_coefficient = 0 -/datum/armor/color_plasmaman - bio = 100 - fire = 95 - acid = 95 - /obj/item/clothing/gloves/color/plasmaman/atmos name = "atmos envirogloves" icon_state = "atmosplasma" greyscale_colors = "#00a5ff" -/datum/armor/color_plasmaman - bio = 100 - fire = 95 - acid = 95 - /obj/item/clothing/gloves/color/plasmaman/explorer name = "explorer envirogloves" icon_state = "explorerplasma" greyscale_colors = "#47453d" -/datum/armor/color_plasmaman - bio = 100 - fire = 95 - acid = 95 - /obj/item/clothing/gloves/color/plasmaman/botanic_leather name = "botany envirogloves" desc = "These leather gloves protect your boney hands against thorns, barbs, prickles, spikes and other harmful objects of floral origin." @@ -115,31 +70,16 @@ greyscale_colors = "#3164ff" clothing_traits = list(TRAIT_PLANT_SAFE) -/datum/armor/color_plasmaman - bio = 100 - fire = 95 - acid = 95 - /obj/item/clothing/gloves/color/plasmaman/prototype name = "prototype envirogloves" icon_state = "protoplasma" greyscale_colors = "#911801" -/datum/armor/color_plasmaman - bio = 100 - fire = 95 - acid = 95 - /obj/item/clothing/gloves/color/plasmaman/clown name = "clown envirogloves" icon_state = "clownplasma" greyscale_colors = "#ff0000" -/datum/armor/color_plasmaman - bio = 100 - fire = 95 - acid = 95 - /obj/item/clothing/gloves/color/plasmaman/head_of_personnel name = "head of personnel's envirogloves" desc = "Covers up those scandalous, bony hands. Appears to be an attempt at making a replica of the captain's gloves." @@ -147,62 +87,32 @@ inhand_icon_state = null greyscale_colors = null -/datum/armor/color_plasmaman - bio = 100 - fire = 95 - acid = 95 - /obj/item/clothing/gloves/color/plasmaman/chief_engineer name = "chief engineer's envirogloves" icon_state = "ceplasma" greyscale_colors = "#45ff00" siemens_coefficient = 0 -/datum/armor/color_plasmaman - bio = 100 - fire = 95 - acid = 95 - /obj/item/clothing/gloves/color/plasmaman/research_director name = "research director's envirogloves" icon_state = "rdplasma" greyscale_colors = "#64008a" -/datum/armor/color_plasmaman - bio = 100 - fire = 95 - acid = 95 - /obj/item/clothing/gloves/color/plasmaman/centcom_commander name = "CentCom commander envirogloves" icon_state = "commanderplasma" greyscale_colors = "#009100" -/datum/armor/color_plasmaman - bio = 100 - fire = 95 - acid = 95 - /obj/item/clothing/gloves/color/plasmaman/centcom_official name = "CentCom official envirogloves" icon_state = "officialplasma" greyscale_colors = "#10af77" -/datum/armor/color_plasmaman - bio = 100 - fire = 95 - acid = 95 - /obj/item/clothing/gloves/color/plasmaman/centcom_intern name = "CentCom intern envirogloves" icon_state = "internplasma" greyscale_colors = "#00974b" -/datum/armor/color_plasmaman - bio = 100 - fire = 95 - acid = 95 - /obj/item/clothing/gloves/color/plasmaman/radio name = "translation envirogloves" desc = "Allows the less vocally-capable plasmamen to use sign language over comms." diff --git a/code/modules/clothing/gloves/tacklers.dm b/code/modules/clothing/gloves/tacklers.dm index ff98ae5d12d..888ecac39ee 100644 --- a/code/modules/clothing/gloves/tacklers.dm +++ b/code/modules/clothing/gloves/tacklers.dm @@ -96,9 +96,6 @@ tackle_speed = 6 skill_mod = 7 -/datum/armor/combat_insulated - bio = 50 - /obj/item/clothing/gloves/tackler/offbrand name = "improvised gripper gloves" desc = "Ratty looking fingerless gloves wrapped with sticky tape. Beware anyone wearing these, for they clearly have no shame and nothing to lose." @@ -110,9 +107,6 @@ min_distance = 2 skill_mod = -1 -/datum/armor/combat_insulated - bio = 50 - /obj/item/clothing/gloves/tackler/football name = "football gloves" desc = "Gloves for football players! Teaches them how to tackle like a pro." diff --git a/code/modules/clothing/head/hardhat.dm b/code/modules/clothing/head/hardhat.dm index 2252a449cf2..eed0f15cf59 100644 --- a/code/modules/clothing/head/hardhat.dm +++ b/code/modules/clothing/head/hardhat.dm @@ -121,17 +121,6 @@ min_cold_protection_temperature = FIRE_HELM_MIN_TEMP_PROTECT flags_cover = HEADCOVERSEYES | HEADCOVERSMOUTH | PEPPERPROOF -/datum/armor/utility_hardhat - melee = 15 - bullet = 5 - laser = 20 - energy = 10 - bomb = 20 - bio = 50 - fire = 100 - acid = 50 - wound = 10 - /obj/item/clothing/head/utility/hardhat/atmos/worn_overlays(mutable_appearance/standing, isinhands, icon_file) . = ..() if(!isinhands) @@ -152,17 +141,6 @@ visor_flags_cover = HEADCOVERSEYES | HEADCOVERSMOUTH | PEPPERPROOF var/visor_sprite_path //SKYRAT EDIT --- Lets the visor not smush the snout -/datum/armor/utility_hardhat - melee = 15 - bullet = 5 - laser = 20 - energy = 10 - bomb = 20 - bio = 50 - fire = 100 - acid = 50 - wound = 10 - /obj/item/clothing/head/utility/hardhat/weldhat/Initialize(mapload) . = ..() update_appearance() @@ -244,17 +222,6 @@ worn_y_offset = 1 dog_fashion = /datum/dog_fashion/head/pumpkin/unlit -/datum/armor/utility_hardhat - melee = 15 - bullet = 5 - laser = 20 - energy = 10 - bomb = 20 - bio = 50 - fire = 100 - acid = 50 - wound = 10 - /obj/item/clothing/head/utility/hardhat/pumpkinhead/set_light_on(new_value) . = ..() if(isnull(.)) @@ -288,17 +255,6 @@ light_color = "#76ff8e" dog_fashion = /datum/dog_fashion/head/blumpkin/unlit -/datum/armor/utility_hardhat - melee = 15 - bullet = 5 - laser = 20 - energy = 10 - bomb = 20 - bio = 50 - fire = 100 - acid = 50 - wound = 10 - /obj/item/clothing/head/utility/hardhat/pumpkinhead/blumpkin/turn_on(mob/user) . = ..() dog_fashion = /datum/dog_fashion/head/blumpkin/lit diff --git a/code/modules/clothing/neck/_neck.dm b/code/modules/clothing/neck/_neck.dm index 6742499d835..cced74a950d 100644 --- a/code/modules/clothing/neck/_neck.dm +++ b/code/modules/clothing/neck/_neck.dm @@ -339,10 +339,6 @@ /// toggles between sell (TRUE) and get price post-fees (FALSE) var/selling = FALSE -/datum/armor/large_scarf_syndie - fire = 50 - acid = 40 - /obj/item/clothing/neck/necklace/dope/merchant/attack_self(mob/user) . = ..() selling = !selling @@ -377,10 +373,6 @@ custom_price = PAYCHECK_CREW * 0.2 custom_materials = (list(/datum/material/plastic = 500)) -/datum/armor/large_scarf_syndie - fire = 50 - acid = 40 - /obj/item/clothing/neck/beads/Initialize(mapload) . = ..() color = color = pick("#ff0077","#d400ff","#2600ff","#00ccff","#00ff2a","#e5ff00","#ffae00","#ff0000", "#ffffff") diff --git a/code/modules/clothing/shoes/costume.dm b/code/modules/clothing/shoes/costume.dm index 7b39acabd7d..64423040ce7 100644 --- a/code/modules/clothing/shoes/costume.dm +++ b/code/modules/clothing/shoes/costume.dm @@ -42,9 +42,6 @@ icon_state = "clockwork_treads" can_be_tied = FALSE -/datum/armor/shoes_roman - bio = 10 - /obj/item/clothing/shoes/bronze/Initialize(mapload) . = ..() AddComponent(/datum/component/squeak, list('sound/machines/clockcult/integration_cog_install.ogg' = 1, 'sound/magic/clockwork/fellowship_armory.ogg' = 1), 50, extrarange = SHORT_RANGE_SOUND_EXTRARANGE) diff --git a/code/modules/clothing/spacesuits/pirate.dm b/code/modules/clothing/spacesuits/pirate.dm index 26ce700efb9..bfc4d056ffc 100644 --- a/code/modules/clothing/spacesuits/pirate.dm +++ b/code/modules/clothing/spacesuits/pirate.dm @@ -21,16 +21,6 @@ icon_state = "spacebandana" inhand_icon_state = "space_bandana_helmet" -/datum/armor/space_pirate - melee = 30 - bullet = 50 - laser = 30 - energy = 40 - bomb = 30 - bio = 30 - fire = 60 - acid = 75 - /obj/item/clothing/suit/space/pirate name = "modified EVA suit" desc = "A modified suit to allow space pirates to board shuttles and stations while avoiding the maw of the void. Comes with additional protection, and is lighter to move in." diff --git a/code/modules/clothing/spacesuits/syndi.dm b/code/modules/clothing/spacesuits/syndi.dm index 7a7ded0c58d..000cb298551 100644 --- a/code/modules/clothing/spacesuits/syndi.dm +++ b/code/modules/clothing/spacesuits/syndi.dm @@ -27,31 +27,11 @@ cell = /obj/item/stock_parts/cell/hyper //Green syndicate space suit -/datum/armor/space_syndicate - melee = 40 - bullet = 50 - laser = 30 - energy = 40 - bomb = 30 - bio = 30 - fire = 80 - acid = 85 - /obj/item/clothing/head/helmet/space/syndicate/green name = "green space helmet" icon_state = "syndicate-helm-green" inhand_icon_state = "space_helmet_syndicate" -/datum/armor/space_syndicate - melee = 40 - bullet = 50 - laser = 30 - energy = 40 - bomb = 30 - bio = 30 - fire = 80 - acid = 85 - /obj/item/clothing/suit/space/syndicate/green name = "green space suit" icon_state = "syndicate-green" @@ -59,31 +39,11 @@ //Dark green syndicate space suit -/datum/armor/space_syndicate - melee = 40 - bullet = 50 - laser = 30 - energy = 40 - bomb = 30 - bio = 30 - fire = 80 - acid = 85 - /obj/item/clothing/head/helmet/space/syndicate/green/dark name = "dark green space helmet" icon_state = "syndicate-helm-green-dark" inhand_icon_state = "syndicate-helm-green-dark" -/datum/armor/space_syndicate - melee = 40 - bullet = 50 - laser = 30 - energy = 40 - bomb = 30 - bio = 30 - fire = 80 - acid = 85 - /obj/item/clothing/suit/space/syndicate/green/dark name = "dark green space suit" icon_state = "syndicate-green-dark" @@ -91,62 +51,22 @@ //Orange syndicate space suit -/datum/armor/space_syndicate - melee = 40 - bullet = 50 - laser = 30 - energy = 40 - bomb = 30 - bio = 30 - fire = 80 - acid = 85 - /obj/item/clothing/head/helmet/space/syndicate/orange name = "orange space helmet" icon_state = "syndicate-helm-orange" inhand_icon_state = "syndicate-helm-orange" -/datum/armor/space_syndicate - melee = 40 - bullet = 50 - laser = 30 - energy = 40 - bomb = 30 - bio = 30 - fire = 80 - acid = 85 - /obj/item/clothing/suit/space/syndicate/orange name = "orange space suit" icon_state = "syndicate-orange" inhand_icon_state = "syndicate-orange" //Blue syndicate space suit -/datum/armor/space_syndicate - melee = 40 - bullet = 50 - laser = 30 - energy = 40 - bomb = 30 - bio = 30 - fire = 80 - acid = 85 - /obj/item/clothing/head/helmet/space/syndicate/blue name = "blue space helmet" icon_state = "syndicate-helm-blue" inhand_icon_state = "syndicate-helm-blue" -/datum/armor/space_syndicate - melee = 40 - bullet = 50 - laser = 30 - energy = 40 - bomb = 30 - bio = 30 - fire = 80 - acid = 85 - /obj/item/clothing/suit/space/syndicate/blue name = "blue space suit" icon_state = "syndicate-blue" @@ -154,31 +74,11 @@ //Black syndicate space suit -/datum/armor/space_syndicate - melee = 40 - bullet = 50 - laser = 30 - energy = 40 - bomb = 30 - bio = 30 - fire = 80 - acid = 85 - /obj/item/clothing/head/helmet/space/syndicate/black name = "black space helmet" icon_state = "syndicate-helm-black" inhand_icon_state = "syndicate-helm-black" -/datum/armor/space_syndicate - melee = 40 - bullet = 50 - laser = 30 - energy = 40 - bomb = 30 - bio = 30 - fire = 80 - acid = 85 - /obj/item/clothing/suit/space/syndicate/black name = "black space suit" icon_state = "syndicate-black" @@ -186,31 +86,11 @@ //Black-green syndicate space suit -/datum/armor/space_syndicate - melee = 40 - bullet = 50 - laser = 30 - energy = 40 - bomb = 30 - bio = 30 - fire = 80 - acid = 85 - /obj/item/clothing/head/helmet/space/syndicate/black/green name = "black space helmet" icon_state = "syndicate-helm-black-green" inhand_icon_state = "syndicate-helm-black-green" -/datum/armor/space_syndicate - melee = 40 - bullet = 50 - laser = 30 - energy = 40 - bomb = 30 - bio = 30 - fire = 80 - acid = 85 - /obj/item/clothing/suit/space/syndicate/black/green name = "black and green space suit" icon_state = "syndicate-black-green" @@ -218,31 +98,11 @@ //Black-blue syndicate space suit -/datum/armor/space_syndicate - melee = 40 - bullet = 50 - laser = 30 - energy = 40 - bomb = 30 - bio = 30 - fire = 80 - acid = 85 - /obj/item/clothing/head/helmet/space/syndicate/black/blue name = "black space helmet" icon_state = "syndicate-helm-black-blue" inhand_icon_state = "syndicate-helm-black-blue" -/datum/armor/space_syndicate - melee = 40 - bullet = 50 - laser = 30 - energy = 40 - bomb = 30 - bio = 30 - fire = 80 - acid = 85 - /obj/item/clothing/suit/space/syndicate/black/blue name = "black and blue space suit" icon_state = "syndicate-black-blue" @@ -250,31 +110,11 @@ //Black medical syndicate space suit -/datum/armor/space_syndicate - melee = 40 - bullet = 50 - laser = 30 - energy = 40 - bomb = 30 - bio = 30 - fire = 80 - acid = 85 - /obj/item/clothing/head/helmet/space/syndicate/black/med name = "black space helmet" icon_state = "syndicate-helm-black-med" inhand_icon_state = "syndicate-helm-black" -/datum/armor/space_syndicate - melee = 40 - bullet = 50 - laser = 30 - energy = 40 - bomb = 30 - bio = 30 - fire = 80 - acid = 85 - /obj/item/clothing/suit/space/syndicate/black/med name = "green space suit" icon_state = "syndicate-black-med" @@ -282,31 +122,11 @@ //Black-orange syndicate space suit -/datum/armor/space_syndicate - melee = 40 - bullet = 50 - laser = 30 - energy = 40 - bomb = 30 - bio = 30 - fire = 80 - acid = 85 - /obj/item/clothing/head/helmet/space/syndicate/black/orange name = "black space helmet" icon_state = "syndicate-helm-black-orange" inhand_icon_state = "syndicate-helm-black" -/datum/armor/space_syndicate - melee = 40 - bullet = 50 - laser = 30 - energy = 40 - bomb = 30 - bio = 30 - fire = 80 - acid = 85 - /obj/item/clothing/suit/space/syndicate/black/orange name = "black and orange space suit" icon_state = "syndicate-black-orange" @@ -314,47 +134,17 @@ //Black-red syndicate space suit -/datum/armor/space_syndicate - melee = 40 - bullet = 50 - laser = 30 - energy = 40 - bomb = 30 - bio = 30 - fire = 80 - acid = 85 - /obj/item/clothing/head/helmet/space/syndicate/black/red name = "black space helmet" icon_state = "syndicate-helm-black-red" inhand_icon_state = "syndicate-helm-black-red" -/datum/armor/space_syndicate - melee = 40 - bullet = 50 - laser = 30 - energy = 40 - bomb = 30 - bio = 30 - fire = 80 - acid = 85 - /obj/item/clothing/suit/space/syndicate/black/red name = "black and red space suit" icon_state = "syndicate-black-red" inhand_icon_state = "syndicate-black-red" //Black-red syndicate contract varient -/datum/armor/space_syndicate - melee = 40 - bullet = 50 - laser = 30 - energy = 40 - bomb = 30 - bio = 30 - fire = 80 - acid = 85 - /obj/item/clothing/head/helmet/space/syndicate/contract name = "contractor helmet" desc = "A specialised black and gold helmet that's more compact than its standard Syndicate counterpart. Can be ultra-compressed into even the tightest of spaces." @@ -362,16 +152,6 @@ icon_state = "syndicate-contract-helm" inhand_icon_state = "contractor_helmet" -/datum/armor/space_syndicate - melee = 40 - bullet = 50 - laser = 30 - energy = 40 - bomb = 30 - bio = 30 - fire = 80 - acid = 85 - /obj/item/clothing/suit/space/syndicate/contract name = "contractor space suit" desc = "A specialised black and gold space suit that's quicker, and more compact than its standard Syndicate counterpart. Can be ultra-compressed into even the tightest of spaces." @@ -381,31 +161,11 @@ inhand_icon_state = null //Black with yellow/red engineering syndicate space suit -/datum/armor/space_syndicate - melee = 40 - bullet = 50 - laser = 30 - energy = 40 - bomb = 30 - bio = 30 - fire = 80 - acid = 85 - /obj/item/clothing/head/helmet/space/syndicate/black/engie name = "black space helmet" icon_state = "syndicate-helm-black-engie" inhand_icon_state = "syndicate-helm-black" -/datum/armor/space_syndicate - melee = 40 - bullet = 50 - laser = 30 - energy = 40 - bomb = 30 - bio = 30 - fire = 80 - acid = 85 - /obj/item/clothing/suit/space/syndicate/black/engie name = "black engineering space suit" icon_state = "syndicate-black-engie" diff --git a/code/modules/clothing/suits/ablativecoat.dm b/code/modules/clothing/suits/ablativecoat.dm index 49a18330b3f..98df168aa56 100644 --- a/code/modules/clothing/suits/ablativecoat.dm +++ b/code/modules/clothing/suits/ablativecoat.dm @@ -36,14 +36,6 @@ equip_delay_other = 40 var/hit_reflect_chance = 50 -/datum/armor/hooded_ablative - melee = 10 - bullet = 10 - laser = 60 - energy = 60 - fire = 100 - acid = 100 - /obj/item/clothing/suit/hooded/ablative/Initialize(mapload) . = ..() allowed = GLOB.security_vest_allowed diff --git a/code/modules/clothing/suits/armor.dm b/code/modules/clothing/suits/armor.dm index 74a93969069..145c337e8ca 100644 --- a/code/modules/clothing/suits/armor.dm +++ b/code/modules/clothing/suits/armor.dm @@ -504,17 +504,6 @@ material_flags = MATERIAL_EFFECTS | MATERIAL_ADD_PREFIX | MATERIAL_COLOR | MATERIAL_AFFECT_STATISTICS//Can change color and add prefix armor_type = /datum/armor/knight_greyscale -/datum/armor/knight_greyscale - melee = 35 - bullet = 10 - laser = 10 - energy = 10 - bomb = 10 - bio = 10 - fire = 40 - acid = 40 - wound = 15 - /obj/item/clothing/suit/armor/vest/durathread name = "durathread vest" desc = "A vest made of durathread with strips of leather acting as trauma plates." diff --git a/code/modules/clothing/suits/chaplainsuits.dm b/code/modules/clothing/suits/chaplainsuits.dm index 30b93e38173..2ec40c5a333 100644 --- a/code/modules/clothing/suits/chaplainsuits.dm +++ b/code/modules/clothing/suits/chaplainsuits.dm @@ -27,15 +27,6 @@ allowed = list(/obj/item/storage/book/bible, /obj/item/nullrod, /obj/item/reagent_containers/cup/glass/bottle/holywater, /obj/item/storage/fancy/candle_box, /obj/item/candle, /obj/item/tank/internals/emergency_oxygen, /obj/item/tank/internals/plasmaman) //Suits -/datum/armor/chaplainsuit_armor - melee = 50 - bullet = 10 - laser = 10 - energy = 10 - fire = 80 - acid = 80 - wound = 20 - /obj/item/clothing/suit/chaplainsuit/holidaypriest name = "holiday priest" desc = "This is a nice holiday, my son." @@ -44,15 +35,6 @@ body_parts_covered = CHEST|GROIN|LEGS|ARMS flags_inv = HIDEJUMPSUIT -/datum/armor/chaplainsuit_armor - melee = 50 - bullet = 10 - laser = 10 - energy = 10 - fire = 80 - acid = 80 - wound = 20 - /obj/item/clothing/suit/chaplainsuit/nun name = "nun robe" desc = "Maximum piety in this star system." @@ -61,15 +43,6 @@ body_parts_covered = CHEST|GROIN|LEGS|ARMS|HANDS flags_inv = HIDEJUMPSUIT -/datum/armor/chaplainsuit_armor - melee = 50 - bullet = 10 - laser = 10 - energy = 10 - fire = 80 - acid = 80 - wound = 20 - /obj/item/clothing/suit/chaplainsuit/bishoprobe name = "bishop's robes" desc = "Glad to see the tithes you collected were well spent." @@ -78,15 +51,6 @@ body_parts_covered = CHEST|GROIN|LEGS|ARMS flags_inv = HIDEJUMPSUIT -/datum/armor/chaplainsuit_armor - melee = 50 - bullet = 10 - laser = 10 - energy = 10 - fire = 80 - acid = 80 - wound = 20 - /obj/item/clothing/suit/chaplainsuit/armor/studentuni name = "student robe" desc = "The uniform of a bygone institute of learning." @@ -94,15 +58,6 @@ inhand_icon_state = null body_parts_covered = ARMS|CHEST -/datum/armor/chaplainsuit_armor - melee = 50 - bullet = 10 - laser = 10 - energy = 10 - fire = 80 - acid = 80 - wound = 20 - /obj/item/clothing/suit/chaplainsuit/armor/witchhunter name = "witchunter garb" desc = "This worn outfit saw much use back in the day." @@ -110,15 +65,6 @@ inhand_icon_state = null body_parts_covered = CHEST|GROIN|LEGS|ARMS -/datum/armor/chaplainsuit_armor - melee = 50 - bullet = 10 - laser = 10 - energy = 10 - fire = 80 - acid = 80 - wound = 20 - /obj/item/clothing/suit/hooded/chaplainsuit/monkhabit name = "monk's habit" desc = "A few steps above rended sackcloth." @@ -129,15 +75,6 @@ body_parts_covered = CHEST|GROIN|LEGS|ARMS hoodtype = /obj/item/clothing/head/hooded/monkhabit -/datum/armor/chaplainsuit_armor - melee = 50 - bullet = 10 - laser = 10 - energy = 10 - fire = 80 - acid = 80 - wound = 20 - /obj/item/clothing/head/hooded/monkhabit name = "monk's hood" desc = "For when a man wants to cover up his tonsure." @@ -148,15 +85,6 @@ body_parts_covered = HEAD flags_inv = HIDEHAIR|HIDEEARS -/datum/armor/chaplainsuit_armor - melee = 50 - bullet = 10 - laser = 10 - energy = 10 - fire = 80 - acid = 80 - wound = 20 - /obj/item/clothing/suit/chaplainsuit/monkrobeeast name = "eastern monk's robes" desc = "Best combined with a shaved head." @@ -165,15 +93,6 @@ body_parts_covered = GROIN|LEGS flags_inv = HIDEJUMPSUIT -/datum/armor/chaplainsuit_armor - melee = 50 - bullet = 10 - laser = 10 - energy = 10 - fire = 80 - acid = 80 - wound = 20 - /obj/item/clothing/suit/chaplainsuit/whiterobe name = "white robe" desc = "Good for clerics and sleepy crewmembers." @@ -182,15 +101,6 @@ body_parts_covered = CHEST|GROIN|LEGS|ARMS flags_inv = HIDEJUMPSUIT -/datum/armor/chaplainsuit_armor - melee = 50 - bullet = 10 - laser = 10 - energy = 10 - fire = 80 - acid = 80 - wound = 20 - /obj/item/clothing/suit/chaplainsuit/clownpriest name = "Robes of the Honkmother" desc = "Meant for a clown of the cloth." @@ -200,15 +110,6 @@ flags_inv = HIDEJUMPSUIT allowed = list(/obj/item/megaphone/clown, /obj/item/soap, /obj/item/food/pie/cream, /obj/item/bikehorn, /obj/item/bikehorn/golden, /obj/item/bikehorn/airhorn, /obj/item/instrument/bikehorn, /obj/item/reagent_containers/cup/soda_cans/canned_laughter, /obj/item/toy/crayon, /obj/item/toy/crayon/spraycan, /obj/item/toy/crayon/spraycan/lubecan, /obj/item/grown/bananapeel, /obj/item/food/grown/banana) -/datum/armor/chaplainsuit_armor - melee = 50 - bullet = 10 - laser = 10 - energy = 10 - fire = 80 - acid = 80 - wound = 20 - /obj/item/clothing/head/helmet/chaplain/clock name = "forgotten helmet" desc = "It has the unyielding gaze of a god eternally forgotten." @@ -237,14 +138,6 @@ slowdown = 0 clothing_flags = NONE -/datum/armor/chaplain_clock - melee = 50 - bullet = 10 - laser = 10 - energy = 10 - fire = 80 - acid = 80 - /obj/item/clothing/head/helmet/chaplain name = "crusader helmet" desc = "Deus Vult." @@ -275,14 +168,6 @@ slowdown = 0 clothing_flags = NONE -/datum/armor/helmet_chaplain - melee = 50 - bullet = 10 - laser = 10 - energy = 10 - fire = 80 - acid = 80 - /obj/item/clothing/head/helmet/chaplain/cage name = "cage" desc = "A cage that restrains the will of the self, allowing one to see the profane world for what it is." @@ -291,42 +176,18 @@ inhand_icon_state = null worn_y_offset = 7 -/datum/armor/helmet_chaplain - melee = 50 - bullet = 10 - laser = 10 - energy = 10 - fire = 80 - acid = 80 - /obj/item/clothing/head/helmet/chaplain/ancient name = "ancient helmet" desc = "None may pass!" icon_state = "knight_ancient" inhand_icon_state = null -/datum/armor/helmet_chaplain - melee = 50 - bullet = 10 - laser = 10 - energy = 10 - fire = 80 - acid = 80 - /obj/item/clothing/suit/chaplainsuit/armor/ancient name = "ancient armour" desc = "Defend the treasure..." icon_state = "knight_ancient" inhand_icon_state = null -/datum/armor/helmet_chaplain - melee = 50 - bullet = 10 - laser = 10 - energy = 10 - fire = 80 - acid = 80 - /obj/item/clothing/head/helmet/chaplain/witchunter_hat name = "witchunter hat" desc = "This hat saw much use back in the day." @@ -335,14 +196,6 @@ flags_cover = HEADCOVERSEYES flags_inv = HIDEEYES -/datum/armor/helmet_chaplain - melee = 50 - bullet = 10 - laser = 10 - energy = 10 - fire = 80 - acid = 80 - /obj/item/clothing/head/helmet/chaplain/adept name = "adept hood" desc = "Its only heretical when others do it." @@ -351,28 +204,12 @@ flags_cover = HEADCOVERSEYES flags_inv = HIDEHAIR|HIDEFACE|HIDEEARS -/datum/armor/helmet_chaplain - melee = 50 - bullet = 10 - laser = 10 - energy = 10 - fire = 80 - acid = 80 - /obj/item/clothing/suit/chaplainsuit/armor/adept name = "adept robes" desc = "The ideal outfit for burning the unfaithful." icon_state = "crusader" inhand_icon_state = null -/datum/armor/helmet_chaplain - melee = 50 - bullet = 10 - laser = 10 - energy = 10 - fire = 80 - acid = 80 - /obj/item/clothing/suit/chaplainsuit/armor/crusader name = "Crusader's Armour" desc = "Armour that's comprised of metal and cloth." @@ -394,27 +231,9 @@ /obj/item/clothing/suit/chaplainsuit/armor/crusader/red icon_state = "crusader-red" -/datum/armor/armor_crusader - melee = 50 - bullet = 50 - laser = 50 - energy = 50 - bomb = 60 - fire = 60 - acid = 60 - /obj/item/clothing/suit/chaplainsuit/armor/crusader/blue icon_state = "crusader-blue" -/datum/armor/armor_crusader - melee = 50 - bullet = 50 - laser = 50 - energy = 50 - bomb = 60 - fire = 60 - acid = 60 - /obj/item/clothing/suit/hooded/chaplain_hoodie name = "follower hoodie" desc = "Hoodie made for acolytes of the chaplain." @@ -426,15 +245,6 @@ allowed = list(/obj/item/storage/book/bible, /obj/item/nullrod, /obj/item/reagent_containers/cup/glass/bottle/holywater, /obj/item/storage/fancy/candle_box, /obj/item/candle, /obj/item/tank/internals/emergency_oxygen, /obj/item/tank/internals/plasmaman) hoodtype = /obj/item/clothing/head/hooded/chaplain_hood -/datum/armor/armor_crusader - melee = 50 - bullet = 50 - laser = 50 - energy = 50 - bomb = 60 - fire = 60 - acid = 60 - /obj/item/clothing/head/hooded/chaplain_hood name = "follower hood" desc = "Hood made for acolytes of the chaplain." @@ -444,15 +254,6 @@ body_parts_covered = HEAD flags_inv = HIDEHAIR|HIDEFACE|HIDEEARS -/datum/armor/armor_crusader - melee = 50 - bullet = 50 - laser = 50 - energy = 50 - bomb = 60 - fire = 60 - acid = 60 - /obj/item/clothing/suit/hooded/chaplain_hoodie/leader name = "leader hoodie" desc = "Now you're ready for some 50 dollar bling water." @@ -460,29 +261,11 @@ inhand_icon_state = null hoodtype = /obj/item/clothing/head/hooded/chaplain_hood/leader -/datum/armor/armor_crusader - melee = 50 - bullet = 50 - laser = 50 - energy = 50 - bomb = 60 - fire = 60 - acid = 60 - /obj/item/clothing/head/hooded/chaplain_hood/leader name = "leader hood" desc = "I mean, you don't /have/ to seek bling water. I just think you should." icon_state = "chaplain_hood_leader" -/datum/armor/armor_crusader - melee = 50 - bullet = 50 - laser = 50 - energy = 50 - bomb = 60 - fire = 60 - acid = 60 - /obj/item/clothing/suit/chaplainsuit/shrinehand name = "shrinehand robe" desc = "Won't help you communicate with spirits, but you'll certainly look the part." diff --git a/code/modules/clothing/suits/costume.dm b/code/modules/clothing/suits/costume.dm index fcb2228efd5..aef6b5b9a58 100644 --- a/code/modules/clothing/suits/costume.dm +++ b/code/modules/clothing/suits/costume.dm @@ -35,16 +35,6 @@ strip_delay = 40 equip_delay_other = 20 -/datum/armor/pirate_armored - melee = 30 - bullet = 50 - laser = 30 - energy = 40 - bomb = 30 - bio = 30 - fire = 60 - acid = 75 - /obj/item/clothing/suit/costume/pirate/captain name = "pirate captain coat" desc = "Yarr." @@ -56,16 +46,6 @@ strip_delay = 40 equip_delay_other = 20 -/datum/armor/pirate_armored - melee = 30 - bullet = 50 - laser = 30 - energy = 40 - bomb = 30 - bio = 30 - fire = 60 - acid = 75 - /obj/item/clothing/suit/costume/cyborg_suit name = "cyborg suit" desc = "Suit for a cyborg costume." @@ -495,14 +475,6 @@ icon_state = "clockwork_cuirass_old" armor_type = /datum/armor/costume_bronze -/datum/armor/costume_bronze - melee = 5 - laser = -5 - energy = -15 - bomb = 10 - fire = 20 - acid = 20 - /obj/item/clothing/suit/hooded/mysticrobe name = "mystic's robe" desc = "Wearing this makes you feel more attuned with the nature of the universe... as well as a bit more irresponsible. " diff --git a/code/modules/clothing/suits/jacket.dm b/code/modules/clothing/suits/jacket.dm index f527fc61de1..d441db0efad 100644 --- a/code/modules/clothing/suits/jacket.dm +++ b/code/modules/clothing/suits/jacket.dm @@ -91,9 +91,6 @@ inhand_icon_state = null allowed = list(/obj/item/flashlight, /obj/item/tank/internals/emergency_oxygen, /obj/item/tank/internals/plasmaman, /obj/item/toy, /obj/item/storage/fancy/cigarettes, /obj/item/lighter, /obj/item/gun/ballistic/automatic/pistol, /obj/item/gun/ballistic/revolver, /obj/item/radio) -/datum/armor/puffer_vest - bio = 30 - /obj/item/clothing/suit/jacket/letterman name = "letterman jacket" desc = "A classic brown letterman jacket. Looks pretty hot and heavy." @@ -101,9 +98,6 @@ inhand_icon_state = null species_exception = list(/datum/species/golem) -/datum/armor/puffer_vest - bio = 30 - /obj/item/clothing/suit/jacket/letterman_red name = "red letterman jacket" desc = "A letterman jacket in a sick red color. Radical." @@ -111,9 +105,6 @@ inhand_icon_state = null species_exception = list(/datum/species/golem) -/datum/armor/puffer_vest - bio = 30 - /obj/item/clothing/suit/jacket/letterman_syndie name = "blood-red letterman jacket" desc = "Oddly, this jacket seems to have a large S on the back..." @@ -121,9 +112,6 @@ inhand_icon_state = null species_exception = list(/datum/species/golem) -/datum/armor/puffer_vest - bio = 30 - /obj/item/clothing/suit/jacket/letterman_nanotrasen name = "blue letterman jacket" desc = "A blue letterman jacket with a proud Nanotrasen N on the back. The tag says that it was made in Space China." diff --git a/code/modules/clothing/suits/labcoat.dm b/code/modules/clothing/suits/labcoat.dm index a5a3d669045..e04da705b22 100644 --- a/code/modules/clothing/suits/labcoat.dm +++ b/code/modules/clothing/suits/labcoat.dm @@ -80,11 +80,6 @@ desc = "A suit that protects against minor chemical spills. Has an orange stripe on the shoulder." icon_state = "labcoat_chem" -/datum/armor/toggle_labcoat - bio = 50 - fire = 50 - acid = 50 - /obj/item/clothing/suit/toggle/labcoat/chemist/Initialize(mapload) . = ..() allowed += /obj/item/storage/bag/chemistry @@ -94,11 +89,6 @@ desc = "A suit that protects against minor chemical spills. Has a green stripe on the shoulder." icon_state = "labcoat_vir" -/datum/armor/toggle_labcoat - bio = 50 - fire = 50 - acid = 50 - /obj/item/clothing/suit/toggle/labcoat/virologist/Initialize(mapload) . = ..() allowed += /obj/item/storage/bag/bio @@ -108,11 +98,6 @@ desc = "A suit that protects against minor chemical spills. Has a purple stripe on the shoulder." icon_state = "labcoat_sci" -/datum/armor/toggle_labcoat - bio = 50 - fire = 50 - acid = 50 - /obj/item/clothing/suit/toggle/labcoat/science/Initialize(mapload) . = ..() allowed += /obj/item/storage/bag/xeno diff --git a/code/modules/clothing/suits/reactive_armour.dm b/code/modules/clothing/suits/reactive_armour.dm index ee1c379b92d..39190066b52 100644 --- a/code/modules/clothing/suits/reactive_armour.dm +++ b/code/modules/clothing/suits/reactive_armour.dm @@ -122,10 +122,6 @@ reactivearmor_cooldown_duration = 10 SECONDS var/tele_range = 6 -/datum/armor/armor_reactive - fire = 100 - acid = 100 - /obj/item/clothing/suit/armor/reactive/teleport/reactive_activation(mob/living/carbon/human/owner, atom/movable/hitby, attack_text = "the attack", final_block_chance = 0, damage = 0, attack_type = MELEE_ATTACK) owner.visible_message(span_danger("The reactive teleport system flings [owner] clear of [attack_text]!")) playsound(get_turf(owner),'sound/magic/blink.ogg', 100, TRUE) @@ -150,10 +146,6 @@ cooldown_message = span_danger("The reactive incendiary armor activates, but fails to send out flames as it is still recharging its flame jets!") emp_message = span_warning("The reactive incendiary armor's targeting system begins rebooting...") -/datum/armor/armor_reactive - fire = 100 - acid = 100 - /obj/item/clothing/suit/armor/reactive/fire/reactive_activation(mob/living/carbon/human/owner, atom/movable/hitby, attack_text = "the attack", final_block_chance = 0, damage = 0, attack_type = MELEE_ATTACK) owner.visible_message(span_danger("[src] blocks [attack_text], sending out jets of flame!")) playsound(get_turf(owner),'sound/magic/fireball.ogg', 100, TRUE) @@ -190,10 +182,6 @@ var/animation_time = 2 SECONDS var/in_stealth = FALSE -/datum/armor/armor_reactive - fire = 100 - acid = 100 - /obj/item/clothing/suit/armor/reactive/stealth/cooldown_activation(mob/living/carbon/human/owner) if(in_stealth) return //we don't want the cooldown message either) @@ -243,10 +231,6 @@ /// What flags do we pass to the zaps we give off? var/zap_flags = ZAP_MOB_DAMAGE | ZAP_OBJ_DAMAGE -/datum/armor/armor_reactive - fire = 100 - acid = 100 - /obj/item/clothing/suit/armor/reactive/tesla/cooldown_activation(mob/living/carbon/human/owner) var/datum/effect_system/spark_spread/sparks = new /datum/effect_system/spark_spread sparks.set_up(1, 1, src) @@ -276,10 +260,6 @@ emp_message = span_warning("The repulse generator is reset to default settings...") var/repulse_force = MOVE_FORCE_EXTREMELY_STRONG -/datum/armor/armor_reactive - fire = 100 - acid = 100 - /obj/item/clothing/suit/armor/reactive/repulse/reactive_activation(mob/living/carbon/human/owner, atom/movable/hitby, attack_text = "the attack", final_block_chance = 0, damage = 0, attack_type = MELEE_ATTACK) playsound(get_turf(owner),'sound/magic/repulse.ogg', 100, TRUE) owner.visible_message(span_danger("[src] blocks [attack_text], converting the attack into a wave of force!")) @@ -316,10 +296,6 @@ emp_message = span_danger("The reactive table armor's fabricators click and whirr ominously for a moment...") var/tele_range = 10 -/datum/armor/armor_reactive - fire = 100 - acid = 100 - /obj/item/clothing/suit/armor/reactive/table/reactive_activation(mob/living/carbon/human/owner, atom/movable/hitby, attack_text = "the attack", final_block_chance = 0, damage = 0, attack_type = MELEE_ATTACK) owner.visible_message(span_danger("The reactive teleport system flings [owner] clear of [attack_text] and slams [owner.p_them()] into a fabricated table!")) owner.visible_message("[owner] GOES ON THE TABLE!!!") @@ -352,10 +328,6 @@ emp_message = span_warning("You feel the backsurge of a mind pulse.") clothing_traits = list(TRAIT_MADNESS_IMMUNE) -/datum/armor/armor_reactive - fire = 100 - acid = 100 - /obj/item/clothing/suit/armor/reactive/hallucinating/cooldown_activation(mob/living/carbon/human/owner) var/datum/effect_system/spark_spread/sparks = new /datum/effect_system/spark_spread sparks.set_up(1, 1, src) @@ -396,10 +368,6 @@ var/static/list/l_legs var/static/list/r_legs -/datum/armor/armor_reactive - fire = 100 - acid = 100 - /obj/item/clothing/suit/armor/reactive/bioscrambling/Initialize(mapload) . = ..() if(!chests) @@ -469,10 +437,6 @@ cooldown_message = span_danger("The reactive barrier system is still recharging! It fails to activate!") reactivearmor_cooldown_duration = 10 SECONDS -/datum/armor/armor_reactive - fire = 100 - acid = 100 - /obj/item/clothing/suit/armor/reactive/barricade/reactive_activation(mob/living/carbon/human/owner, atom/movable/hitby, attack_text = "the attack", final_block_chance = 0, damage = 0, attack_type = MELEE_ATTACK) playsound(get_turf(owner),'sound/magic/repulse.ogg', 100, TRUE) owner.visible_message(span_danger("The reactive armor interposes matter from another world between [src] and [attack_text]!")) diff --git a/code/modules/clothing/suits/wintercoats.dm b/code/modules/clothing/suits/wintercoats.dm index 96e6c0bca92..64ecc0b5c18 100644 --- a/code/modules/clothing/suits/wintercoats.dm +++ b/code/modules/clothing/suits/wintercoats.dm @@ -326,11 +326,6 @@ armor_type = /datum/armor/medical_cmo // Chemist -/datum/armor/medical_cmo - bio = 50 - fire = 20 - acid = 30 - /obj/item/clothing/suit/hooded/wintercoat/medical/chemistry name = "chemistry winter coat" desc = "A lab-grade winter coat made with acid resistant polymers. For the enterprising chemist who was exiled to a frozen wasteland on the go." @@ -435,10 +430,6 @@ armor_type = /datum/armor/science_rd // Roboticist -/datum/armor/science_rd - bomb = 20 - fire = 30 - /obj/item/clothing/suit/hooded/wintercoat/science/robotics name = "robotics winter coat" desc = "A black winter coat with a badass flaming robotic skull for the zipper tab. This one has bright red designs and a few useless buttons." @@ -526,10 +517,6 @@ armor_type = /datum/armor/engineering_ce // Atmospherics Technician -/datum/armor/engineering_ce - fire = 30 - acid = 10 - /obj/item/clothing/suit/hooded/wintercoat/engineering/atmos name = "atmospherics winter coat" desc = "A yellow and blue winter coat. The zipper pull-tab is made to look like a miniature breath mask." diff --git a/code/modules/clothing/under/_under.dm b/code/modules/clothing/under/_under.dm index 5c8de11bb68..09bbc59a166 100644 --- a/code/modules/clothing/under/_under.dm +++ b/code/modules/clothing/under/_under.dm @@ -365,10 +365,6 @@ /obj/item/clothing/under/rank dying_key = DYE_REGISTRY_UNDER -/datum/armor/clothing_under - bio = 10 - wound = 5 - /obj/item/clothing/under/proc/dump_attachment() if(!attached_accessory) return diff --git a/code/modules/clothing/under/costume.dm b/code/modules/clothing/under/costume.dm index 9e3a3e06fb5..55778bba1e2 100644 --- a/code/modules/clothing/under/costume.dm +++ b/code/modules/clothing/under/costume.dm @@ -268,12 +268,6 @@ species_exception = list(/datum/species/golem) can_adjust = FALSE -/datum/armor/costume_russian_officer - melee = 10 - bio = 10 - fire = 30 - acid = 30 - /obj/item/clothing/under/costume/buttondown/slacks name = "buttondown shirt with slacks" desc = "A fancy buttondown shirt with slacks." @@ -284,12 +278,6 @@ greyscale_colors = "#EEEEEE#EE8E2E#222227#D8D39C" flags_1 = IS_PLAYER_COLORABLE_1 -/datum/armor/costume_russian_officer - melee = 10 - bio = 10 - fire = 30 - acid = 30 - /obj/item/clothing/under/costume/buttondown/shorts name = "buttondown shirt with shorts" desc = "A fancy buttondown shirt with shorts." @@ -300,12 +288,6 @@ greyscale_colors = "#EEEEEE#EE8E2E#222227#D8D39C" flags_1 = IS_PLAYER_COLORABLE_1 -/datum/armor/costume_russian_officer - melee = 10 - bio = 10 - fire = 30 - acid = 30 - /obj/item/clothing/under/costume/jackbros name = "jack bros outfit" desc = "For when it's time to hee some hos." @@ -313,24 +295,12 @@ inhand_icon_state = null can_adjust = FALSE -/datum/armor/costume_russian_officer - melee = 10 - bio = 10 - fire = 30 - acid = 30 - /obj/item/clothing/under/costume/deckers name = "deckers outfit" icon_state = "decker_jumpsuit" inhand_icon_state = null can_adjust = FALSE -/datum/armor/costume_russian_officer - melee = 10 - bio = 10 - fire = 30 - acid = 30 - /obj/item/clothing/under/costume/football_suit name = "football uniform" icon_state = "football_suit" @@ -341,12 +311,6 @@ greyscale_colors = "#D74722" flags_1 = IS_PLAYER_COLORABLE_1 -/datum/armor/costume_russian_officer - melee = 10 - bio = 10 - fire = 30 - acid = 30 - /obj/item/clothing/under/costume/swagoutfit name = "Swag outfit" desc = "Why don't you go secure some bitches?" @@ -354,12 +318,6 @@ inhand_icon_state = null can_adjust = FALSE -/datum/armor/costume_russian_officer - melee = 10 - bio = 10 - fire = 30 - acid = 30 - /obj/item/clothing/under/costume/referee name = "referee uniform" desc = "A standard black and white striped uniform to signal authority." @@ -367,36 +325,18 @@ inhand_icon_state = null can_adjust = FALSE -/datum/armor/costume_russian_officer - melee = 10 - bio = 10 - fire = 30 - acid = 30 - /obj/item/clothing/under/costume/joker name = "comedian suit" desc = "The worst part of having a mental illness is people expect you to behave as if you don't." icon_state = "joker" can_adjust = FALSE -/datum/armor/costume_russian_officer - melee = 10 - bio = 10 - fire = 30 - acid = 30 - /obj/item/clothing/under/costume/yuri name = "yuri initiate jumpsuit" icon_state = "yuri_uniform" inhand_icon_state = null can_adjust = FALSE -/datum/armor/costume_russian_officer - melee = 10 - bio = 10 - fire = 30 - acid = 30 - /obj/item/clothing/under/costume/dutch name = "dutch's suit" desc = "You can feel a god damn plan coming on." @@ -404,24 +344,12 @@ inhand_icon_state = null can_adjust = FALSE -/datum/armor/costume_russian_officer - melee = 10 - bio = 10 - fire = 30 - acid = 30 - /obj/item/clothing/under/costume/osi name = "O.S.I. jumpsuit" icon_state = "osi_jumpsuit" inhand_icon_state = null can_adjust = FALSE -/datum/armor/costume_russian_officer - melee = 10 - bio = 10 - fire = 30 - acid = 30 - /obj/item/clothing/under/costume/tmc name = "Lost MC clothing" icon_state = "tmc_jumpsuit" diff --git a/code/modules/clothing/under/jobs/Plasmaman/civilian_service.dm b/code/modules/clothing/under/jobs/Plasmaman/civilian_service.dm index a96c987957c..52a85cf31cf 100644 --- a/code/modules/clothing/under/jobs/Plasmaman/civilian_service.dm +++ b/code/modules/clothing/under/jobs/Plasmaman/civilian_service.dm @@ -124,11 +124,6 @@ sensor_mode = SENSOR_COORDS random_sensor = FALSE -/datum/armor/under_plasmaman - bio = 100 - fire = 95 - acid = 95 - /obj/item/clothing/under/plasmaman/clown/Extinguish(mob/living/carbon/human/H) if(!istype(H)) return diff --git a/code/modules/clothing/under/jobs/Plasmaman/command.dm b/code/modules/clothing/under/jobs/Plasmaman/command.dm index 7f5765b47d0..c3b92bc874b 100644 --- a/code/modules/clothing/under/jobs/Plasmaman/command.dm +++ b/code/modules/clothing/under/jobs/Plasmaman/command.dm @@ -28,13 +28,6 @@ sensor_mode = SENSOR_COORDS random_sensor = FALSE -/datum/armor/security_head_of_security - melee = 10 - bio = 100 - fire = 95 - acid = 95 - wound = 10 - /obj/item/clothing/under/plasmaman/chief_engineer name = "chief engineer's plasma envirosuit" desc = "An air-tight suit designed to be used by plasmamen insane enough to achieve the rank of \"Chief Engineer\"." diff --git a/code/modules/clothing/under/jobs/command.dm b/code/modules/clothing/under/jobs/command.dm index c51b257e5bf..087cf57cdd9 100644 --- a/code/modules/clothing/under/jobs/command.dm +++ b/code/modules/clothing/under/jobs/command.dm @@ -23,10 +23,6 @@ female_sprite_flags = FEMALE_UNIFORM_TOP_ONLY supports_variations_flags = CLOTHING_DIGITIGRADE_VARIATION_NO_NEW_ICON -/datum/armor/rank_captain - bio = 10 - wound = 15 - /obj/item/clothing/under/rank/captain/suit name = "captain's suit" desc = "A green suit and yellow necktie. Exemplifies authority." @@ -34,10 +30,6 @@ inhand_icon_state = "dg_suit" can_adjust = FALSE -/datum/armor/rank_captain - bio = 10 - wound = 15 - /obj/item/clothing/under/rank/captain/suit/skirt name = "green suitskirt" desc = "A green suitskirt and yellow necktie. Exemplifies authority." @@ -48,10 +40,6 @@ female_sprite_flags = FEMALE_UNIFORM_TOP_ONLY supports_variations_flags = CLOTHING_DIGITIGRADE_VARIATION_NO_NEW_ICON -/datum/armor/rank_captain - bio = 10 - wound = 15 - /obj/item/clothing/under/rank/captain/parade name = "captain's formal uniform" desc = "A captain's luxury-wear, for special occasions." diff --git a/code/modules/clothing/under/jobs/engineering.dm b/code/modules/clothing/under/jobs/engineering.dm index 3760a1003a2..b99e3fc90ec 100644 --- a/code/modules/clothing/under/jobs/engineering.dm +++ b/code/modules/clothing/under/jobs/engineering.dm @@ -33,22 +33,12 @@ female_sprite_flags = FEMALE_UNIFORM_TOP_ONLY supports_variations_flags = CLOTHING_DIGITIGRADE_VARIATION_NO_NEW_ICON -/datum/armor/engineering_chief_engineer - bio = 10 - fire = 80 - acid = 40 - /obj/item/clothing/under/rank/engineering/atmospheric_technician desc = "It's a jumpsuit worn by atmospheric technicians. Made from fire resistant materials." name = "atmospheric technician's jumpsuit" icon_state = "atmos" inhand_icon_state = "atmos_suit" -/datum/armor/engineering_chief_engineer - bio = 10 - fire = 80 - acid = 40 - /obj/item/clothing/under/rank/engineering/atmospheric_technician/skirt name = "atmospheric technician's jumpskirt" desc = "It's a jumpskirt worn by atmospheric technicians. Made from fire resistant materials." @@ -59,11 +49,6 @@ female_sprite_flags = FEMALE_UNIFORM_TOP_ONLY supports_variations_flags = CLOTHING_DIGITIGRADE_VARIATION_NO_NEW_ICON -/datum/armor/engineering_chief_engineer - bio = 10 - fire = 80 - acid = 40 - /obj/item/clothing/under/rank/engineering/engineer desc = "It's an orange high visibility jumpsuit worn by engineers. Made from fire resistant materials." name = "engineer's jumpsuit" @@ -71,11 +56,6 @@ inhand_icon_state = "engi_suit" species_exception = list(/datum/species/golem/uranium) -/datum/armor/engineering_chief_engineer - bio = 10 - fire = 80 - acid = 40 - /obj/item/clothing/under/rank/engineering/engineer/hazard name = "engineer's hazard jumpsuit" desc = "A high visibility jumpsuit. Made from fire resistant materials." @@ -83,11 +63,6 @@ inhand_icon_state = "syndicate-orange" alt_covers_chest = TRUE -/datum/armor/engineering_chief_engineer - bio = 10 - fire = 80 - acid = 40 - /obj/item/clothing/under/rank/engineering/engineer/skirt name = "engineer's jumpskirt" desc = "It's an orange high visibility jumpskirt worn by engineers. Made from fire resistant materials." diff --git a/code/modules/clothing/under/jobs/medical.dm b/code/modules/clothing/under/jobs/medical.dm index 79224669e98..4014814ee23 100644 --- a/code/modules/clothing/under/jobs/medical.dm +++ b/code/modules/clothing/under/jobs/medical.dm @@ -12,9 +12,6 @@ icon_state = "medical" inhand_icon_state = "w_suit" -/datum/armor/rank_medical - bio = 50 - /obj/item/clothing/under/rank/medical/doctor/skirt name = "medical doctor's jumpskirt" desc = "It's made of a special fiber that provides minor protection against biohazards. It has a cross on the chest denoting that the wearer is trained medical personnel." @@ -25,18 +22,12 @@ female_sprite_flags = FEMALE_UNIFORM_TOP_ONLY supports_variations_flags = CLOTHING_DIGITIGRADE_VARIATION_NO_NEW_ICON -/datum/armor/rank_medical - bio = 50 - /obj/item/clothing/under/rank/medical/chief_medical_officer desc = "It's a jumpsuit worn by those with the experience to be \"Chief Medical Officer\". It provides minor biological protection." name = "chief medical officer's jumpsuit" icon_state = "cmo" inhand_icon_state = "w_suit" -/datum/armor/rank_medical - bio = 50 - /obj/item/clothing/under/rank/medical/chief_medical_officer/skirt name = "chief medical officer's jumpskirt" desc = "It's a jumpskirt worn by those with the experience to be \"Chief Medical Officer\". It provides minor biological protection." @@ -47,18 +38,12 @@ female_sprite_flags = FEMALE_UNIFORM_TOP_ONLY supports_variations_flags = CLOTHING_DIGITIGRADE_VARIATION_NO_NEW_ICON -/datum/armor/rank_medical - bio = 50 - /obj/item/clothing/under/rank/medical/chief_medical_officer/scrubs name = "chief medical officer's scrubs" desc = "A distinctive set of white and turquoise scrubs given to chief medical officers who desire a clinical look." icon_state = "scrubscmo" inhand_icon_state = "w_suit" -/datum/armor/rank_medical - bio = 50 - /obj/item/clothing/under/rank/medical/chief_medical_officer/turtleneck name = "chief medical officer's turtleneck" desc = "A light blue turtleneck and tan khakis, for a chief medical officer with a superior sense of style." @@ -68,9 +53,6 @@ alt_covers_chest = TRUE female_sprite_flags = FEMALE_UNIFORM_TOP_ONLY -/datum/armor/rank_medical - bio = 50 - /obj/item/clothing/under/rank/medical/chief_medical_officer/turtleneck/skirt name = "chief medical officer's turtleneck skirt" desc = "A light blue turtleneck and tan khaki skirt, for a chief medical officer with a superior sense of style." @@ -81,18 +63,12 @@ female_sprite_flags = FEMALE_UNIFORM_TOP_ONLY supports_variations_flags = CLOTHING_DIGITIGRADE_VARIATION_NO_NEW_ICON -/datum/armor/rank_medical - bio = 50 - /obj/item/clothing/under/rank/medical/virologist desc = "It's made of a special fiber that gives special protection against biohazards. It has a virologist rank stripe on it." name = "virologist's jumpsuit" icon_state = "virology" inhand_icon_state = "w_suit" -/datum/armor/rank_medical - bio = 50 - /obj/item/clothing/under/rank/medical/virologist/skirt name = "virologist's jumpskirt" desc = "It's made of a special fiber that gives special protection against biohazards. It has a virologist rank stripe on it." @@ -103,36 +79,21 @@ female_sprite_flags = FEMALE_UNIFORM_TOP_ONLY supports_variations_flags = CLOTHING_DIGITIGRADE_VARIATION_NO_NEW_ICON -/datum/armor/rank_medical - bio = 50 - /obj/item/clothing/under/rank/medical/scrubs name = "medical scrubs" -/datum/armor/rank_medical - bio = 50 - /obj/item/clothing/under/rank/medical/scrubs/blue desc = "It's made of a special fiber that provides minor protection against biohazards. This one is in baby blue." icon_state = "scrubsblue" -/datum/armor/rank_medical - bio = 50 - /obj/item/clothing/under/rank/medical/scrubs/green desc = "It's made of a special fiber that provides minor protection against biohazards. This one is in dark green." icon_state = "scrubsgreen" -/datum/armor/rank_medical - bio = 50 - /obj/item/clothing/under/rank/medical/scrubs/purple desc = "It's made of a special fiber that provides minor protection against biohazards. This one is in deep purple." icon_state = "scrubswine" -/datum/armor/rank_medical - bio = 50 - /obj/item/clothing/under/rank/medical/chemist desc = "It's made of a special fiber that gives special protection against biohazards. It has a chemist rank stripe on it." name = "chemist's jumpsuit" @@ -155,22 +116,12 @@ female_sprite_flags = FEMALE_UNIFORM_TOP_ONLY supports_variations_flags = CLOTHING_DIGITIGRADE_VARIATION_NO_NEW_ICON -/datum/armor/medical_chemist - bio = 10 - fire = 50 - acid = 65 - /obj/item/clothing/under/rank/medical/paramedic desc = "It's made of a special fiber that provides minor protection against biohazards. It has a dark blue cross on the chest denoting that the wearer is a trained paramedic." name = "paramedic jumpsuit" icon_state = "paramedic" inhand_icon_state = "w_suit" -/datum/armor/medical_chemist - bio = 10 - fire = 50 - acid = 65 - /obj/item/clothing/under/rank/medical/paramedic/skirt name = "paramedic jumpskirt" desc = "It's made of a special fiber that provides minor protection against biohazards. It has a dark blue cross on the chest denoting that the wearer is a trained paramedic." @@ -181,11 +132,6 @@ female_sprite_flags = FEMALE_UNIFORM_TOP_ONLY supports_variations_flags = CLOTHING_DIGITIGRADE_VARIATION_NO_NEW_ICON -/datum/armor/medical_chemist - bio = 10 - fire = 50 - acid = 65 - /obj/item/clothing/under/rank/medical/doctor/nurse desc = "It's a jumpsuit commonly worn by nursing staff in the medical department." name = "nurse's suit" diff --git a/code/modules/clothing/under/jobs/rnd.dm b/code/modules/clothing/under/jobs/rnd.dm index 72a3ff5a2a0..b761f8ee4c9 100644 --- a/code/modules/clothing/under/jobs/rnd.dm +++ b/code/modules/clothing/under/jobs/rnd.dm @@ -20,11 +20,6 @@ has_sensor = NO_SENSORS random_sensor = FALSE -/datum/armor/rnd_research_director - bomb = 10 - bio = 10 - acid = 35 - /obj/item/clothing/under/rank/rnd/research_director/skirt name = "research director's vest suitskirt" desc = "It's a suitskirt worn by those with the know-how to achieve the position of \"Research Director\". Its fabric provides minor protection from biological contaminants." @@ -35,11 +30,6 @@ female_sprite_flags = FEMALE_UNIFORM_TOP_ONLY supports_variations_flags = CLOTHING_DIGITIGRADE_VARIATION_NO_NEW_ICON -/datum/armor/rnd_research_director - bomb = 10 - bio = 10 - acid = 35 - /obj/item/clothing/under/rank/rnd/research_director/alt desc = "Maybe you'll engineer your own half-man, half-pig creature some day. Its fabric provides minor protection from biological contaminants." name = "research director's tan suit" @@ -48,11 +38,6 @@ can_adjust = TRUE alt_covers_chest = TRUE -/datum/armor/rnd_research_director - bomb = 10 - bio = 10 - acid = 35 - /obj/item/clothing/under/rank/rnd/research_director/alt/skirt name = "research director's tan suitskirt" desc = "Maybe you'll engineer your own half-man, half-pig creature some day. Its fabric provides minor protection from biological contaminants." @@ -63,11 +48,6 @@ female_sprite_flags = FEMALE_UNIFORM_TOP_ONLY supports_variations_flags = CLOTHING_DIGITIGRADE_VARIATION_NO_NEW_ICON -/datum/armor/rnd_research_director - bomb = 10 - bio = 10 - acid = 35 - /obj/item/clothing/under/rank/rnd/research_director/turtleneck desc = "A Nanotrasen-purple turtleneck and black jeans, for a director with a superior sense of style." name = "research director's turtleneck" @@ -76,11 +56,6 @@ can_adjust = TRUE alt_covers_chest = TRUE -/datum/armor/rnd_research_director - bomb = 10 - bio = 10 - acid = 35 - /obj/item/clothing/under/rank/rnd/research_director/turtleneck/skirt name = "research director's turtleneck skirt" desc = "A Nanotrasen-purple turtleneck and a black skirt, for a director with a superior sense of style." @@ -91,11 +66,6 @@ female_sprite_flags = FEMALE_UNIFORM_TOP_ONLY supports_variations_flags = CLOTHING_DIGITIGRADE_VARIATION_NO_NEW_ICON -/datum/armor/rnd_research_director - bomb = 10 - bio = 10 - acid = 35 - /obj/item/clothing/under/rank/rnd/scientist desc = "It's made of a special fiber that provides minor protection against explosives. It has markings that denote the wearer as a scientist." name = "scientist's jumpsuit" @@ -116,9 +86,6 @@ female_sprite_flags = FEMALE_UNIFORM_TOP_ONLY supports_variations_flags = CLOTHING_DIGITIGRADE_VARIATION_NO_NEW_ICON -/datum/armor/rnd_scientist - bio = 50 - /obj/item/clothing/under/rank/rnd/roboticist desc = "It's a slimming black with reinforced seams; great for industrial work." name = "roboticist's jumpsuit" @@ -126,9 +93,6 @@ inhand_icon_state = null resistance_flags = NONE -/datum/armor/rnd_scientist - bio = 50 - /obj/item/clothing/under/rank/rnd/roboticist/skirt name = "roboticist's jumpskirt" desc = "It's a slimming black with reinforced seams; great for industrial work." @@ -139,9 +103,6 @@ female_sprite_flags = FEMALE_UNIFORM_TOP_ONLY supports_variations_flags = CLOTHING_DIGITIGRADE_VARIATION_NO_NEW_ICON -/datum/armor/rnd_scientist - bio = 50 - /obj/item/clothing/under/rank/rnd/geneticist desc = "It's made of a special fiber that gives special protection against biohazards. It has a genetics rank stripe on it." name = "geneticist's jumpsuit" diff --git a/code/modules/clothing/under/jobs/security.dm b/code/modules/clothing/under/jobs/security.dm index c5845769932..a204f899910 100644 --- a/code/modules/clothing/under/jobs/security.dm +++ b/code/modules/clothing/under/jobs/security.dm @@ -30,26 +30,12 @@ icon_state = "rsecurity" inhand_icon_state = "r_suit" -/datum/armor/rank_security - melee = 10 - bio = 10 - fire = 30 - acid = 30 - wound = 10 - /obj/item/clothing/under/rank/security/officer/grey name = "grey security jumpsuit" desc = "A tactical relic of years past before Nanotrasen decided it was cheaper to dye the suits red instead of washing out the blood." icon_state = "security" inhand_icon_state = "gy_suit" -/datum/armor/rank_security - melee = 10 - bio = 10 - fire = 30 - acid = 30 - wound = 10 - /obj/item/clothing/under/rank/security/officer/skirt name = "security skirt" desc = "A \"tactical\" security uniform with the legs replaced by a skirt." @@ -60,13 +46,6 @@ female_sprite_flags = FEMALE_UNIFORM_TOP_ONLY supports_variations_flags = CLOTHING_DIGITIGRADE_VARIATION_NO_NEW_ICON -/datum/armor/rank_security - melee = 10 - bio = 10 - fire = 30 - acid = 30 - wound = 10 - /obj/item/clothing/under/rank/security/officer/blueshirt name = "blue shirt and tie" desc = "I'm a little busy right now, Calhoun." @@ -74,13 +53,6 @@ inhand_icon_state = null can_adjust = FALSE -/datum/armor/rank_security - melee = 10 - bio = 10 - fire = 30 - acid = 30 - wound = 10 - /obj/item/clothing/under/rank/security/officer/formal name = "security officer's formal uniform" desc = "The latest in fashionable security outfits." @@ -88,13 +60,6 @@ inhand_icon_state = null alt_covers_chest = TRUE -/datum/armor/rank_security - melee = 10 - bio = 10 - fire = 30 - acid = 30 - wound = 10 - /obj/item/clothing/under/rank/security/constable name = "constable outfit" desc = "A british looking outfit." @@ -104,39 +69,18 @@ custom_price = PAYCHECK_COMMAND -/datum/armor/rank_security - melee = 10 - bio = 10 - fire = 30 - acid = 30 - wound = 10 - /obj/item/clothing/under/rank/security/warden name = "security suit" desc = "A formal security suit for officers complete with Nanotrasen belt buckle." icon_state = "rwarden" inhand_icon_state = "r_suit" -/datum/armor/rank_security - melee = 10 - bio = 10 - fire = 30 - acid = 30 - wound = 10 - /obj/item/clothing/under/rank/security/warden/grey name = "grey security suit" desc = "A formal relic of years past before Nanotrasen decided it was cheaper to dye the suits red instead of washing out the blood." icon_state = "warden" inhand_icon_state = "gy_suit" -/datum/armor/rank_security - melee = 10 - bio = 10 - fire = 30 - acid = 30 - wound = 10 - /obj/item/clothing/under/rank/security/warden/skirt name = "warden's suitskirt" desc = "A formal security suitskirt for officers complete with Nanotrasen belt buckle." @@ -147,13 +91,6 @@ female_sprite_flags = FEMALE_UNIFORM_TOP_ONLY supports_variations_flags = CLOTHING_DIGITIGRADE_VARIATION_NO_NEW_ICON -/datum/armor/rank_security - melee = 10 - bio = 10 - fire = 30 - acid = 30 - wound = 10 - /obj/item/clothing/under/rank/security/warden/formal desc = "The insignia on this uniform tells you that this uniform belongs to the Warden." name = "warden's formal uniform" @@ -164,13 +101,6 @@ /* * Detective */ -/datum/armor/rank_security - melee = 10 - bio = 10 - fire = 30 - acid = 30 - wound = 10 - /obj/item/clothing/under/rank/security/detective name = "hard-worn suit" desc = "Someone who wears this means business." @@ -178,13 +108,6 @@ inhand_icon_state = "det" alt_covers_chest = TRUE -/datum/armor/rank_security - melee = 10 - bio = 10 - fire = 30 - acid = 30 - wound = 10 - /obj/item/clothing/under/rank/security/detective/skirt name = "detective's suitskirt" desc = "Someone who wears this means business." @@ -196,13 +119,6 @@ alt_covers_chest = TRUE supports_variations_flags = CLOTHING_DIGITIGRADE_VARIATION_NO_NEW_ICON -/datum/armor/rank_security - melee = 10 - bio = 10 - fire = 30 - acid = 30 - wound = 10 - /obj/item/clothing/under/rank/security/detective/noir name = "noir suit" desc = "A hard-boiled private investigator's dark suit, complete with tie clip." @@ -210,13 +126,6 @@ inhand_icon_state = null alt_covers_chest = TRUE -/datum/armor/rank_security - melee = 10 - bio = 10 - fire = 30 - acid = 30 - wound = 10 - /obj/item/clothing/under/rank/security/detective/noir/skirt name = "noir suitskirt" desc = "A hard-boiled private investigator's grey suitskirt, complete with tie clip." @@ -231,13 +140,6 @@ /* * Head of Security */ -/datum/armor/rank_security - melee = 10 - bio = 10 - fire = 30 - acid = 30 - wound = 10 - /obj/item/clothing/under/rank/security/head_of_security name = "head of security's uniform" desc = "A security jumpsuit decorated for those few with the dedication to achieve the position of Head of Security." @@ -263,26 +165,12 @@ female_sprite_flags = FEMALE_UNIFORM_TOP_ONLY supports_variations_flags = CLOTHING_DIGITIGRADE_VARIATION_NO_NEW_ICON -/datum/armor/security_head_of_security - melee = 10 - bio = 10 - fire = 50 - acid = 50 - wound = 10 - /obj/item/clothing/under/rank/security/head_of_security/grey name = "head of security's grey jumpsuit" desc = "There are old men, and there are bold men, but there are very few old, bold men." icon_state = "hos" inhand_icon_state = "gy_suit" -/datum/armor/security_head_of_security - melee = 10 - bio = 10 - fire = 50 - acid = 50 - wound = 10 - /obj/item/clothing/under/rank/security/head_of_security/alt name = "head of security's turtleneck" desc = "A stylish alternative to the normal head of security jumpsuit, complete with tactical pants." @@ -290,13 +178,6 @@ inhand_icon_state = "bl_suit" alt_covers_chest = TRUE -/datum/armor/security_head_of_security - melee = 10 - bio = 10 - fire = 50 - acid = 50 - wound = 10 - /obj/item/clothing/under/rank/security/head_of_security/alt/skirt name = "head of security's turtleneck skirt" desc = "A stylish alternative to the normal head of security jumpsuit, complete with a tactical skirt." @@ -308,13 +189,6 @@ alt_covers_chest = TRUE supports_variations_flags = CLOTHING_DIGITIGRADE_VARIATION_NO_NEW_ICON -/datum/armor/security_head_of_security - melee = 10 - bio = 10 - fire = 50 - acid = 50 - wound = 10 - /obj/item/clothing/under/rank/security/head_of_security/parade name = "head of security's parade uniform" desc = "A male head of security's luxury-wear, for special occasions." @@ -322,13 +196,6 @@ inhand_icon_state = "r_suit" can_adjust = FALSE -/datum/armor/security_head_of_security - melee = 10 - bio = 10 - fire = 50 - acid = 50 - wound = 10 - /obj/item/clothing/under/rank/security/head_of_security/parade/female name = "head of security's formal uniform" desc = "A female head of security's luxury-wear, for special occasions." @@ -337,13 +204,6 @@ female_sprite_flags = FEMALE_UNIFORM_TOP_ONLY can_adjust = FALSE -/datum/armor/security_head_of_security - melee = 10 - bio = 10 - fire = 50 - acid = 50 - wound = 10 - /obj/item/clothing/under/rank/security/head_of_security/formal desc = "The insignia on this uniform tells you that this uniform belongs to the Head of Security." name = "head of security's formal uniform" @@ -355,13 +215,6 @@ *Spacepol */ -/datum/armor/security_head_of_security - melee = 10 - bio = 10 - fire = 50 - acid = 50 - wound = 10 - /obj/item/clothing/under/rank/security/officer/spacepol name = "police uniform" desc = "Space not controlled by megacorporations, planets, or pirates is under the jurisdiction of Spacepol." @@ -369,13 +222,6 @@ inhand_icon_state = null can_adjust = FALSE -/datum/armor/security_head_of_security - melee = 10 - bio = 10 - fire = 50 - acid = 50 - wound = 10 - /obj/item/clothing/under/rank/prisoner name = "prison jumpsuit" desc = "It's standardised Nanotrasen prisoner-wear. Its suit sensors are stuck in the \"Fully On\" position." @@ -393,13 +239,6 @@ sensor_mode = SENSOR_COORDS random_sensor = FALSE -/datum/armor/security_head_of_security - melee = 10 - bio = 10 - fire = 50 - acid = 50 - wound = 10 - /obj/item/clothing/under/rank/prisoner/skirt name = "prison jumpskirt" desc = "It's standardised Nanotrasen prisoner-wear. Its suit sensors are stuck in the \"Fully On\" position." @@ -417,13 +256,6 @@ female_sprite_flags = FEMALE_UNIFORM_TOP_ONLY supports_variations_flags = CLOTHING_DIGITIGRADE_VARIATION_NO_NEW_ICON -/datum/armor/security_head_of_security - melee = 10 - bio = 10 - fire = 50 - acid = 50 - wound = 10 - /obj/item/clothing/under/rank/security/officer/beatcop name = "space police uniform" desc = "A police uniform often found in the lines at donut shops." @@ -431,13 +263,6 @@ inhand_icon_state = null can_adjust = FALSE -/datum/armor/security_head_of_security - melee = 10 - bio = 10 - fire = 50 - acid = 50 - wound = 10 - /obj/item/clothing/under/rank/security/detective/disco name = "superstar cop uniform" desc = "Flare cut trousers and a dirty shirt that might have been classy before someone took a piss in the armpits. It's the dress of a superstar." @@ -445,13 +270,6 @@ inhand_icon_state = null can_adjust = FALSE -/datum/armor/security_head_of_security - melee = 10 - bio = 10 - fire = 50 - acid = 50 - wound = 10 - /obj/item/clothing/under/rank/security/detective/kim name = "aerostatic suit" desc = "A crisp and well-pressed suit; professional, comfortable and curiously authoritative." diff --git a/code/modules/clothing/under/miscellaneous.dm b/code/modules/clothing/under/miscellaneous.dm index 6a2b7d4c69c..68749df3ed0 100644 --- a/code/modules/clothing/under/miscellaneous.dm +++ b/code/modules/clothing/under/miscellaneous.dm @@ -75,16 +75,6 @@ can_adjust = FALSE has_sensor = NO_SENSORS -/datum/armor/misc_adminsuit - melee = 100 - bullet = 100 - laser = 100 - energy = 100 - bomb = 100 - bio = 100 - fire = 100 - acid = 100 - /obj/item/clothing/under/misc/overalls name = "laborer's overalls" desc = "A set of durable overalls for getting the job done." @@ -93,16 +83,6 @@ can_adjust = FALSE custom_price = PAYCHECK_CREW -/datum/armor/misc_adminsuit - melee = 100 - bullet = 100 - laser = 100 - energy = 100 - bomb = 100 - bio = 100 - fire = 100 - acid = 100 - /obj/item/clothing/under/misc/assistantformal name = "assistant's formal uniform" desc = "An assistant's formal-wear. Why an assistant needs formal-wear is still unknown." @@ -110,16 +90,6 @@ inhand_icon_state = "gy_suit" can_adjust = FALSE -/datum/armor/misc_adminsuit - melee = 100 - bullet = 100 - laser = 100 - energy = 100 - bomb = 100 - bio = 100 - fire = 100 - acid = 100 - /obj/item/clothing/under/misc/durathread name = "durathread jumpsuit" desc = "A jumpsuit made from durathread, its resilient fibres provide some protection to the wearer." @@ -159,12 +129,6 @@ inhand_icon_state = null can_adjust = FALSE -/datum/armor/misc_bouncer - melee = 5 - bio = 10 - fire = 30 - acid = 30 - /obj/item/clothing/under/misc/syndicate_souvenir name = "syndicate souvenir tee" desc = "I got kidnapped by a Syndicate operative and all I got was this lousy t-shirt!" diff --git a/code/modules/industrial_lift/industrial_lift.dm b/code/modules/industrial_lift/industrial_lift.dm index 5410939ba0f..8c4e82fdea8 100644 --- a/code/modules/industrial_lift/industrial_lift.dm +++ b/code/modules/industrial_lift/industrial_lift.dm @@ -732,11 +732,6 @@ GLOBAL_LIST_EMPTY(lifts) lift_id = DEBUG_LIFT_ID radial_travel = TRUE -/datum/armor/structure_industrial_lift - melee = 50 - fire = 80 - acid = 50 - /obj/structure/industrial_lift/debug/open_lift_radial(mob/living/user) var/starting_position = loc if (!can_open_lift_radial(user,starting_position)) diff --git a/code/modules/library/bookcase.dm b/code/modules/library/bookcase.dm index 5d5090ea2bd..897d88cc19b 100644 --- a/code/modules/library/bookcase.dm +++ b/code/modules/library/bookcase.dm @@ -187,9 +187,6 @@ /obj/structure/bookcase/manuals/engineering name = "engineering manuals bookcase" -/datum/armor/structure_bookcase - fire = 50 - /obj/structure/bookcase/manuals/engineering/Initialize(mapload) . = ..() new /obj/item/book/manual/wiki/engineering_construction(src) @@ -201,9 +198,6 @@ /obj/structure/bookcase/manuals/research_and_development name = "\improper R&D manuals bookcase" -/datum/armor/structure_bookcase - fire = 50 - /obj/structure/bookcase/manuals/research_and_development/Initialize(mapload) . = ..() new /obj/item/book/manual/wiki/research_and_development(src) diff --git a/code/modules/mapfluff/ruins/lavalandruin_code/puzzle.dm b/code/modules/mapfluff/ruins/lavalandruin_code/puzzle.dm index 8a42121310f..9365b307d88 100644 --- a/code/modules/mapfluff/ruins/lavalandruin_code/puzzle.dm +++ b/code/modules/mapfluff/ruins/lavalandruin_code/puzzle.dm @@ -316,15 +316,6 @@ icon = 'icons/obj/lavaland/artefacts.dmi' icon_state = "prison_cube" -/datum/armor/puzzle_element_prison - melee = 50 - bullet = 50 - laser = 50 - energy = 50 - bomb = 50 - fire = 50 - acid = 50 - /obj/item/prisoncube/afterattack(atom/target, mob/user, proximity_flag, click_parameters) . = ..() if(!proximity_flag || !isliving(target)) diff --git a/code/modules/mining/equipment/explorer_gear.dm b/code/modules/mining/equipment/explorer_gear.dm index a04f051c744..22ee4c99ea3 100644 --- a/code/modules/mining/equipment/explorer_gear.dm +++ b/code/modules/mining/equipment/explorer_gear.dm @@ -49,16 +49,6 @@ armor_type = /datum/armor/hooded_explorer resistance_flags = FIRE_PROOF -/datum/armor/hooded_explorer - melee = 30 - bullet = 10 - laser = 10 - energy = 20 - bomb = 50 - fire = 50 - acid = 50 - wound = 10 - /obj/item/clothing/suit/hooded/explorer/Initialize(mapload) . = ..() AddComponent(/datum/component/armor_plate) diff --git a/code/modules/mining/lavaland/megafauna_loot.dm b/code/modules/mining/lavaland/megafauna_loot.dm index 7bed98ad96a..001e9f37e85 100644 --- a/code/modules/mining/lavaland/megafauna_loot.dm +++ b/code/modules/mining/lavaland/megafauna_loot.dm @@ -315,15 +315,6 @@ greyscale_config_worn = /datum/greyscale_config/heck_helmet/worn flags_1 = IS_PLAYER_COLORABLE_1 -/datum/armor/hooded_hostile_environment - melee = 70 - bullet = 40 - laser = 10 - energy = 20 - bomb = 50 - fire = 100 - acid = 100 - /obj/item/clothing/head/hooded/hostile_environment/Initialize(mapload) . = ..() update_appearance() @@ -389,15 +380,6 @@ /// Cooldown between attacks COOLDOWN_DECLARE(attack_cooldown) -/datum/armor/hooded_hostile_environment - melee = 70 - bullet = 40 - laser = 10 - energy = 20 - bomb = 50 - fire = 100 - acid = 100 - /obj/item/soulscythe/Initialize(mapload) . = ..() soul = new(src) @@ -606,15 +588,6 @@ /// Blood level, used for movement and abilities in a soulscythe var/blood_level = MAX_BLOOD_LEVEL -/datum/armor/hooded_hostile_environment - melee = 70 - bullet = 40 - laser = 10 - energy = 20 - bomb = 50 - fire = 100 - acid = 100 - /mob/living/simple_animal/soulscythe/get_status_tab_items() . = ..() . += "Blood: [blood_level]/[MAX_BLOOD_LEVEL]" @@ -633,15 +606,6 @@ light_power = 1 light_color = LIGHT_COLOR_BLOOD_MAGIC -/datum/armor/hooded_hostile_environment - melee = 70 - bullet = 40 - laser = 10 - energy = 20 - bomb = 50 - fire = 100 - acid = 100 - /obj/projectile/soulscythe/on_hit(atom/target, blocked = FALSE) if(ishostile(target)) damage *= 2 @@ -670,15 +634,6 @@ var/summon_cooldown = 0 var/list/mob/dead/observer/spirits -/datum/armor/hooded_hostile_environment - melee = 70 - bullet = 40 - laser = 10 - energy = 20 - bomb = 50 - fire = 100 - acid = 100 - /obj/item/melee/ghost_sword/Initialize(mapload) . = ..() spirits = list() @@ -756,15 +711,6 @@ icon = 'icons/obj/wizard.dmi' icon_state = "vial" -/datum/armor/hooded_hostile_environment - melee = 70 - bullet = 40 - laser = 10 - energy = 20 - bomb = 50 - fire = 100 - acid = 100 - /obj/item/dragons_blood/attack_self(mob/living/carbon/human/user) if(!istype(user)) return @@ -831,15 +777,6 @@ var/timer = 0 var/static/list/banned_turfs = typecacheof(list(/turf/open/space/transit, /turf/closed)) -/datum/armor/hooded_hostile_environment - melee = 70 - bullet = 40 - laser = 10 - energy = 20 - bomb = 50 - fire = 100 - acid = 100 - /obj/item/lava_staff/afterattack(atom/target, mob/user, proximity_flag, click_parameters) . = ..() if(timer > world.time) @@ -921,15 +858,6 @@ /// Throwforce when the saw is opened. var/open_throwforce = 20 -/datum/armor/hooded_hostile_environment - melee = 70 - bullet = 40 - laser = 10 - energy = 20 - bomb = 50 - fire = 100 - acid = 100 - /obj/item/melee/cleaving_saw/Initialize(mapload) . = ..() AddComponent(/datum/component/transforming, \ @@ -1041,15 +969,6 @@ var/static/list/excluded_areas = list(/area/space) var/list/targeted_turfs = list() -/datum/armor/hooded_hostile_environment - melee = 70 - bullet = 40 - laser = 10 - energy = 20 - bomb = 50 - fire = 100 - acid = 100 - /obj/item/storm_staff/examine(mob/user) . = ..() . += span_notice("It has [thunder_charges] charges remaining.") diff --git a/code/modules/mining/lavaland/tendril_loot.dm b/code/modules/mining/lavaland/tendril_loot.dm index 1b017ffc124..c220f593629 100644 --- a/code/modules/mining/lavaland/tendril_loot.dm +++ b/code/modules/mining/lavaland/tendril_loot.dm @@ -718,15 +718,6 @@ /// Status of berserk var/berserk_active = FALSE -/datum/armor/hooded_berserker - melee = 30 - bullet = 30 - laser = 10 - energy = 20 - bomb = 50 - fire = 100 - acid = 100 - /obj/item/clothing/head/hooded/berserker/Initialize(mapload) . = ..() ADD_TRAIT(src, TRAIT_NODROP, LOCKED_HELMET_TRAIT) @@ -810,15 +801,6 @@ custom_materials = null var/datum/action/cooldown/scan/scan_ability -/datum/armor/hooded_berserker - melee = 30 - bullet = 30 - laser = 10 - energy = 20 - bomb = 50 - fire = 100 - acid = 100 - /obj/item/clothing/glasses/godeye/Initialize(mapload) . = ..() scan_ability = new(src) @@ -860,15 +842,6 @@ cooldown_time = 45 SECONDS ranged_mousepointer = 'icons/effects/mouse_pointers/scan_target.dmi' -/datum/armor/hooded_berserker - melee = 30 - bullet = 30 - laser = 10 - energy = 20 - bomb = 50 - fire = 100 - acid = 100 - /datum/action/cooldown/scan/IsAvailable(feedback = FALSE) return ..() && isliving(owner) @@ -911,15 +884,6 @@ range_mid = 5 range_far = 15 -/datum/armor/hooded_berserker - melee = 30 - bullet = 30 - laser = 10 - energy = 20 - bomb = 50 - fire = 100 - acid = 100 - /datum/status_effect/agent_pinpointer/scan/scan_for_target() return @@ -938,15 +902,6 @@ extend_sound = 'sound/items/unsheath.ogg' retract_sound = 'sound/items/sheath.ogg' -/datum/armor/hooded_berserker - melee = 30 - bullet = 30 - laser = 10 - energy = 20 - bomb = 50 - fire = 100 - acid = 100 - /obj/item/organ/internal/cyberimp/arm/katana/attack_self(mob/user, modifiers) . = ..() to_chat(user, span_userdanger("The mass goes up your arm and goes inside it!")) @@ -1016,15 +971,6 @@ ATTACK_SHATTER = list(COMBO_STEPS = list(RIGHT_SLASH, LEFT_SLASH, RIGHT_SLASH, LEFT_SLASH), COMBO_PROC = PROC_REF(shatter)), ) -/datum/armor/hooded_berserker - melee = 30 - bullet = 30 - laser = 10 - energy = 20 - bomb = 50 - fire = 100 - acid = 100 - /obj/item/cursed_katana/Initialize(mapload) . = ..() for(var/combo in combo_list) diff --git a/code/modules/mob/living/carbon/human/species_types/golems.dm b/code/modules/mob/living/carbon/human/species_types/golems.dm index 1dbcc6af203..b9564c4b7cf 100644 --- a/code/modules/mob/living/carbon/human/species_types/golems.dm +++ b/code/modules/mob/living/carbon/human/species_types/golems.dm @@ -969,15 +969,6 @@ var/last_gong_time = 0 var/gong_cooldown = 150 -/datum/armor/structure_cloth_pile - melee = 90 - bullet = 90 - laser = 25 - energy = 80 - bomb = 50 - fire = -50 - acid = -50 - /datum/species/golem/bronze/bullet_act(obj/projectile/P, mob/living/carbon/human/H) if(!(world.time > last_gong_time + gong_cooldown)) return ..() @@ -1152,15 +1143,6 @@ BODY_ZONE_CHEST = /obj/item/bodypart/chest/golem/durathread, ) -/datum/armor/structure_cloth_pile - melee = 90 - bullet = 90 - laser = 25 - energy = 80 - bomb = 50 - fire = -50 - acid = -50 - /datum/species/golem/durathread/spec_unarmedattacked(mob/living/carbon/human/user, mob/living/carbon/human/target) . = ..() target.apply_status_effect(/datum/status_effect/strandling) @@ -1211,15 +1193,6 @@ ) var/datum/action/innate/bonechill/bonechill -/datum/armor/structure_cloth_pile - melee = 90 - bullet = 90 - laser = 25 - energy = 80 - bomb = 50 - fire = -50 - acid = -50 - /datum/species/golem/bone/on_species_gain(mob/living/carbon/C, datum/species/old_species) ..() if(ishuman(C)) @@ -1269,15 +1242,6 @@ var/last_use var/snas_chance = 3 -/datum/armor/structure_cloth_pile - melee = 90 - bullet = 90 - laser = 25 - energy = 80 - bomb = 50 - fire = -50 - acid = -50 - /datum/action/innate/bonechill/Activate() if(world.time < last_use + cooldown) to_chat(owner, span_warning("You aren't ready yet to rattle your bones again!")) @@ -1340,15 +1304,6 @@ /// A ref to our cryobeam spell we get on species gain. var/datum/action/cooldown/spell/pointed/projectile/cryo/cryo -/datum/armor/structure_cloth_pile - melee = 90 - bullet = 90 - laser = 25 - energy = 80 - bomb = 50 - fire = -50 - acid = -50 - /datum/species/golem/snow/spec_death(gibbed, mob/living/carbon/human/H) H.visible_message(span_danger("[H] turns into a pile of snow!")) for(var/obj/item/W in H) @@ -1398,15 +1353,6 @@ ) examine_limb_id = SPECIES_GOLEM -/datum/armor/structure_cloth_pile - melee = 90 - bullet = 90 - laser = 25 - energy = 80 - bomb = 50 - fire = -50 - acid = -50 - /datum/species/golem/mhydrogen/on_species_gain(mob/living/carbon/C, datum/species/old_species) . = ..() ADD_TRAIT(C, TRAIT_ANTIMAGIC, SPECIES_TRAIT) diff --git a/code/modules/mob/living/simple_animal/hostile/mining_mobs/elites/elite.dm b/code/modules/mob/living/simple_animal/hostile/mining_mobs/elites/elite.dm index 8fd467220b0..4d4335c51d9 100644 --- a/code/modules/mob/living/simple_animal/hostile/mining_mobs/elites/elite.dm +++ b/code/modules/mob/living/simple_animal/hostile/mining_mobs/elites/elite.dm @@ -363,16 +363,6 @@ While using this makes the system rely on OnFire, it still gives options for tim throw_speed = 3 throw_range = 5 -/datum/armor/structure_elite_tumor - melee = 100 - bullet = 100 - laser = 100 - energy = 100 - bomb = 100 - bio = 100 - fire = 100 - acid = 100 - /obj/item/tumor_shard/afterattack(atom/target, mob/user, proximity_flag) . = ..() if(istype(target, /mob/living/simple_animal/hostile/asteroid/elite) && proximity_flag) @@ -411,16 +401,6 @@ While using this makes the system rely on OnFire, it still gives options for tim var/datum/weakref/activator_ref var/datum/weakref/ourelite_ref -/datum/armor/structure_elite_tumor - melee = 100 - bullet = 100 - laser = 100 - energy = 100 - bomb = 100 - bio = 100 - fire = 100 - acid = 100 - /obj/effect/temp_visual/elite_tumor_wall/Initialize(mapload, new_caster) . = ..() if(smoothing_flags & (SMOOTH_CORNERS|SMOOTH_BITMASK)) diff --git a/code/modules/reagents/reagent_containers/cups/_cup.dm b/code/modules/reagents/reagent_containers/cups/_cup.dm index 3c03e1ff707..775efbaf35f 100644 --- a/code/modules/reagents/reagent_containers/cups/_cup.dm +++ b/code/modules/reagents/reagent_containers/cups/_cup.dm @@ -467,10 +467,6 @@ spillable = TRUE var/obj/item/grinded -/datum/armor/bucket_wooden - melee = 10 - acid = 50 - /obj/item/reagent_containers/cup/mortar/AltClick(mob/user) if(grinded) grinded.forceMove(drop_location()) diff --git a/code/modules/recycling/disposal/bin.dm b/code/modules/recycling/disposal/bin.dm index 451b0ab611f..4d2710783c3 100644 --- a/code/modules/recycling/disposal/bin.dm +++ b/code/modules/recycling/disposal/bin.dm @@ -298,14 +298,6 @@ icon_state = "disposal" // attack by item places it in to disposal -/datum/armor/machinery_disposal - melee = 25 - bullet = 10 - laser = 10 - energy = 100 - fire = 90 - acid = 30 - /obj/machinery/disposal/bin/attackby(obj/item/I, mob/user, params) if(istype(I, /obj/item/storage/bag/trash)) //Not doing component overrides because this is a specific type. var/obj/item/storage/bag/trash/T = I @@ -486,14 +478,6 @@ icon_state = "intake" pressure_charging = FALSE // the chute doesn't need charging and always works -/datum/armor/machinery_disposal - melee = 25 - bullet = 10 - laser = 10 - energy = 100 - fire = 90 - acid = 30 - /obj/machinery/disposal/delivery_chute/place_item_in_disposal(obj/item/I, mob/user) if(I.CanEnterDisposals()) ..() diff --git a/code/modules/recycling/disposal/pipe.dm b/code/modules/recycling/disposal/pipe.dm index 836d5807981..e35be284bad 100644 --- a/code/modules/recycling/disposal/pipe.dm +++ b/code/modules/recycling/disposal/pipe.dm @@ -203,14 +203,6 @@ // next direction to move // if coming in from secondary dirs, then next is primary dir // if coming in from primary dir, then next is equal chance of other dirs -/datum/armor/structure_disposalpipe - melee = 25 - bullet = 10 - laser = 10 - energy = 100 - fire = 90 - acid = 30 - /obj/structure/disposalpipe/junction/nextdir(obj/structure/disposalholder/H) var/flipdir = turn(H.dir, 180) if(flipdir != dir) // came from secondary dir, so exit through primary @@ -247,14 +239,6 @@ icon_state = "pipe-t" var/obj/linked // the linked obj/machinery/disposal or obj/disposaloutlet -/datum/armor/structure_disposalpipe - melee = 25 - bullet = 10 - laser = 10 - energy = 100 - fire = 90 - acid = 30 - /obj/structure/disposalpipe/trunk/Initialize(mapload) . = ..() getlinked() @@ -327,13 +311,5 @@ // broken pipes always have dpdir=0 so they're not found as 'real' pipes // i.e. will be treated as an empty turf -/datum/armor/structure_disposalpipe - melee = 25 - bullet = 10 - laser = 10 - energy = 100 - fire = 90 - acid = 30 - /obj/structure/disposalpipe/broken/deconstruct() qdel(src) diff --git a/code/modules/research/xenobiology/crossbreeding/_clothing.dm b/code/modules/research/xenobiology/crossbreeding/_clothing.dm index 0faee3b578a..c1c522b5849 100644 --- a/code/modules/research/xenobiology/crossbreeding/_clothing.dm +++ b/code/modules/research/xenobiology/crossbreeding/_clothing.dm @@ -39,9 +39,6 @@ Slimecrossing Armor actions_types = list(/datum/action/item_action/change_prism_colour, /datum/action/item_action/place_light_prism) var/glasses_color = "#FFFFFF" -/datum/armor/mask_nobreath - bio = 50 - /obj/item/clothing/glasses/prism_glasses/item_action_slot_check(slot) if(slot & ITEM_SLOT_EYES) return TRUE @@ -55,9 +52,6 @@ Slimecrossing Armor anchored = TRUE max_integrity = 10 -/datum/armor/mask_nobreath - bio = 50 - /obj/structure/light_prism/Initialize(mapload, newcolor) . = ..() color = newcolor @@ -73,9 +67,6 @@ Slimecrossing Armor button_icon = 'icons/obj/xenobiology/slimecrossing.dmi' button_icon_state = "prismcolor" -/datum/armor/mask_nobreath - bio = 50 - /datum/action/item_action/change_prism_colour/Trigger(trigger_flags) if(!IsAvailable(feedback = TRUE)) return @@ -90,9 +81,6 @@ Slimecrossing Armor button_icon = 'icons/obj/xenobiology/slimecrossing.dmi' button_icon_state = "lightprism" -/datum/armor/mask_nobreath - bio = 50 - /datum/action/item_action/place_light_prism/Trigger(trigger_flags) if(!IsAvailable(feedback = TRUE)) return @@ -123,9 +111,6 @@ Slimecrossing Armor throw_speed = 1 throw_range = 3 -/datum/armor/mask_nobreath - bio = 50 - /obj/item/clothing/head/peaceflower/proc/at_peace_check(mob/user) if(iscarbon(user)) var/mob/living/carbon/carbon_user = user @@ -156,9 +141,6 @@ Slimecrossing Armor slowdown = 4 var/hit_reflect_chance = 40 -/datum/armor/mask_nobreath - bio = 50 - /obj/item/clothing/suit/armor/heavy/adamantine/IsReflect(def_zone) if(def_zone in list(BODY_ZONE_CHEST, BODY_ZONE_R_ARM, BODY_ZONE_L_ARM, BODY_ZONE_R_LEG, BODY_ZONE_L_LEG) && prob(hit_reflect_chance)) return TRUE diff --git a/code/modules/research/xenobiology/crossbreeding/_misc.dm b/code/modules/research/xenobiology/crossbreeding/_misc.dm index 4702b6646f1..bd6b8ffcd56 100644 --- a/code/modules/research/xenobiology/crossbreeding/_misc.dm +++ b/code/modules/research/xenobiology/crossbreeding/_misc.dm @@ -176,14 +176,6 @@ Slimecrossing Items icon = 'icons/obj/xenobiology/slimecrossing.dmi' icon_state = "capturedevice" -/datum/armor/structure_ice_stasis - melee = 30 - bullet = 50 - laser = -50 - energy = -50 - fire = -80 - acid = 30 - /obj/item/capturedevice/attack(mob/living/M, mob/user) if(length(contents)) to_chat(user, span_warning("The device already has something inside.")) diff --git a/code/modules/research/xenobiology/crossbreeding/_weapons.dm b/code/modules/research/xenobiology/crossbreeding/_weapons.dm index 7ca3af5ad3a..bd08d342c6c 100644 --- a/code/modules/research/xenobiology/crossbreeding/_weapons.dm +++ b/code/modules/research/xenobiology/crossbreeding/_weapons.dm @@ -102,14 +102,6 @@ Slimecrossing Weapons ammo_type = /obj/item/ammo_casing/magic/bloodchill fire_sound = 'sound/effects/attackblob.ogg' -/datum/armor/shield_adamantineshield - melee = 50 - bullet = 50 - laser = 50 - bomb = 30 - fire = 80 - acid = 70 - /obj/item/gun/magic/bloodchill/Initialize(mapload) . = ..() ADD_TRAIT(src, TRAIT_NODROP, HAND_REPLACEMENT_TRAIT) @@ -138,14 +130,6 @@ Slimecrossing Weapons nodamage = TRUE hitsound = 'sound/effects/splat.ogg' -/datum/armor/shield_adamantineshield - melee = 50 - bullet = 50 - laser = 50 - bomb = 30 - fire = 80 - acid = 70 - /obj/projectile/magic/bloodchill/on_hit(mob/living/target) . = ..() if(isliving(target)) diff --git a/code/modules/vehicles/atv.dm b/code/modules/vehicles/atv.dm index 9e02742c7c6..eedfbed358c 100644 --- a/code/modules/vehicles/atv.dm +++ b/code/modules/vehicles/atv.dm @@ -41,14 +41,6 @@ scan_range = 7 density = FALSE -/datum/armor/ridden_atv - melee = 50 - bullet = 25 - laser = 20 - bomb = 50 - fire = 60 - acid = 60 - /obj/vehicle/ridden/atv/turret/Initialize(mapload) . = ..() turret = new(loc) diff --git a/code/modules/vehicles/cars/vim.dm b/code/modules/vehicles/cars/vim.dm index add9d00d9a3..8079f7cc6b6 100644 --- a/code/modules/vehicles/cars/vim.dm +++ b/code/modules/vehicles/cars/vim.dm @@ -126,14 +126,6 @@ /// Whether the mech headlights are currently on. var/datum/port/output/are_headlights_on -/datum/armor/car_vim - melee = 70 - bullet = 40 - laser = 40 - bomb = 30 - fire = 80 - acid = 80 - /obj/item/circuit_component/vim/populate_ports() are_headlights_on = add_output_port("Are Headlights On", PORT_TYPE_NUMBER) chime = add_output_port("On Chime Used", PORT_TYPE_SIGNAL) diff --git a/code/modules/vehicles/mecha/combat/durand.dm b/code/modules/vehicles/mecha/combat/durand.dm index 7667f2fc95a..ca14358bcde 100644 --- a/code/modules/vehicles/mecha/combat/durand.dm +++ b/code/modules/vehicles/mecha/combat/durand.dm @@ -142,15 +142,6 @@ Expects a turf. Returns true if the attack should be blocked, false if not.*/ name = "Toggle an energy shield that blocks all attacks from the faced direction at a heavy power cost." button_icon_state = "mech_defense_mode_off" -/datum/armor/mecha_durand - melee = 40 - bullet = 35 - laser = 15 - energy = 10 - bomb = 20 - fire = 100 - acid = 100 - /datum/action/vehicle/sealed/mecha/mech_defense_mode/Trigger(trigger_flags, forced_state = FALSE) SEND_SIGNAL(chassis, COMSIG_MECHA_ACTION_TRIGGER, owner, args) //Signal sent to the mech, to be handed to the shield. See durand.dm for more details diff --git a/code/modules/vehicles/mecha/combat/gygax.dm b/code/modules/vehicles/mecha/combat/gygax.dm index 5da945a0893..57732016fba 100644 --- a/code/modules/vehicles/mecha/combat/gygax.dm +++ b/code/modules/vehicles/mecha/combat/gygax.dm @@ -38,14 +38,6 @@ name = "Toggle leg actuators overload" button_icon_state = "mech_overload_off" -/datum/armor/mecha_gygax - melee = 25 - bullet = 20 - laser = 30 - energy = 15 - fire = 100 - acid = 100 - /datum/action/vehicle/sealed/mecha/mech_overload_mode/Trigger(trigger_flags, forced_state = null) if(!owner || !chassis || !(owner in chassis.occupants)) return diff --git a/code/modules/vehicles/mecha/combat/marauder.dm b/code/modules/vehicles/mecha/combat/marauder.dm index 320f6225100..c24c368cdf0 100644 --- a/code/modules/vehicles/mecha/combat/marauder.dm +++ b/code/modules/vehicles/mecha/combat/marauder.dm @@ -46,15 +46,6 @@ MECHA_ARMOR = list(/obj/item/mecha_parts/mecha_equipment/armor/antiproj_armor_booster), ) -/datum/armor/mecha_marauder - melee = 50 - bullet = 55 - laser = 40 - energy = 30 - bomb = 30 - fire = 100 - acid = 100 - /obj/vehicle/sealed/mecha/marauder/add_cell(obj/item/stock_parts/cell/C=null) if(C) C.forceMove(src) @@ -66,15 +57,6 @@ name = "Smoke" button_icon_state = "mech_smoke" -/datum/armor/mecha_marauder - melee = 50 - bullet = 55 - laser = 40 - energy = 30 - bomb = 30 - fire = 100 - acid = 100 - /datum/action/vehicle/sealed/mecha/mech_smoke/Trigger(trigger_flags) if(!owner || !chassis || !(owner in chassis.occupants)) return @@ -87,15 +69,6 @@ name = "Zoom" button_icon_state = "mech_zoom_off" -/datum/armor/mecha_marauder - melee = 50 - bullet = 55 - laser = 40 - energy = 30 - bomb = 30 - fire = 100 - acid = 100 - /datum/action/vehicle/sealed/mecha/mech_zoom/Trigger(trigger_flags) if(!owner?.client || !chassis || !(owner in chassis.occupants)) return diff --git a/code/modules/vehicles/mecha/combat/phazon.dm b/code/modules/vehicles/mecha/combat/phazon.dm index 56c86e0e15a..9303d04c945 100644 --- a/code/modules/vehicles/mecha/combat/phazon.dm +++ b/code/modules/vehicles/mecha/combat/phazon.dm @@ -39,15 +39,6 @@ name = "Reconfigure arm microtool arrays" button_icon_state = "mech_damtype_brute" -/datum/armor/mecha_phazon - melee = 30 - bullet = 30 - laser = 30 - energy = 30 - bomb = 30 - fire = 100 - acid = 100 - /datum/action/vehicle/sealed/mecha/mech_switch_damtype/Trigger(trigger_flags) if(!owner || !chassis || !(owner in chassis.occupants)) return @@ -71,15 +62,6 @@ name = "Toggle Phasing" button_icon_state = "mech_phasing_off" -/datum/armor/mecha_phazon - melee = 30 - bullet = 30 - laser = 30 - energy = 30 - bomb = 30 - fire = 100 - acid = 100 - /datum/action/vehicle/sealed/mecha/mech_toggle_phasing/Trigger(trigger_flags) if(!owner || !chassis || !(owner in chassis.occupants)) return diff --git a/code/modules/vehicles/mecha/combat/savannah_ivanov.dm b/code/modules/vehicles/mecha/combat/savannah_ivanov.dm index af3e44c889c..a571b2fb261 100644 --- a/code/modules/vehicles/mecha/combat/savannah_ivanov.dm +++ b/code/modules/vehicles/mecha/combat/savannah_ivanov.dm @@ -78,15 +78,6 @@ ///skyfall builds up in charges every 2 seconds, when it reaches 5 charges the ability actually starts var/skyfall_charge_level = 0 -/datum/armor/mecha_savannah_ivanov - melee = 45 - bullet = 40 - laser = 30 - energy = 30 - bomb = 40 - fire = 100 - acid = 100 - /datum/action/vehicle/sealed/mecha/skyfall/Trigger(trigger_flags) if(!owner || !chassis || !(owner in chassis.occupants)) return @@ -253,15 +244,6 @@ var/rockets_left = 0 var/aiming_missile = FALSE -/datum/armor/mecha_savannah_ivanov - melee = 45 - bullet = 40 - laser = 30 - energy = 30 - bomb = 40 - fire = 100 - acid = 100 - /datum/action/vehicle/sealed/mecha/ivanov_strike/Destroy() if(aiming_missile) end_missile_targeting() @@ -372,15 +354,6 @@ ///reference to mecha following var/obj/vehicle/sealed/mecha/mecha -/datum/armor/mecha_savannah_ivanov - melee = 45 - bullet = 40 - laser = 30 - energy = 30 - bomb = 40 - fire = 100 - acid = 100 - /obj/effect/skyfall_landingzone/Initialize(mapload, obj/vehicle/sealed/mecha/mecha) . = ..() if(!mecha) diff --git a/code/modules/vehicles/mecha/working/clarke.dm b/code/modules/vehicles/mecha/working/clarke.dm index 3c711e4b25a..fabce1c9163 100644 --- a/code/modules/vehicles/mecha/working/clarke.dm +++ b/code/modules/vehicles/mecha/working/clarke.dm @@ -63,15 +63,6 @@ /// Var to avoid istype checking every time the topic button is pressed. This will only work inside Clarke mechs. var/obj/vehicle/sealed/mecha/working/clarke/hostmech -/datum/armor/working_clarke - melee = 20 - bullet = 10 - laser = 20 - energy = 10 - bomb = 60 - fire = 100 - acid = 100 - /obj/item/mecha_parts/mecha_equipment/orebox_manager/attach(obj/vehicle/sealed/mecha/M, attach_right = FALSE) . = ..() if(istype(M, /obj/vehicle/sealed/mecha/working/clarke)) @@ -94,15 +85,6 @@ button_icon_state = "mech_search_ruins" COOLDOWN_DECLARE(search_cooldown) -/datum/armor/working_clarke - melee = 20 - bullet = 10 - laser = 20 - energy = 10 - bomb = 60 - fire = 100 - acid = 100 - /datum/action/vehicle/sealed/mecha/mech_search_ruins/Trigger(trigger_flags) if(!owner || !chassis || !(owner in chassis.occupants)) return @@ -140,15 +122,6 @@ range_mid = 20 range_far = 50 -/datum/armor/working_clarke - melee = 20 - bullet = 10 - laser = 20 - energy = 10 - bomb = 60 - fire = 100 - acid = 100 - /datum/status_effect/agent_pinpointer/ruin/scan_for_target() return diff --git a/code/modules/vehicles/mecha/working/ripley.dm b/code/modules/vehicles/mecha/working/ripley.dm index fd7bce49926..b9e4e5ab745 100644 --- a/code/modules/vehicles/mecha/working/ripley.dm +++ b/code/modules/vehicles/mecha/working/ripley.dm @@ -147,15 +147,6 @@ desc = "An old, dusty mining Ripley." name = "\improper APLU \"Miner\"" -/datum/armor/ripley_mk2 - melee = 40 - bullet = 30 - laser = 30 - energy = 30 - bomb = 60 - fire = 100 - acid = 100 - /obj/vehicle/sealed/mecha/working/ripley/mining/Initialize(mapload) . = ..() take_damage(125) // Low starting health @@ -191,15 +182,6 @@ GLOBAL_DATUM(cargo_ripley, /obj/vehicle/sealed/mecha/working/ripley/cargo) base_icon_state = "hauler" max_integrity = 100 //Has half the health of a normal RIPLEY mech, so it's harder to use as a weapon. -/datum/armor/ripley_mk2 - melee = 40 - bullet = 30 - laser = 30 - energy = 30 - bomb = 60 - fire = 100 - acid = 100 - /obj/vehicle/sealed/mecha/working/ripley/cargo/Initialize(mapload) . = ..() if(cell) @@ -237,15 +219,6 @@ GLOBAL_DATUM(cargo_ripley, /obj/vehicle/sealed/mecha/working/ripley/cargo) equipment_slot = MECHA_UTILITY detachable = FALSE -/datum/armor/ripley_mk2 - melee = 40 - bullet = 30 - laser = 30 - energy = 30 - bomb = 60 - fire = 100 - acid = 100 - /obj/item/mecha_parts/mecha_equipment/ejector/get_snowflake_data() var/list/data = list("snowflake_id" = MECHA_SNOWFLAKE_ID_EJECTOR, "cargo" = list()) var/obj/vehicle/sealed/mecha/working/ripley/miner = chassis diff --git a/code/modules/vending/_vending.dm b/code/modules/vending/_vending.dm index 31ce2ec092f..f1df828bf4f 100644 --- a/code/modules/vending/_vending.dm +++ b/code/modules/vending/_vending.dm @@ -1264,11 +1264,6 @@ var/list/base64_cache = list() panel_type = "panel20" -/datum/armor/machinery_vending - melee = 20 - fire = 50 - acid = 70 - /obj/machinery/vending/custom/compartmentLoadAccessCheck(mob/user) . = FALSE if(!isliving(user)) @@ -1426,11 +1421,6 @@ icon_state = "refill_custom" custom_premium_price = PAYCHECK_CREW -/datum/armor/machinery_vending - melee = 20 - fire = 50 - acid = 70 - /obj/machinery/vending/custom/greed //name and like decided by the spawn icon_state = "greed" icon_deny = "greed-deny" diff --git a/modular_skyrat/master_files/code/modules/clothing/under/jobs/cargo.dm b/modular_skyrat/master_files/code/modules/clothing/under/jobs/cargo.dm index bf6d9accf03..bddc24e1481 100644 --- a/modular_skyrat/master_files/code/modules/clothing/under/jobs/cargo.dm +++ b/modular_skyrat/master_files/code/modules/clothing/under/jobs/cargo.dm @@ -25,11 +25,6 @@ armor_type = /datum/armor/utility_syndicate has_sensor = NO_SENSORS -/datum/armor/utility_syndicate - melee = 10 - fire = 50 - acid = 40 - /obj/item/clothing/under/rank/cargo/tech/skyrat/long name = "cargo technician's long jumpsuit" desc = "For crate-pushers who'd rather protect their legs than show them off." diff --git a/modular_skyrat/master_files/code/modules/clothing/under/jobs/command.dm b/modular_skyrat/master_files/code/modules/clothing/under/jobs/command.dm index 08dfb27fcd3..4cd45ad912a 100644 --- a/modular_skyrat/master_files/code/modules/clothing/under/jobs/command.dm +++ b/modular_skyrat/master_files/code/modules/clothing/under/jobs/command.dm @@ -117,11 +117,6 @@ armor_type = /datum/armor/utility_syndicate has_sensor = NO_SENSORS -/datum/armor/utility_syndicate - melee = 10 - fire = 50 - acid = 40 - /obj/item/clothing/under/rank/captain/skyrat/imperial/generic desc = "A grey naval suit with a rank badge denoting an Officer. Doesn't protect against blaster fire." name = "grey officer's naval jumpsuit" diff --git a/modular_skyrat/master_files/code/modules/clothing/under/jobs/engineering.dm b/modular_skyrat/master_files/code/modules/clothing/under/jobs/engineering.dm index 75761ddb1b7..01461e3ed7e 100644 --- a/modular_skyrat/master_files/code/modules/clothing/under/jobs/engineering.dm +++ b/modular_skyrat/master_files/code/modules/clothing/under/jobs/engineering.dm @@ -25,11 +25,6 @@ armor_type = /datum/armor/utility_syndicate has_sensor = NO_SENSORS -/datum/armor/utility_syndicate - melee = 10 - fire = 50 - acid = 40 - /obj/item/clothing/under/rank/engineering/engineer/skyrat/trouser name = "engineer's trousers" desc = "An engineering-orange set of trousers. Their waistband proudly displays an 'anti-radiation' symbol, though the effectiveness of radiation-proof-pants-only is still up for debate." diff --git a/modular_skyrat/master_files/code/modules/clothing/under/jobs/medical.dm b/modular_skyrat/master_files/code/modules/clothing/under/jobs/medical.dm index dbf5fb1d49c..0538d3123e5 100644 --- a/modular_skyrat/master_files/code/modules/clothing/under/jobs/medical.dm +++ b/modular_skyrat/master_files/code/modules/clothing/under/jobs/medical.dm @@ -43,11 +43,6 @@ * SCRUBS */ -/datum/armor/utility_syndicate - melee = 10 - fire = 50 - acid = 40 - /obj/item/clothing/under/rank/medical/scrubs/skyrat/red desc = "It's made of a special fiber that provides minor protection against biohazards. This one is in a deep red." icon_state = "scrubsred" diff --git a/modular_skyrat/master_files/code/modules/clothing/under/jobs/rnd.dm b/modular_skyrat/master_files/code/modules/clothing/under/jobs/rnd.dm index b8c8fe6dc48..732e8ea3c2b 100644 --- a/modular_skyrat/master_files/code/modules/clothing/under/jobs/rnd.dm +++ b/modular_skyrat/master_files/code/modules/clothing/under/jobs/rnd.dm @@ -30,11 +30,6 @@ armor_type = /datum/armor/utility_syndicate has_sensor = NO_SENSORS -/datum/armor/utility_syndicate - melee = 10 - fire = 50 - acid = 40 - /obj/item/clothing/under/rank/rnd/scientist/skyrat/hlscience name = "ridiculous scientist outfit" desc = "The tie is mandatory." diff --git a/modular_skyrat/modules/SEVA_suit/code/seva_obj.dm b/modular_skyrat/modules/SEVA_suit/code/seva_obj.dm index 0011a7ec3f0..8a8fe353fa9 100644 --- a/modular_skyrat/modules/SEVA_suit/code/seva_obj.dm +++ b/modular_skyrat/modules/SEVA_suit/code/seva_obj.dm @@ -47,17 +47,6 @@ resistance_flags = FIRE_PROOF supports_variations_flags = CLOTHING_SNOUTED_VARIATION //I can't find the snout sprite so I'm just gonna force it to do this -/datum/armor/hooded_seva - melee = 20 - bullet = 10 - laser = 10 - energy = 10 - bomb = 30 - bio = 50 - fire = 100 - acid = 50 - wound = 10 - /obj/item/clothing/mask/gas/seva name = "SEVA mask" desc = "A head-covering mask that can be connected to an external air supply. Intended for use with the SEVA Suit." diff --git a/modular_skyrat/modules/blueshield/code/blueshield_clothing.dm b/modular_skyrat/modules/blueshield/code/blueshield_clothing.dm index 1074ecec5e9..3f8fad686a8 100644 --- a/modular_skyrat/modules/blueshield/code/blueshield_clothing.dm +++ b/modular_skyrat/modules/blueshield/code/blueshield_clothing.dm @@ -39,9 +39,9 @@ icon = 'modular_skyrat/master_files/icons/obj/clothing/head/plasmaman_hats.dmi' worn_icon = 'modular_skyrat/master_files/icons/mob/clothing/head/plasmaman_head.dmi' icon_state = "bs_envirohelm" - armor_type = /datum/armor/plasmaman_blueshield + armor_type = /datum/armor/helmet_plasmaman_blueshield -/datum/armor/plasmaman_blueshield +/datum/armor/helmet_plasmaman_blueshield melee = 30 melee = 20 laser = 20 @@ -57,11 +57,11 @@ icon = 'modular_skyrat/master_files/icons/obj/clothing/under/plasmaman.dmi' worn_icon = 'modular_skyrat/master_files/icons/mob/clothing/under/plasmaman.dmi' icon_state = "bs_envirosuit" - armor_type = /datum/armor/plasmaman_blueshield + armor_type = /datum/armor/under_plasmaman_blueshield sensor_mode = SENSOR_COORDS random_sensor = FALSE -/datum/armor/plasmaman_blueshield +/datum/armor/under_plasmaman_blueshield melee = 10 laser = 10 bomb = 5 diff --git a/modular_skyrat/modules/emergency_spacesuit/code/emergency_spacesuit.dm b/modular_skyrat/modules/emergency_spacesuit/code/emergency_spacesuit.dm index 8fdf5e8cf27..7e06d94ed27 100644 --- a/modular_skyrat/modules/emergency_spacesuit/code/emergency_spacesuit.dm +++ b/modular_skyrat/modules/emergency_spacesuit/code/emergency_spacesuit.dm @@ -74,9 +74,6 @@ // Lil box to hold em in -/datum/armor/space_emergency - bio = 20 - /obj/item/storage/box/emergency_spacesuit name = "emergency space suit case" desc = "A small case containing an emergency space suit and helmet." diff --git a/modular_skyrat/modules/gladiator/code/game/objects/items/gladiator_items.dm b/modular_skyrat/modules/gladiator/code/game/objects/items/gladiator_items.dm index ffbdae3102f..28c774713e1 100644 --- a/modular_skyrat/modules/gladiator/code/game/objects/items/gladiator_items.dm +++ b/modular_skyrat/modules/gladiator/code/game/objects/items/gladiator_items.dm @@ -77,16 +77,6 @@ resistance_flags = INDESTRUCTIBLE actions_types = list(/datum/action/item_action/berserk_mode) -/datum/armor/berserker_gatsu - melee = 40 - bullet = 40 - laser = 20 - energy = 25 - bomb = 70 - bio = 100 - fire = 100 - acid = 100 - /obj/item/clothing/head/hooded/berserker/gatsu/Initialize(mapload) . = ..() ADD_TRAIT(src, TRAIT_NODROP, LOCKED_HELMET_TRAIT) diff --git a/modular_skyrat/modules/hev_suit/code/hev_suit.dm b/modular_skyrat/modules/hev_suit/code/hev_suit.dm index dd8bb205927..533e4722e5e 100644 --- a/modular_skyrat/modules/hev_suit/code/hev_suit.dm +++ b/modular_skyrat/modules/hev_suit/code/hev_suit.dm @@ -176,17 +176,6 @@ /// On first activation, we play the user a nice song! var/first_use = TRUE -/datum/armor/space_hev_suit - melee = 20 - bullet = 20 - laser = 20 - energy = 20 - bomb = 30 - bio = 40 - fire = 40 - acid = 40 - wound = 10 - /obj/item/clothing/suit/space/hev_suit/Initialize(mapload) . = ..() internal_radio = new(src) @@ -906,17 +895,6 @@ acid_static_cooldown = PCV_COOLDOWN_ACID suit_name = "PCV MARK II" -/datum/armor/hev_suit_pcv - melee = 30 - bullet = 30 - laser = 30 - energy = 30 - bomb = 30 - bio = 20 - fire = 20 - acid = 20 - wound = 10 - /obj/item/clothing/suit/space/hev_suit/pcv/AltClick(mob/living/user) reskin_obj(user) . = ..() diff --git a/modular_skyrat/modules/medievalcrate_skyrat/code/vintageitems.dm b/modular_skyrat/modules/medievalcrate_skyrat/code/vintageitems.dm index 44f87bdb2c9..7b70095ceb0 100644 --- a/modular_skyrat/modules/medievalcrate_skyrat/code/vintageitems.dm +++ b/modular_skyrat/modules/medievalcrate_skyrat/code/vintageitems.dm @@ -22,15 +22,6 @@ clothing_flags = null armor_type = /datum/armor/plate_larp -/datum/armor/plate_larp - melee = 10 - bullet = 5 - laser = 5 - energy = 5 - bomb = 5 - fire = 60 - acid = 60 - /obj/item/clothing/shoes/plate/larp/red icon_state = "crusader-red" diff --git a/modular_skyrat/modules/nanotrasen_rep/code/clothing.dm b/modular_skyrat/modules/nanotrasen_rep/code/clothing.dm index 23f3a7b22ee..d4afe12cf0e 100644 --- a/modular_skyrat/modules/nanotrasen_rep/code/clothing.dm +++ b/modular_skyrat/modules/nanotrasen_rep/code/clothing.dm @@ -49,9 +49,9 @@ icon_state = "beret_badge" /obj/item/clothing/head/beret/centcom_formal/nt_consultant - armor_type = /datum/armor/centcom_formal_nt_consultant + armor_type = /datum/armor/beret_centcom_formal_nt_consultant -/datum/armor/centcom_formal_nt_consultant +/datum/armor/beret_centcom_formal_nt_consultant melee = 15 bullet = 5 laser = 15 @@ -62,9 +62,9 @@ wound = 4 /obj/item/clothing/suit/armor/centcom_formal/nt_consultant - armor_type = /datum/armor/centcom_formal_nt_consultant + armor_type = /datum/armor/armor_centcom_formal_nt_consultant -/datum/armor/centcom_formal_nt_consultant +/datum/armor/armor_centcom_formal_nt_consultant melee = 35 bullet = 30 laser = 30 diff --git a/modular_skyrat/modules/novaya_ert/code/head.dm b/modular_skyrat/modules/novaya_ert/code/head.dm index b8b3891be8d..c3bdf047387 100644 --- a/modular_skyrat/modules/novaya_ert/code/head.dm +++ b/modular_skyrat/modules/novaya_ert/code/head.dm @@ -119,17 +119,6 @@ visor_flags = STOPSPRESSUREDAMAGE slowdown = 0 -/datum/armor/hev_suit_nri - melee = 25 - bullet = 25 - laser = 25 - energy = 25 - bomb = 25 - bio = 20 - fire = 20 - acid = 20 - wound = 10 - /obj/item/clothing/head/helmet/space/hev_suit/nri/captain name = "\improper VOSKHOD-2 powered combat armor helmet" desc = "A black composite polyurea coated graphene-plastitanium helmet with durathread inner padding, complete with a deployable airtight tinted plasmaglass visor and a kevlar-lined respirator system. 'НРИ - Оборонная Коллегия' is imprinted on the back." From 972c35066535665b36788e2b59d9e9bf6429bbb9 Mon Sep 17 00:00:00 2001 From: Zonespace <41448081+Zonespace27@users.noreply.github.com> Date: Fri, 13 Jan 2023 15:22:26 -0800 Subject: [PATCH 13/42] Mirror #71906 (#18666) [READY] DRAMATIC SHUTTLES!! You can now fly around the shuttle (#71906) You can move around shuttles during transport now! Instead of them teleporting you instantly into deepspace, you can move around somewhat depending on your space-mobility and grip-strength. ![image](https://user-images.githubusercontent.com/7501474/206866132-3fae024c-a8a2-4f4a-b4b8-37c96a254498.png) **Please watch the demonstration aswell, it should answer most questions:** https://www.youtube.com/watch?v=Os77qDOVSXE Interactions: - Being within armsreach of a wall or solid object means you 'cling', where the shuttle pull is very weak and you can basically run around the shutt;e (but dont fuck up or you're gone) - Being in range of nothing gives you a very heavy pull, you can barely resist if you have a decent jetpack - Objects are instantly power-yeeted - Being pulled or riding something excempts you from hyperspace pull - Touching a space tile while being on hyperspace dumps you in deepspace, you either go back to the shuttle or enjoy deepspace - On shuttle hyperspace tiles are a lot less dangerous, and will instead launch and freeze you instead of teleporting you into deepspace - In-case it wasn't obvious, you can rest outside the shuttle as long as something is blocking your path. I think it's funny but I might nerf it :cl: add: You can now fly around the shuttle during transit! Woohoo! You can either cling to the side or grab a jetpack and try and keep up with the shuttle! Carps can move around freely in hyperspace qol: Increased shuttle hyperspace size from 8 tiles to 16 /:cl: - [x] Find a way to detect when a shuttle arrives and do something with the shit left in hyperspace Things I will do in another PR: - Engines spit fire and hurt (almost finished but I want to keep this small) - Random shuttle events. You might run into dust meteors or migrating carps OR A CHANGELING INFILTRATOR - Hyperspace turfs on the shuttle pull you under the shuttle It's so much more immersive than being instantly teleported into deepspace. It gives you a chance to recover if you get spaced or for daredevils to look cool It's also just very cool idk Co-authored-by: Time-Green --- code/__DEFINES/dcs/signals/signals_turf.dm | 2 + code/__DEFINES/movement.dm | 2 + code/__DEFINES/shuttles.dm | 2 +- code/__DEFINES/subsystems.dm | 1 + code/__DEFINES/traits.dm | 4 + .../subsystem/movement/hyperspace_drift.dm | 6 + .../subsystem/movement/movement.dm | 4 +- .../subsystem/movement/movement_types.dm | 31 +++- code/datums/components/shuttle_cling.dm | 158 ++++++++++++++++++ code/game/atoms_movable.dm | 10 +- code/game/turfs/open/space/transit.dm | 75 +++++---- code/modules/antagonists/revenant/revenant.dm | 1 + .../space_management/space_reservation.dm | 4 + .../mob/living/basic/space_fauna/carp/carp.dm | 1 + .../simple_animal/hostile/space_dragon.dm | 1 + tgstation.dme | 2 + 16 files changed, 263 insertions(+), 41 deletions(-) create mode 100644 code/controllers/subsystem/movement/hyperspace_drift.dm create mode 100644 code/datums/components/shuttle_cling.dm diff --git a/code/__DEFINES/dcs/signals/signals_turf.dm b/code/__DEFINES/dcs/signals/signals_turf.dm index 61142cea565..36e6920b8d2 100644 --- a/code/__DEFINES/dcs/signals/signals_turf.dm +++ b/code/__DEFINES/dcs/signals/signals_turf.dm @@ -14,6 +14,8 @@ #define COMSIG_TURF_MULTIZ_NEW "turf_multiz_new" ///from base of turf/proc/onShuttleMove(): (turf/new_turf) #define COMSIG_TURF_ON_SHUTTLE_MOVE "turf_on_shuttle_move" +///from base of /datum/turf_reservation/proc/Release: (datum/turf_reservation/reservation) +#define COMSIG_TURF_RESERVATION_RELEASED "turf_reservation_released" ///from /turf/open/temperature_expose(datum/gas_mixture/air, exposed_temperature) #define COMSIG_TURF_EXPOSE "turf_expose" ///from /turf/proc/immediate_calculate_adjacent_turfs() diff --git a/code/__DEFINES/movement.dm b/code/__DEFINES/movement.dm index ac56ca7097c..041e2bc2b24 100644 --- a/code/__DEFINES/movement.dm +++ b/code/__DEFINES/movement.dm @@ -34,6 +34,8 @@ GLOBAL_VAR_INIT(glide_size_multiplier, 1.0) #define MOVEMENT_LOOP_IGNORE_PRIORITY (1<<1) ///Should we override the loop's glide? #define MOVEMENT_LOOP_IGNORE_GLIDE (1<<2) +///Should we not update our movables dir on move? +#define MOVEMENT_LOOP_NO_DIR_UPDATE (1<<3) //Index defines for movement bucket data packets #define MOVEMENT_BUCKET_TIME 1 diff --git a/code/__DEFINES/shuttles.dm b/code/__DEFINES/shuttles.dm index 5b906d97bf3..1d721ef3f1d 100644 --- a/code/__DEFINES/shuttles.dm +++ b/code/__DEFINES/shuttles.dm @@ -44,7 +44,7 @@ #define TRANSIT_REQUEST 1 #define TRANSIT_READY 2 -#define SHUTTLE_TRANSIT_BORDER 8 +#define SHUTTLE_TRANSIT_BORDER 16 #define PARALLAX_LOOP_TIME 25 #define HYPERSPACE_END_TIME 5 diff --git a/code/__DEFINES/subsystems.dm b/code/__DEFINES/subsystems.dm index 68d7bfc6c4a..a52b3585edc 100644 --- a/code/__DEFINES/subsystems.dm +++ b/code/__DEFINES/subsystems.dm @@ -204,6 +204,7 @@ #define FIRE_PRIORITY_FLUIDS 20 #define FIRE_PRIORITY_AIR 20 #define FIRE_PRIORITY_NPC 20 +#define FIRE_PRIORITY_HYPERSPACE_DRIFT 20 #define FIRE_PRIORITY_NPC_MOVEMENT 21 #define FIRE_PRIORITY_NPC_ACTIONS 22 #define FIRE_PRIORITY_PATHFINDING 23 diff --git a/code/__DEFINES/traits.dm b/code/__DEFINES/traits.dm index 08fa4f6cbff..5e400ffe216 100644 --- a/code/__DEFINES/traits.dm +++ b/code/__DEFINES/traits.dm @@ -319,6 +319,10 @@ Remember to update _globalvars/traits.dm if you're adding/removing/renaming trai /// Increases chance of getting special traumas, makes them harder to cure #define TRAIT_SPECIAL_TRAUMA_BOOST "special_trauma_boost" #define TRAIT_SPACEWALK "spacewalk" +/// Sanity trait to keep track of when we're in hyperspace and add the appropriate element if we werent +#define TRAIT_HYPERSPACED "hyperspaced" +///Gives the movable free hyperspace movement without being pulled during shuttle transit +#define TRAIT_FREE_HYPERSPACE_MOVEMENT "free_hyperspace_movement" /// Gets double arcade prizes #define TRAIT_GAMERGOD "gamer-god" #define TRAIT_GIANT "giant" diff --git a/code/controllers/subsystem/movement/hyperspace_drift.dm b/code/controllers/subsystem/movement/hyperspace_drift.dm new file mode 100644 index 00000000000..bd1ac67a6f0 --- /dev/null +++ b/code/controllers/subsystem/movement/hyperspace_drift.dm @@ -0,0 +1,6 @@ +///This subsystem handles the hyperspace shuttle pull movement loops +MOVEMENT_SUBSYSTEM_DEF(hyperspace_drift) + name = "Hyperspace Drift" + priority = FIRE_PRIORITY_HYPERSPACE_DRIFT + flags = SS_NO_INIT|SS_TICKER + runlevels = RUNLEVEL_GAME | RUNLEVEL_POSTGAME diff --git a/code/controllers/subsystem/movement/movement.dm b/code/controllers/subsystem/movement/movement.dm index 39761b633a8..c43debda543 100644 --- a/code/controllers/subsystem/movement/movement.dm +++ b/code/controllers/subsystem/movement/movement.dm @@ -104,12 +104,12 @@ SUBSYSTEM_DEF(movement) smash_bucket(bucket_time = loop.timer) // We can't pass an index in for context because we don't know our position /datum/controller/subsystem/movement/proc/add_loop(datum/move_loop/add) - add.start_loop() + add.loop_started() if(QDELETED(add)) return queue_loop(add) /datum/controller/subsystem/movement/proc/remove_loop(datum/move_loop/remove) dequeue_loop(remove) - remove.stop_loop() + remove.loop_stopped() diff --git a/code/controllers/subsystem/movement/movement_types.dm b/code/controllers/subsystem/movement/movement_types.dm index a3d1165b8a3..2d3f3ba84b0 100644 --- a/code/controllers/subsystem/movement/movement_types.dm +++ b/code/controllers/subsystem/movement/movement_types.dm @@ -25,6 +25,8 @@ var/timer = 0 ///Is this loop running or not var/running = FALSE + ///Track if we're currently paused + var/paused = FALSE /datum/move_loop/New(datum/movement_packet/owner, datum/controller/subsystem/movement/controller, atom/moving, priority, flags, datum/extra_info) src.owner = owner @@ -51,7 +53,8 @@ return TRUE return FALSE -/datum/move_loop/proc/start_loop() +///Called when a loop is starting by a movement subsystem +/datum/move_loop/proc/loop_started() SHOULD_CALL_PARENT(TRUE) SEND_SIGNAL(src, COMSIG_MOVELOOP_START) running = TRUE @@ -62,7 +65,8 @@ return timer = world.time + delay -/datum/move_loop/proc/stop_loop() +///Called when a loop is stopped, doesn't stop the loop itself +/datum/move_loop/proc/loop_stopped() SHOULD_CALL_PARENT(TRUE) running = FALSE SEND_SIGNAL(src, COMSIG_MOVELOOP_STOP) @@ -126,6 +130,25 @@ /datum/move_loop/proc/move() return FALSE + +///Pause our loop untill restarted with resume_loop() +/datum/move_loop/proc/pause_loop() + if(!controller || !running || paused) //we dead + return + + //Dequeue us from our current bucket + controller.dequeue_loop(src) + paused = TRUE + +///Resume our loop after being paused by pause_loop() +/datum/move_loop/proc/resume_loop() + if(!controller || !running || !paused) + return + + controller.queue_loop(src) + timer = world.time + paused = FALSE + ///Removes the atom from some movement subsystem. Defaults to SSmovement /datum/controller/subsystem/move_manager/proc/stop_looping(atom/movable/moving, datum/controller/subsystem/movement/subsystem = SSmovement) var/datum/movement_packet/our_info = moving.move_packet @@ -168,7 +191,7 @@ /datum/move_loop/move/move() var/atom/old_loc = moving.loc - moving.Move(get_step(moving, direction), direction) + moving.Move(get_step(moving, direction), direction, FALSE, !(flags & MOVEMENT_LOOP_NO_DIR_UPDATE)) // We cannot rely on the return value of Move(), we care about teleports and it doesn't // Moving also can be null on occasion, if the move deleted it and therefor us return old_loc != moving?.loc @@ -376,7 +399,7 @@ return TRUE return FALSE -/datum/move_loop/has_target/jps/start_loop() +/datum/move_loop/has_target/jps/loop_started() . = ..() INVOKE_ASYNC(src, PROC_REF(recalculate_path)) diff --git a/code/datums/components/shuttle_cling.dm b/code/datums/components/shuttle_cling.dm new file mode 100644 index 00000000000..0f2042ede68 --- /dev/null +++ b/code/datums/components/shuttle_cling.dm @@ -0,0 +1,158 @@ + +//Below defines are for the is_holding_on proc to see how well they're holding on and respond accordingly +///Instead of a high move force we just get launched away dramatically because we're that hopeless +#define SUPER_NOT_HOLDING_ON 0 +///We're not holdin on and will get thrown off +#define NOT_HOLDING_ON 1 +///We're holding on, but will be pulled slowly +#define CLINGING 2 +///We're holding on really well and aren't suffering from any pull +#define ALL_GOOD 3 + +///Gets added to all movables that enter hyperspace and are supposed to suffer from "hyperspace drift" +///This lets people fly around shuttles during transit using jetpacks, or cling to the side if they got a spacesuit +///Dumping into deepspace is handled by the hyperspace turf, not the component. +///Not giving something this component while on hyperspace is safe, it just means free movement like carps +/datum/component/shuttle_cling + ///The direction we push stuff towards + var/direction + ///Path to the hyperspace tile, so we know if we're in hyperspace + var/hyperspace_type = /turf/open/space/transit + + ///Our moveloop, handles the transit pull + var/datum/move_loop/move/hyperloop + + ///If we can "hold on", how often do we move? + var/clinging_move_delay = 1 SECONDS + ///If we can't hold onto anything, how fast do we get pulled away? + var/not_clinging_move_delay = 0.2 SECONDS + +/datum/component/shuttle_cling/Initialize(direction) + . = ..() + + if(!ismovable(parent)) + return COMPONENT_INCOMPATIBLE + + src.direction = direction + + ADD_TRAIT(parent, TRAIT_HYPERSPACED, src) + + RegisterSignals(parent, list(COMSIG_MOVABLE_MOVED, COMSIG_MOVABLE_UNBUCKLE, COMSIG_ATOM_NO_LONGER_PULLED), PROC_REF(update_state)) + + hyperloop = SSmove_manager.move(moving = parent, direction = direction, delay = not_clinging_move_delay, subsystem = SShyperspace_drift, priority = MOVEMENT_ABOVE_SPACE_PRIORITY, flags = MOVEMENT_LOOP_START_FAST | MOVEMENT_LOOP_NO_DIR_UPDATE) + + update_state(parent) //otherwise we'll get moved 1 tile before we can correct ourselves, which isnt super bad but just looks jank + +///Check if we're in hyperspace and our state in hyperspace +/datum/component/shuttle_cling/proc/update_state() + SIGNAL_HANDLER + + if(!is_on_hyperspace(parent)) + qdel(src) + return + + var/should_loop = FALSE + + switch(is_holding_on(parent)) + if(SUPER_NOT_HOLDING_ON) + launch_very_hard(parent) + should_loop = TRUE + if(NOT_HOLDING_ON) + hyperloop.set_delay(not_clinging_move_delay) + should_loop = TRUE + hyperloop.direction = direction //we're not close to anything so reset direction if we got diagonalized + if(CLINGING) + hyperloop.set_delay(clinging_move_delay) + should_loop = TRUE + update_drift_direction(parent) + if(ALL_GOOD) + should_loop = FALSE + + //Do pause/unpause/nothing for the hyperloop + if(should_loop && hyperloop.paused) + hyperloop.resume_loop() + else if(!should_loop && !hyperloop.paused) + hyperloop.pause_loop() + +///Check if we're "holding on" to the shuttle +/datum/component/shuttle_cling/proc/is_holding_on(atom/movable/movee) + if(movee.pulledby || !isturf(movee.loc)) + return ALL_GOOD + + if(!isliving(movee)) + if(is_tile_solid(get_step(movee, direction))) //something is blocking us so do the cool drift + return CLINGING + return SUPER_NOT_HOLDING_ON + + var/mob/living/living = movee + + //Check if we can interact with stuff (checks for alive, arms, stun, etc) + if(!living.canUseTopic(living, be_close = TRUE, no_dexterity = FALSE, no_tk = TRUE, need_hands = TRUE)) + return NOT_HOLDING_ON + + if(living.buckled) + return ALL_GOOD + + for(var/atom/handlebar in range(living, 1)) + if(isclosedturf(handlebar)) + return CLINGING + if(isobj(handlebar)) + var/obj/object = handlebar + if(object.anchored && object.density) + return CLINGING + return NOT_HOLDING_ON + +///Are we on a hyperspace tile? There's some special bullshit with lattices so we just wrap this check +/datum/component/shuttle_cling/proc/is_on_hyperspace(atom/movable/clinger) + if(istype(clinger.loc, hyperspace_type) && !(locate(/obj/structure/lattice) in clinger.loc)) + return TRUE + return FALSE + +///Launch the atom very hard, away from hyperspace +/datum/component/shuttle_cling/proc/launch_very_hard(atom/movable/byebye) + byebye.safe_throw_at(get_edge_target_turf(byebye, direction), 200, 1, spin = TRUE, force = MOVE_FORCE_EXTREMELY_STRONG) + +///Check if we arent just being blocked, and if we are give us some diagonal push so we cant just infinitely cling to the front +/datum/component/shuttle_cling/proc/update_drift_direction(atom/movable/clinger) + var/turf/potential_blocker = get_step(clinger, direction) + //We are not being blocked, so just give us cardinal drift + if(!is_tile_solid(potential_blocker)) + hyperloop.direction = direction + return + + //We're already moving diagonally + if(hyperloop.direction != direction) + var/side_dir = hyperloop.direction - direction + + if(is_tile_solid(get_step(clinger, side_dir))) + hyperloop.direction = direction + turn(side_dir, 180) //We're bumping a wall to the side, so switch to the other side_dir (yes this adds pingpong protocol) + return + + //Get the directions from the side of our current drift direction (so if we have drift south, get all cardinals and remove north and south, leaving only east and west) + var/side_dirs = shuffle(GLOB.cardinals - direction - turn(direction, 180)) + + //We check if one side is solid + if(!is_tile_solid(get_step(clinger, side_dirs[1]))) + hyperloop.direction = direction + side_dirs[1] + else //if one side isnt solid, send it to the other side (it can also be solid but we dont care cause we're boxed in then and not like itll matter much then) + hyperloop.direction = direction + side_dirs[2] + +///Check if it's a closed turf or contains a dense object +/datum/component/shuttle_cling/proc/is_tile_solid(turf/maybe_solid) + if(isclosedturf(maybe_solid)) + return TRUE + for(var/obj/blocker in maybe_solid.contents) + if(blocker.density) + return TRUE + return FALSE + +/datum/component/shuttle_cling/Destroy(force, silent) + REMOVE_TRAIT(parent, TRAIT_HYPERSPACED, src) + QDEL_NULL(hyperloop) + + return ..() + +#undef SUPER_NOT_HOLDING_ON +#undef NOT_HOLDING_ON +#undef CLINGING +#undef ALL_GOOD diff --git a/code/game/atoms_movable.dm b/code/game/atoms_movable.dm index cb5ad2241a0..fa8db5fe2f0 100644 --- a/code/game/atoms_movable.dm +++ b/code/game/atoms_movable.dm @@ -516,7 +516,7 @@ // Here's where we rewrite how byond handles movement except slightly different // To be removed on step_ conversion // All this work to prevent a second bump -/atom/movable/Move(atom/newloc, direction, glide_size_override = 0) +/atom/movable/Move(atom/newloc, direction, glide_size_override = 0, update_dir = TRUE) . = FALSE if(!newloc || newloc == loc) return @@ -524,7 +524,7 @@ if(!direction) direction = get_dir(src, newloc) - if(set_dir_on_move && dir != direction && !face_mouse) // SKYRAT EDIT CHANGE + if(set_dir_on_move && dir != direction && update_dir && !face_mouse) // SKYRAT EDIT - && !face_mouse setDir(direction) var/is_multi_tile_object = is_multi_tile_object(src) @@ -589,7 +589,7 @@ //////////////////////////////////////// -/atom/movable/Move(atom/newloc, direct, glide_size_override = 0) +/atom/movable/Move(atom/newloc, direct, glide_size_override = 0, update_dir = TRUE) var/atom/movable/pullee = pulling var/turf/current_turf = loc if(!moving_from_pull) @@ -650,7 +650,7 @@ moving_diagonally = SECOND_DIAG_STEP . = step(src, SOUTH) if(moving_diagonally == SECOND_DIAG_STEP) - if(!. && set_dir_on_move && !face_mouse) // SKYRAT EDIT CHANGE + if(!. && set_dir_on_move && update_dir && !face_mouse) // SKYRAT EDIT CHANGE - && !face_mouse setDir(first_step_dir) else if(!inertia_moving) newtonian_move(direct) @@ -691,7 +691,7 @@ last_move = direct - if(set_dir_on_move && dir != direct && !face_mouse) // SKYRAT EDIT CHANGE + if(set_dir_on_move && dir != direct && update_dir && !face_mouse) // SKYRAT EDIT CHANGE - && !face_mouse) setDir(direct) if(. && has_buckled_mobs() && !handle_buckled_mob_movement(loc, direct, glide_size_override)) //movement failed due to buckled mob(s) . = FALSE diff --git a/code/game/turfs/open/space/transit.dm b/code/game/turfs/open/space/transit.dm index 77d6ad3f1ea..74ba0e6fb0a 100644 --- a/code/game/turfs/open/space/transit.dm +++ b/code/game/turfs/open/space/transit.dm @@ -7,36 +7,54 @@ flags_1 = NOJAUNT //This line goes out to every wizard that ever managed to escape the den. I'm sorry. explosive_resistance = INFINITY +/turf/open/space/transit/Initialize(mapload) + . = ..() + update_appearance() + RegisterSignal(src, COMSIG_TURF_RESERVATION_RELEASED, PROC_REF(launch_contents)) + + for(var/atom/movable/movable in src) + throw_atom(movable) + +/turf/open/space/transit/clear_signal_refs() + //Signals are NOT removed from turfs upon replacement, and we get replaced ALOT, so unregister our signal + UnregisterSignal(src, COMSIG_TURF_RESERVATION_RELEASED) + /turf/open/space/transit/get_smooth_underlay_icon(mutable_appearance/underlay_appearance, turf/asking_turf, adjacency_dir) . = ..() underlay_appearance.icon_state = "speedspace_ns_[get_transit_state(asking_turf)]" underlay_appearance.transform = turn(matrix(), get_transit_angle(asking_turf)) -/turf/open/space/transit/south - dir = SOUTH +/turf/open/space/transit/update_icon() + . = ..() + transform = turn(matrix(), get_transit_angle(src)) -/turf/open/space/transit/north - dir = NORTH - -/turf/open/space/transit/horizontal - dir = WEST - -/turf/open/space/transit/west - dir = WEST - -/turf/open/space/transit/east - dir = EAST +/turf/open/space/transit/update_icon_state() + icon_state = "speedspace_ns_[get_transit_state(src)]" + return ..() /turf/open/space/transit/Entered(atom/movable/arrived, atom/old_loc, list/atom/old_locs) . = ..() - if(!locate(/obj/structure/lattice) in src) - throw_atom(arrived) + + if(!HAS_TRAIT(arrived, TRAIT_HYPERSPACED) && !HAS_TRAIT(arrived, TRAIT_FREE_HYPERSPACE_MOVEMENT)) + arrived.AddComponent(/datum/component/shuttle_cling, turn(dir, 180), old_loc) + +/turf/open/space/transit/Exited(atom/movable/gone, direction) + . = ..() + + var/turf/location = gone.loc + if(istype(location, /turf/open/space) && !istype(location, src.type))//they got forced out of transit area into default space tiles + throw_atom(gone) //launch them into game space, away from transitspace + +///Get rid of all our contents, called when our reservation is released (which in our case means the shuttle arrived) +/turf/open/space/transit/proc/launch_contents(datum/turf_reservation/reservation) + SIGNAL_HANDLER + + for(var/atom/movable/movable in contents) + throw_atom(movable) /turf/open/space/transit/proc/throw_atom(atom/movable/AM) if(!AM || istype(AM, /obj/docking_port) || istype(AM, /obj/effect/abstract)) return - if(AM.loc != src) // Multi-tile objects are "in" multiple locs but its loc is it's true placement. - return // Don't move multi tile objects if their origin isn't in transit var/max = world.maxx-TRANSITIONEDGE var/min = 1+TRANSITIONEDGE @@ -71,24 +89,23 @@ var/turf/T = locate(_x, _y, _z) AM.forceMove(T) - /turf/open/space/transit/CanBuildHere() return SSshuttle.is_in_shuttle_bounds(src) +/turf/open/space/transit/south + dir = SOUTH -/turf/open/space/transit/Initialize(mapload) - . = ..() - update_appearance() - for(var/atom/movable/AM in src) - throw_atom(AM) +/turf/open/space/transit/north + dir = NORTH -/turf/open/space/transit/update_icon() - . = ..() - transform = turn(matrix(), get_transit_angle(src)) +/turf/open/space/transit/horizontal + dir = WEST -/turf/open/space/transit/update_icon_state() - icon_state = "speedspace_ns_[get_transit_state(src)]" - return ..() +/turf/open/space/transit/west + dir = WEST + +/turf/open/space/transit/east + dir = EAST /proc/get_transit_state(turf/T) var/p = 9 diff --git a/code/modules/antagonists/revenant/revenant.dm b/code/modules/antagonists/revenant/revenant.dm index acb8709bd34..a2613f4477f 100644 --- a/code/modules/antagonists/revenant/revenant.dm +++ b/code/modules/antagonists/revenant/revenant.dm @@ -71,6 +71,7 @@ AddElement(/datum/element/simple_flying) ADD_TRAIT(src, TRAIT_SPACEWALK, INNATE_TRAIT) ADD_TRAIT(src, TRAIT_SIXTHSENSE, INNATE_TRAIT) + ADD_TRAIT(src, TRAIT_FREE_HYPERSPACE_MOVEMENT, INNATE_TRAIT) // Starting spells var/datum/action/cooldown/spell/night_vision/revenant/vision = new(src) diff --git a/code/modules/mapping/space_management/space_reservation.dm b/code/modules/mapping/space_management/space_reservation.dm index 48811b63b6a..b6ec8801a7e 100644 --- a/code/modules/mapping/space_management/space_reservation.dm +++ b/code/modules/mapping/space_management/space_reservation.dm @@ -17,6 +17,10 @@ var/list/reserved_copy = reserved_turfs.Copy() SSmapping.used_turfs -= reserved_turfs reserved_turfs = list() + + for(var/turf/reserved_turf as anything in reserved_copy) + SEND_SIGNAL(reserved_turf, COMSIG_TURF_RESERVATION_RELEASED, src) + // Makes the linter happy, even tho we don't await this INVOKE_ASYNC(SSmapping, TYPE_PROC_REF(/datum/controller/subsystem/mapping, reserve_turfs), reserved_copy) diff --git a/code/modules/mob/living/basic/space_fauna/carp/carp.dm b/code/modules/mob/living/basic/space_fauna/carp/carp.dm index 5869cf37be4..24d75d0e23f 100644 --- a/code/modules/mob/living/basic/space_fauna/carp/carp.dm +++ b/code/modules/mob/living/basic/space_fauna/carp/carp.dm @@ -88,6 +88,7 @@ apply_colour() ADD_TRAIT(src, TRAIT_HEALS_FROM_CARP_RIFTS, INNATE_TRAIT) ADD_TRAIT(src, TRAIT_SPACEWALK, INNATE_TRAIT) + ADD_TRAIT(src, TRAIT_FREE_HYPERSPACE_MOVEMENT, INNATE_TRAIT) if (cell_line) AddElement(/datum/element/swabable, cell_line, CELL_VIRUS_TABLE_GENERIC_MOB, 1, 5) diff --git a/code/modules/mob/living/simple_animal/hostile/space_dragon.dm b/code/modules/mob/living/simple_animal/hostile/space_dragon.dm index 8971a45a01e..bfce764fa7b 100644 --- a/code/modules/mob/living/simple_animal/hostile/space_dragon.dm +++ b/code/modules/mob/living/simple_animal/hostile/space_dragon.dm @@ -86,6 +86,7 @@ . = ..() AddElement(/datum/element/simple_flying) ADD_TRAIT(src, TRAIT_SPACEWALK, INNATE_TRAIT) + ADD_TRAIT(src, TRAIT_FREE_HYPERSPACE_MOVEMENT, INNATE_TRAIT) ADD_TRAIT(src, TRAIT_NO_FLOATING_ANIM, INNATE_TRAIT) ADD_TRAIT(src, TRAIT_HEALS_FROM_CARP_RIFTS, INNATE_TRAIT) AddElement(/datum/element/content_barfer) diff --git a/tgstation.dme b/tgstation.dme index 38fd3790188..b20d6c6a13f 100644 --- a/tgstation.dme +++ b/tgstation.dme @@ -674,6 +674,7 @@ #include "code\controllers\subsystem\weather.dm" #include "code\controllers\subsystem\wiremod_composite.dm" #include "code\controllers\subsystem\movement\ai_movement.dm" +#include "code\controllers\subsystem\movement\hyperspace_drift.dm" #include "code\controllers\subsystem\movement\move_handler.dm" #include "code\controllers\subsystem\movement\movement.dm" #include "code\controllers\subsystem\movement\movement_types.dm" @@ -1003,6 +1004,7 @@ #include "code\datums\components\shell.dm" #include "code\datums\components\shielded.dm" #include "code\datums\components\shrink.dm" +#include "code\datums\components\shuttle_cling.dm" #include "code\datums\components\shy.dm" #include "code\datums\components\shy_in_room.dm" #include "code\datums\components\sign_language.dm" From b0f3c6b7b9ca0a3cb9b0463d9760cb21dd210073 Mon Sep 17 00:00:00 2001 From: Zonespace <41448081+Zonespace27@users.noreply.github.com> Date: Fri, 13 Jan 2023 15:22:55 -0800 Subject: [PATCH 14/42] Mirrors #72411 (#18667) Adds blob minions to biohazards category (#72411) ## About The Pull Request GBP no update please I thought I did this while working on blob minion antag datums but alas, I got carried away with refactors and features to notice. ## Why It's Good For The Game Sorts orbit menu a little better ## Changelog :cl: fix: Fixed blob minions getting their own antag category /:cl: Co-authored-by: Mothblocks <35135081+Mothblocks@users.noreply.github.com> Co-authored-by: Jeremiah <42397676+jlsnow301@users.noreply.github.com> Co-authored-by: Mothblocks <35135081+Mothblocks@users.noreply.github.com> --- code/modules/antagonists/blob/minions/blobbernaut.dm | 1 + code/modules/antagonists/blob/minions/blobspore.dm | 1 + tgui/packages/tgui/interfaces/Orbit/constants.ts | 5 ++++- 3 files changed, 6 insertions(+), 1 deletion(-) diff --git a/code/modules/antagonists/blob/minions/blobbernaut.dm b/code/modules/antagonists/blob/minions/blobbernaut.dm index 56e9846874e..b40aba1ed85 100644 --- a/code/modules/antagonists/blob/minions/blobbernaut.dm +++ b/code/modules/antagonists/blob/minions/blobbernaut.dm @@ -1,5 +1,6 @@ /datum/antagonist/blobbernaut name = "\improper Blobbernaut" + antagpanel_category = "Biohazards" show_name_in_check_antagonists = TRUE show_to_ghosts = TRUE diff --git a/code/modules/antagonists/blob/minions/blobspore.dm b/code/modules/antagonists/blob/minions/blobspore.dm index 97b5b812628..c1d8f5595b0 100644 --- a/code/modules/antagonists/blob/minions/blobspore.dm +++ b/code/modules/antagonists/blob/minions/blobspore.dm @@ -1,5 +1,6 @@ /datum/antagonist/blobspore name = "\improper Blob Spore" + antagpanel_category = "Biohazards" show_name_in_check_antagonists = TRUE show_to_ghosts = TRUE diff --git a/tgui/packages/tgui/interfaces/Orbit/constants.ts b/tgui/packages/tgui/interfaces/Orbit/constants.ts index cd5348e79ff..fdd263f1c04 100644 --- a/tgui/packages/tgui/interfaces/Orbit/constants.ts +++ b/tgui/packages/tgui/interfaces/Orbit/constants.ts @@ -12,6 +12,8 @@ export const ANTAG2GROUP = { 'Ash Walker': 'Ash Walkers', 'Blob': 'Biohazards', + 'Blob Spore': 'Biohazards', + 'Blobbernaut': 'Biohazards', 'Sentient Disease': 'Biohazards', 'Admiral': 'CentCom', @@ -37,6 +39,7 @@ export const ANTAG2GROUP = { 'Religious Response Officer': 'Emergency Response Team', 'Janitorial Response Officer': 'Emergency Response Team', 'Entertainment Response Officer': 'Emergency Response Team', + 'Emergency Response Officer': 'Emergency Response Team', 'Nuclear Operative': 'Nuclear Operatives', 'Nuclear Operative Leader': 'Nuclear Operatives', @@ -53,6 +56,6 @@ export const THREAT = { } as const; export const HEALTH = { - Good: 69, + Good: 69, // nice Average: 19, } as const; From 53c77b06fb8331acb765299d7f18ca8c2851fbec Mon Sep 17 00:00:00 2001 From: Zonespace <41448081+Zonespace27@users.noreply.github.com> Date: Fri, 13 Jan 2023 15:26:25 -0800 Subject: [PATCH 15/42] Mirrors #72429 (#18668) You can no longer instantly build carving blocks/mineral doors (#72429) You can no longer instantly build carving blocks/airlocks Added replaced a few 1's with true's ## Why It's Good For The Game SO YOU DONT PLOP DOWN 20 STRUCTURES WHILE A OFFICER IS CHASING YOU FORTNITE STYLE ## Changelog :cl: Improvedname fix: fixes being able to instantly build carving blocks/mineral doors /:cl: Co-authored-by: jughu --- code/controllers/subsystem/materials.dm | 4 +- .../objects/items/stacks/sheets/mineral.dm | 24 +++++------ .../items/stacks/sheets/sheet_types.dm | 42 +++++++++---------- 3 files changed, 35 insertions(+), 35 deletions(-) diff --git a/code/controllers/subsystem/materials.dm b/code/controllers/subsystem/materials.dm index fda766e3562..9f342a0c976 100644 --- a/code/controllers/subsystem/materials.dm +++ b/code/controllers/subsystem/materials.dm @@ -26,11 +26,11 @@ SUBSYSTEM_DEF(materials) new /datum/stack_recipe("Toilet", /obj/structure/toilet/greyscale, one_per_turf = TRUE, on_solid_ground = TRUE, applies_mats = TRUE, category = CAT_FURNITURE), new /datum/stack_recipe("Sink Frame", /obj/structure/sinkframe, one_per_turf = TRUE, on_solid_ground = TRUE, applies_mats = TRUE, category = CAT_FURNITURE), new /datum/stack_recipe("Material floor tile", /obj/item/stack/tile/material, 1, 4, 20, applies_mats = TRUE, category = CAT_TILES), - new /datum/stack_recipe("Material airlock assembly", /obj/structure/door_assembly/door_assembly_material, 4, time = 50, one_per_turf = TRUE, on_solid_ground = TRUE, applies_mats = TRUE, category = CAT_DOORS), + new /datum/stack_recipe("Material airlock assembly", /obj/structure/door_assembly/door_assembly_material, 4, time = 5 SECONDS, one_per_turf = TRUE, on_solid_ground = TRUE, applies_mats = TRUE, category = CAT_DOORS), ) ///List of stackcrafting recipes for materials using rigid recipes var/list/rigid_stack_recipes = list( - new /datum/stack_recipe("Carving block", /obj/structure/carving_block, 5, one_per_turf = TRUE, on_solid_ground = TRUE, applies_mats = TRUE, category = CAT_STRUCTURE), + new /datum/stack_recipe("Carving block", /obj/structure/carving_block, 5, time = 3 SECONDS, one_per_turf = TRUE, on_solid_ground = TRUE, applies_mats = TRUE, category = CAT_STRUCTURE), ) ///Ran on initialize, populated the materials and materials_by_category dictionaries with their appropiate vars (See these variables for more info) diff --git a/code/game/objects/items/stacks/sheets/mineral.dm b/code/game/objects/items/stacks/sheets/mineral.dm index d25c1725cd4..a903ae2bb08 100644 --- a/code/game/objects/items/stacks/sheets/mineral.dm +++ b/code/game/objects/items/stacks/sheets/mineral.dm @@ -24,8 +24,8 @@ Mineral Sheets */ GLOBAL_LIST_INIT(sandstone_recipes, list ( \ - new/datum/stack_recipe("pile of dirt", /obj/machinery/hydroponics/soil, 3, time = 10, one_per_turf = TRUE, on_solid_ground = TRUE, category = CAT_TOOLS), \ - new/datum/stack_recipe("sandstone door", /obj/structure/mineral_door/sandstone, 10, one_per_turf = TRUE, on_solid_ground = TRUE, applies_mats = TRUE, category = CAT_DOORS), \ + new/datum/stack_recipe("pile of dirt", /obj/machinery/hydroponics/soil, 3, time = 1 SECONDS, one_per_turf = TRUE, on_solid_ground = TRUE, category = CAT_TOOLS), \ + new/datum/stack_recipe("sandstone door", /obj/structure/mineral_door/sandstone, 10, time = 5 SECONDS, one_per_turf = TRUE, on_solid_ground = TRUE, applies_mats = TRUE, category = CAT_DOORS), \ new/datum/stack_recipe("Breakdown into sand", /obj/item/stack/ore/glass, 1, one_per_turf = FALSE, on_solid_ground = TRUE, category = CAT_MISC) \ )) @@ -63,7 +63,7 @@ GLOBAL_LIST_INIT(sandstone_recipes, list ( \ merge_type = /obj/item/stack/sheet/mineral/sandbags GLOBAL_LIST_INIT(sandbag_recipes, list ( \ - new/datum/stack_recipe("sandbags", /obj/structure/barricade/sandbags, 1, time = 25, one_per_turf = 1, on_solid_ground = 1, category = CAT_STRUCTURE), \ + new/datum/stack_recipe("sandbags", /obj/structure/barricade/sandbags, 1, time = 3 SECONDS, one_per_turf = TRUE, on_solid_ground = TRUE, category = CAT_STRUCTURE), \ )) /obj/item/stack/sheet/mineral/sandbags/get_main_recipes() @@ -106,7 +106,7 @@ GLOBAL_LIST_INIT(sandbag_recipes, list ( \ walltype = /turf/closed/wall/mineral/diamond GLOBAL_LIST_INIT(diamond_recipes, list ( \ - new/datum/stack_recipe("diamond door", /obj/structure/mineral_door/transparent/diamond, 10, one_per_turf = 1, on_solid_ground = 1, applies_mats = TRUE, category = CAT_DOORS), \ + new/datum/stack_recipe("diamond door", /obj/structure/mineral_door/transparent/diamond, 10, time = 5 SECONDS, one_per_turf = TRUE, on_solid_ground = TRUE, applies_mats = TRUE, category = CAT_DOORS), \ new/datum/stack_recipe("diamond tile", /obj/item/stack/tile/mineral/diamond, 1, 4, 20, category = CAT_TILES), \ )) @@ -131,7 +131,7 @@ GLOBAL_LIST_INIT(diamond_recipes, list ( \ walltype = /turf/closed/wall/mineral/uranium GLOBAL_LIST_INIT(uranium_recipes, list ( \ - new/datum/stack_recipe("uranium door", /obj/structure/mineral_door/uranium, 10, one_per_turf = 1, on_solid_ground = 1, applies_mats = TRUE, category = CAT_DOORS), \ + new/datum/stack_recipe("uranium door", /obj/structure/mineral_door/uranium, 10, time = 5 SECONDS, one_per_turf = TRUE, on_solid_ground = TRUE, applies_mats = TRUE, category = CAT_DOORS), \ new/datum/stack_recipe("uranium tile", /obj/item/stack/tile/mineral/uranium, 1, 4, 20, category = CAT_TILES), \ )) @@ -165,7 +165,7 @@ GLOBAL_LIST_INIT(uranium_recipes, list ( \ return TOXLOSS//dont you kids know that stuff is toxic? GLOBAL_LIST_INIT(plasma_recipes, list ( \ - new/datum/stack_recipe("plasma door", /obj/structure/mineral_door/transparent/plasma, 10, one_per_turf = 1, on_solid_ground = 1, applies_mats = TRUE, category = CAT_DOORS), \ + new/datum/stack_recipe("plasma door", /obj/structure/mineral_door/transparent/plasma, 10, time = 5 SECONDS, one_per_turf = TRUE, on_solid_ground = TRUE, applies_mats = TRUE, category = CAT_DOORS), \ new/datum/stack_recipe("plasma tile", /obj/item/stack/tile/mineral/plasma, 1, 4, 20, category = CAT_TILES), \ )) @@ -196,7 +196,7 @@ GLOBAL_LIST_INIT(plasma_recipes, list ( \ walltype = /turf/closed/wall/mineral/gold GLOBAL_LIST_INIT(gold_recipes, list ( \ - new/datum/stack_recipe("golden door", /obj/structure/mineral_door/gold, 10, one_per_turf = 1, on_solid_ground = 1, applies_mats = TRUE, category = CAT_DOORS), \ + new/datum/stack_recipe("golden door", /obj/structure/mineral_door/gold, 10, time = 5 SECONDS, one_per_turf = TRUE, on_solid_ground = TRUE, applies_mats = TRUE, category = CAT_DOORS), \ new/datum/stack_recipe("gold tile", /obj/item/stack/tile/mineral/gold, 1, 4, 20, category = CAT_TILES), \ new/datum/stack_recipe("blank plaque", /obj/item/plaque, 1, category = CAT_FURNITURE), \ new/datum/stack_recipe("Simple Crown", /obj/item/clothing/head/costume/crown, 5, category = CAT_CLOTHING), \ @@ -224,7 +224,7 @@ GLOBAL_LIST_INIT(gold_recipes, list ( \ walltype = /turf/closed/wall/mineral/silver GLOBAL_LIST_INIT(silver_recipes, list ( \ - new/datum/stack_recipe("silver door", /obj/structure/mineral_door/silver, 10, one_per_turf = 1, on_solid_ground = 1, applies_mats = TRUE, category = CAT_DOORS), \ + new/datum/stack_recipe("silver door", /obj/structure/mineral_door/silver, 10, time = 5 SECONDS, one_per_turf = TRUE, on_solid_ground = TRUE, applies_mats = TRUE, category = CAT_DOORS), \ new/datum/stack_recipe("silver tile", /obj/item/stack/tile/mineral/silver, 1, 4, 20, category = CAT_TILES), \ )) @@ -415,10 +415,10 @@ GLOBAL_LIST_INIT(adamantine_recipes, list( walltype = /turf/closed/wall/mineral/abductor GLOBAL_LIST_INIT(abductor_recipes, list ( \ - new/datum/stack_recipe("alien bed", /obj/structure/bed/abductor, 2, one_per_turf = 1, on_solid_ground = 1, category = CAT_FURNITURE), \ - new/datum/stack_recipe("alien locker", /obj/structure/closet/abductor, 2, time = 15, one_per_turf = 1, on_solid_ground = 1, category = CAT_FURNITURE), \ - new/datum/stack_recipe("alien table frame", /obj/structure/table_frame/abductor, 1, time = 15, one_per_turf = 1, on_solid_ground = 1, category = CAT_FURNITURE), \ - new/datum/stack_recipe("alien airlock assembly", /obj/structure/door_assembly/door_assembly_abductor, 4, time = 20, one_per_turf = 1, on_solid_ground = 1, category = CAT_DOORS), \ + new/datum/stack_recipe("alien bed", /obj/structure/bed/abductor, 2, one_per_turf = TRUE, on_solid_ground = TRUE, category = CAT_FURNITURE), \ + new/datum/stack_recipe("alien locker", /obj/structure/closet/abductor, 2, time = 2 SECONDS, one_per_turf = TRUE, on_solid_ground = TRUE, category = CAT_FURNITURE), \ + new/datum/stack_recipe("alien table frame", /obj/structure/table_frame/abductor, 1, time = 2 SECONDS, one_per_turf = TRUE, on_solid_ground = TRUE, category = CAT_FURNITURE), \ + new/datum/stack_recipe("alien airlock assembly", /obj/structure/door_assembly/door_assembly_abductor, 4, time = 5 SECONDS, one_per_turf = TRUE, on_solid_ground = TRUE, category = CAT_DOORS), \ null, \ new/datum/stack_recipe("alien floor tile", /obj/item/stack/tile/mineral/abductor, 1, 4, 20, category = CAT_TILES), \ )) diff --git a/code/game/objects/items/stacks/sheets/sheet_types.dm b/code/game/objects/items/stacks/sheets/sheet_types.dm index 0448841fdba..c8613d24d43 100644 --- a/code/game/objects/items/stacks/sheets/sheet_types.dm +++ b/code/game/objects/items/stacks/sheets/sheet_types.dm @@ -81,24 +81,24 @@ GLOBAL_LIST_INIT(metal_recipes, list ( \ new/datum/stack_recipe("machine frame", /obj/structure/frame/machine, 5, time = 2.5 SECONDS, one_per_turf = TRUE, on_solid_ground = TRUE, category = CAT_EQUIPMENT), \ null, \ new /datum/stack_recipe_list("airlock assemblies", list( \ - new /datum/stack_recipe("standard airlock assembly", /obj/structure/door_assembly, 4, time = 5 SECONDS, one_per_turf = 1, on_solid_ground = 1, category = CAT_DOORS), \ - new /datum/stack_recipe("public airlock assembly", /obj/structure/door_assembly/door_assembly_public, 4, time = 5 SECONDS, one_per_turf = 1, on_solid_ground = 1, category = CAT_DOORS), \ - new /datum/stack_recipe("command airlock assembly", /obj/structure/door_assembly/door_assembly_com, 4, time = 5 SECONDS, one_per_turf = 1, on_solid_ground = 1, category = CAT_DOORS), \ - new /datum/stack_recipe("security airlock assembly", /obj/structure/door_assembly/door_assembly_sec, 4, time = 5 SECONDS, one_per_turf = 1, on_solid_ground = 1, category = CAT_DOORS), \ - new /datum/stack_recipe("engineering airlock assembly", /obj/structure/door_assembly/door_assembly_eng, 4, time = 5 SECONDS, one_per_turf = 1, on_solid_ground = 1, category = CAT_DOORS), \ - new /datum/stack_recipe("mining airlock assembly", /obj/structure/door_assembly/door_assembly_min, 4, time = 5 SECONDS, one_per_turf = 1, on_solid_ground = 1, category = CAT_DOORS), \ - new /datum/stack_recipe("atmospherics airlock assembly", /obj/structure/door_assembly/door_assembly_atmo, 4, time = 5 SECONDS, one_per_turf = 1, on_solid_ground = 1, category = CAT_DOORS), \ - new /datum/stack_recipe("research airlock assembly", /obj/structure/door_assembly/door_assembly_research, 4, time = 5 SECONDS, one_per_turf = 1, on_solid_ground = 1, category = CAT_DOORS), \ - new /datum/stack_recipe("freezer airlock assembly", /obj/structure/door_assembly/door_assembly_fre, 4, time = 5 SECONDS, one_per_turf = 1, on_solid_ground = 1, category = CAT_DOORS), \ - new /datum/stack_recipe("science airlock assembly", /obj/structure/door_assembly/door_assembly_science, 4, time = 5 SECONDS, one_per_turf = 1, on_solid_ground = 1, category = CAT_DOORS), \ - new /datum/stack_recipe("medical airlock assembly", /obj/structure/door_assembly/door_assembly_med, 4, time = 5 SECONDS, one_per_turf = 1, on_solid_ground = 1, category = CAT_DOORS), \ - new /datum/stack_recipe("hydroponics airlock assembly", /obj/structure/door_assembly/door_assembly_hydro, 4, time = 5 SECONDS, one_per_turf = 1, on_solid_ground = 1, category = CAT_DOORS), \ - new /datum/stack_recipe("virology airlock assembly", /obj/structure/door_assembly/door_assembly_viro, 4, time = 5 SECONDS, one_per_turf = 1, on_solid_ground = 1, category = CAT_DOORS), \ - new /datum/stack_recipe("maintenance airlock assembly", /obj/structure/door_assembly/door_assembly_mai, 4, time = 5 SECONDS, one_per_turf = 1, on_solid_ground = 1, category = CAT_DOORS), \ - new /datum/stack_recipe("external airlock assembly", /obj/structure/door_assembly/door_assembly_ext, 4, time = 5 SECONDS, one_per_turf = 1, on_solid_ground = 1, category = CAT_DOORS), \ - new /datum/stack_recipe("external maintenance airlock assembly", /obj/structure/door_assembly/door_assembly_extmai, 4, time = 5 SECONDS, one_per_turf = 1, on_solid_ground = 1, category = CAT_DOORS), \ - new /datum/stack_recipe("airtight hatch assembly", /obj/structure/door_assembly/door_assembly_hatch, 4, time = 5 SECONDS, one_per_turf = 1, on_solid_ground = 1, category = CAT_DOORS), \ - new /datum/stack_recipe("maintenance hatch assembly", /obj/structure/door_assembly/door_assembly_mhatch, 4, time = 5 SECONDS, one_per_turf = 1, on_solid_ground = 1, category = CAT_DOORS), \ + new /datum/stack_recipe("standard airlock assembly", /obj/structure/door_assembly, 4, time = 5 SECONDS, one_per_turf = TRUE, on_solid_ground = TRUE, category = CAT_DOORS), \ + new /datum/stack_recipe("public airlock assembly", /obj/structure/door_assembly/door_assembly_public, 4, time = 5 SECONDS, one_per_turf = TRUE, on_solid_ground = TRUE, category = CAT_DOORS), \ + new /datum/stack_recipe("command airlock assembly", /obj/structure/door_assembly/door_assembly_com, 4, time = 5 SECONDS, one_per_turf = TRUE, on_solid_ground = TRUE, category = CAT_DOORS), \ + new /datum/stack_recipe("security airlock assembly", /obj/structure/door_assembly/door_assembly_sec, 4, time = 5 SECONDS, one_per_turf = TRUE, on_solid_ground = TRUE, category = CAT_DOORS), \ + new /datum/stack_recipe("engineering airlock assembly", /obj/structure/door_assembly/door_assembly_eng, 4, time = 5 SECONDS, one_per_turf = TRUE, on_solid_ground = TRUE, category = CAT_DOORS), \ + new /datum/stack_recipe("mining airlock assembly", /obj/structure/door_assembly/door_assembly_min, 4, time = 5 SECONDS, one_per_turf = TRUE, on_solid_ground = TRUE, category = CAT_DOORS), \ + new /datum/stack_recipe("atmospherics airlock assembly", /obj/structure/door_assembly/door_assembly_atmo, 4, time = 5 SECONDS, one_per_turf = TRUE, on_solid_ground = TRUE, category = CAT_DOORS), \ + new /datum/stack_recipe("research airlock assembly", /obj/structure/door_assembly/door_assembly_research, 4, time = 5 SECONDS, one_per_turf = TRUE, on_solid_ground = TRUE, category = CAT_DOORS), \ + new /datum/stack_recipe("freezer airlock assembly", /obj/structure/door_assembly/door_assembly_fre, 4, time = 5 SECONDS, one_per_turf = TRUE, on_solid_ground = TRUE, category = CAT_DOORS), \ + new /datum/stack_recipe("science airlock assembly", /obj/structure/door_assembly/door_assembly_science, 4, time = 5 SECONDS, one_per_turf = TRUE, on_solid_ground = TRUE, category = CAT_DOORS), \ + new /datum/stack_recipe("medical airlock assembly", /obj/structure/door_assembly/door_assembly_med, 4, time = 5 SECONDS, one_per_turf = TRUE, on_solid_ground = TRUE, category = CAT_DOORS), \ + new /datum/stack_recipe("hydroponics airlock assembly", /obj/structure/door_assembly/door_assembly_hydro, 4, time = 5 SECONDS, one_per_turf = TRUE, on_solid_ground = TRUE, category = CAT_DOORS), \ + new /datum/stack_recipe("virology airlock assembly", /obj/structure/door_assembly/door_assembly_viro, 4, time = 5 SECONDS, one_per_turf = TRUE, on_solid_ground = TRUE, category = CAT_DOORS), \ + new /datum/stack_recipe("maintenance airlock assembly", /obj/structure/door_assembly/door_assembly_mai, 4, time = 5 SECONDS, one_per_turf = TRUE, on_solid_ground = TRUE, category = CAT_DOORS), \ + new /datum/stack_recipe("external airlock assembly", /obj/structure/door_assembly/door_assembly_ext, 4, time = 5 SECONDS, one_per_turf = TRUE, on_solid_ground = TRUE, category = CAT_DOORS), \ + new /datum/stack_recipe("external maintenance airlock assembly", /obj/structure/door_assembly/door_assembly_extmai, 4, time = 5 SECONDS, one_per_turf = TRUE, on_solid_ground = TRUE, category = CAT_DOORS), \ + new /datum/stack_recipe("airtight hatch assembly", /obj/structure/door_assembly/door_assembly_hatch, 4, time = 5 SECONDS, one_per_turf = TRUE, on_solid_ground = TRUE, category = CAT_DOORS), \ + new /datum/stack_recipe("maintenance hatch assembly", /obj/structure/door_assembly/door_assembly_mhatch, 4, time = 5 SECONDS, one_per_turf = TRUE, on_solid_ground = TRUE, category = CAT_DOORS), \ )), \ null, \ new/datum/stack_recipe("firelock frame", /obj/structure/firelock_frame, 3, time = 5 SECONDS, one_per_turf = TRUE, on_solid_ground = TRUE, category = CAT_DOORS), \ @@ -116,7 +116,7 @@ GLOBAL_LIST_INIT(metal_recipes, list ( \ new/datum/stack_recipe("extinguisher cabinet frame", /obj/item/wallframe/extinguisher_cabinet, 2, category = CAT_EQUIPMENT), \ new/datum/stack_recipe("button frame", /obj/item/wallframe/button, 1, category = CAT_EQUIPMENT), \ null, \ - new/datum/stack_recipe("iron door", /obj/structure/mineral_door/iron, 20, one_per_turf = TRUE, on_solid_ground = TRUE, applies_mats = TRUE, category = CAT_DOORS), \ + new/datum/stack_recipe("iron door", /obj/structure/mineral_door/iron, 20, time = 5 SECONDS, one_per_turf = TRUE, on_solid_ground = TRUE, applies_mats = TRUE, category = CAT_DOORS), \ new/datum/stack_recipe("filing cabinet", /obj/structure/filingcabinet, 2, time = 10 SECONDS, one_per_turf = TRUE, on_solid_ground = TRUE, category = CAT_FURNITURE), \ new/datum/stack_recipe("desk bell", /obj/structure/desk_bell, 2, time = 3 SECONDS, category = CAT_FURNITURE), \ new/datum/stack_recipe("floodlight frame", /obj/structure/floodlight_frame, 5, one_per_turf = TRUE, on_solid_ground = TRUE, category = CAT_EQUIPMENT), \ @@ -245,8 +245,8 @@ GLOBAL_LIST_INIT(plasteel_recipes, list ( \ new/datum/stack_recipe("Large Gas Tank", /obj/structure/tank_frame, 4, time=1 SECONDS, one_per_turf=TRUE, category = CAT_ATMOSPHERIC), null, new /datum/stack_recipe_list("airlock assemblies", list( \ - new/datum/stack_recipe("high security airlock assembly", /obj/structure/door_assembly/door_assembly_highsecurity, 4, time = 5 SECONDS, one_per_turf = 1, on_solid_ground = 1, category = CAT_DOORS), - new/datum/stack_recipe("vault door assembly", /obj/structure/door_assembly/door_assembly_vault, 6, time = 5 SECONDS, one_per_turf = 1, on_solid_ground = 1, category = CAT_DOORS), + new/datum/stack_recipe("high security airlock assembly", /obj/structure/door_assembly/door_assembly_highsecurity, 4, time = 5 SECONDS, one_per_turf = TRUE, on_solid_ground = TRUE, category = CAT_DOORS), + new/datum/stack_recipe("vault door assembly", /obj/structure/door_assembly/door_assembly_vault, 6, time = 5 SECONDS, one_per_turf = TRUE, on_solid_ground = TRUE, category = CAT_DOORS), )), \ )) From 5d4c8f4c0c159bebb1a84014c22a65164ba9a111 Mon Sep 17 00:00:00 2001 From: Zonespace <41448081+Zonespace27@users.noreply.github.com> Date: Fri, 13 Jan 2023 15:35:52 -0800 Subject: [PATCH 16/42] Mirrors #72380 (#18669) * Remove Mining LTSRBT + Change mining vendor costs to be less ass (#72380) Removes Mining LTSRBTs Adds a new cargo_cheaper variable to order consoles to make the tooltips actually imply that express costs 1x Mining Vendor cargo delivery now costs 0.65x (and rounded) Express delivery costs 1x, no cooldown. Costs displayed in the vendor are now multiplied by 0.65 to make them show the cheaper price of buying by cargo Encourage people to not fuck over ghost roles for their gamer mining vendors Encourage miners to cooperate with cargo techs (best case) to get their gear cheaper Encourage miners to talk to their own stationside department for their gamer gear cheaper, while making miners who dont do that, have costlier (normal price) gear * Update interdyne_mining.dm * SR maps Co-authored-by: jimmyl <70376633+mc-oofert@users.noreply.github.com> --- .../SpaceRuins/skyrat/cargodiselost.dmm | 1 - .../SpaceRuins/skyrat/port_tarkon/defcon2.dmm | 1 - .../SpaceRuins/skyrat/port_tarkon/defcon3.dmm | 1 - .../SpaceRuins/skyrat/port_tarkon/defcon4.dmm | 1 - .../SpaceRuins/skyrat/port_tarkon/defcon5.dmm | 1 - code/_globalvars/lists/objects.dm | 3 - .../orders/order_computer/cook_order.dm | 2 +- .../orders/order_computer/golem_order.dm | 1 - .../orders/order_computer/mining_order.dm | 46 ++++---- .../orders/order_computer/order_computer.dm | 19 ++-- .../orders/order_items/mining/order_mining.dm | 6 - code/modules/mining/mining_ltsrbt.dm | 103 ------------------ .../modules/mapping/code/interdyne_mining.dm | 1 - tgstation.dme | 1 - .../tgui/interfaces/ProduceConsole.js | 35 ++---- 15 files changed, 49 insertions(+), 173 deletions(-) delete mode 100644 code/modules/mining/mining_ltsrbt.dm diff --git a/_maps/RandomRuins/SpaceRuins/skyrat/cargodiselost.dmm b/_maps/RandomRuins/SpaceRuins/skyrat/cargodiselost.dmm index 514cfa08218..8bd1fe4d7d0 100644 --- a/_maps/RandomRuins/SpaceRuins/skyrat/cargodiselost.dmm +++ b/_maps/RandomRuins/SpaceRuins/skyrat/cargodiselost.dmm @@ -238,7 +238,6 @@ "fm" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, /obj/machinery/computer/order_console/mining{ - uses_ltsrbt = 0; forced_express = 1; express_cost_multiplier = 1 }, diff --git a/_maps/RandomRuins/SpaceRuins/skyrat/port_tarkon/defcon2.dmm b/_maps/RandomRuins/SpaceRuins/skyrat/port_tarkon/defcon2.dmm index 203bb42a125..f0fa5a3a965 100644 --- a/_maps/RandomRuins/SpaceRuins/skyrat/port_tarkon/defcon2.dmm +++ b/_maps/RandomRuins/SpaceRuins/skyrat/port_tarkon/defcon2.dmm @@ -4873,7 +4873,6 @@ }, /obj/effect/decal/cleanable/dirt/dust, /obj/machinery/computer/order_console/mining{ - uses_ltsrbt = 0; forced_express = 1; express_cost_multiplier = 1 }, diff --git a/_maps/RandomRuins/SpaceRuins/skyrat/port_tarkon/defcon3.dmm b/_maps/RandomRuins/SpaceRuins/skyrat/port_tarkon/defcon3.dmm index ab5ddb70acf..9014846fcf4 100644 --- a/_maps/RandomRuins/SpaceRuins/skyrat/port_tarkon/defcon3.dmm +++ b/_maps/RandomRuins/SpaceRuins/skyrat/port_tarkon/defcon3.dmm @@ -4735,7 +4735,6 @@ dir = 4 }, /obj/machinery/computer/order_console/mining{ - uses_ltsrbt = 0; forced_express = 1; express_cost_multiplier = 1 }, diff --git a/_maps/RandomRuins/SpaceRuins/skyrat/port_tarkon/defcon4.dmm b/_maps/RandomRuins/SpaceRuins/skyrat/port_tarkon/defcon4.dmm index 71d05851663..ff69c41c86a 100644 --- a/_maps/RandomRuins/SpaceRuins/skyrat/port_tarkon/defcon4.dmm +++ b/_maps/RandomRuins/SpaceRuins/skyrat/port_tarkon/defcon4.dmm @@ -4152,7 +4152,6 @@ }, /obj/effect/decal/cleanable/dirt/dust, /obj/machinery/computer/order_console/mining{ - uses_ltsrbt = 0; forced_express = 1; express_cost_multiplier = 1 }, diff --git a/_maps/RandomRuins/SpaceRuins/skyrat/port_tarkon/defcon5.dmm b/_maps/RandomRuins/SpaceRuins/skyrat/port_tarkon/defcon5.dmm index 9da06f435db..7eabedcd506 100644 --- a/_maps/RandomRuins/SpaceRuins/skyrat/port_tarkon/defcon5.dmm +++ b/_maps/RandomRuins/SpaceRuins/skyrat/port_tarkon/defcon5.dmm @@ -4502,7 +4502,6 @@ }, /obj/effect/decal/cleanable/dirt/dust, /obj/machinery/computer/order_console/mining{ - uses_ltsrbt = 0; forced_express = 1; express_cost_multiplier = 1 }, diff --git a/code/_globalvars/lists/objects.dm b/code/_globalvars/lists/objects.dm index f59f2052e69..bee8a5c0184 100644 --- a/code/_globalvars/lists/objects.dm +++ b/code/_globalvars/lists/objects.dm @@ -57,6 +57,3 @@ GLOBAL_LIST_EMPTY(alert_consoles) // Station alert consoles, /obj/machinery/comp GLOBAL_LIST_EMPTY(roundstart_station_borgcharger_areas) // List of area names of roundstart station cyborg rechargers, for the low charge/no charge cyborg screen alert tooltips. GLOBAL_LIST_EMPTY(roundstart_station_mechcharger_areas) // List of area names of roundstart station mech rechargers, for the low charge/no charge mech screen alert tooltips. - -///List of all types of '/obj/machinery/mining_ltsrbt' -GLOBAL_LIST_EMPTY(mining_ltsrbt) diff --git a/code/game/machinery/computer/orders/order_computer/cook_order.dm b/code/game/machinery/computer/orders/order_computer/cook_order.dm index 0b0de93b713..2a235660a76 100644 --- a/code/game/machinery/computer/orders/order_computer/cook_order.dm +++ b/code/game/machinery/computer/orders/order_computer/cook_order.dm @@ -8,7 +8,7 @@ CATEGORY_SAUCES_REAGENTS, ) -/obj/machinery/computer/order_console/cook/order_groceries(mob/living/purchaser, obj/item/card/id/card, list/groceries, ltsrbt_delivered = FALSE) +/obj/machinery/computer/order_console/cook/order_groceries(mob/living/purchaser, obj/item/card/id/card, list/groceries) say("Thank you for your purchase! It will arrive on the next cargo shuttle!") radio.talk_into(src, "The kitchen has ordered groceries which will arrive on the cargo shuttle! Please make sure it gets to them as soon as possible!", radio_channel) for(var/datum/orderable_item/ordered_item in groceries) diff --git a/code/game/machinery/computer/orders/order_computer/golem_order.dm b/code/game/machinery/computer/orders/order_computer/golem_order.dm index 848cd720f39..c428ab3634a 100644 --- a/code/game/machinery/computer/orders/order_computer/golem_order.dm +++ b/code/game/machinery/computer/orders/order_computer/golem_order.dm @@ -3,7 +3,6 @@ circuit = /obj/item/circuitboard/computer/order_console/mining/golem forced_express = TRUE express_cost_multiplier = 1 - uses_ltsrbt = FALSE order_categories = list( CATEGORY_GOLEM, CATEGORY_MINING, diff --git a/code/game/machinery/computer/orders/order_computer/mining_order.dm b/code/game/machinery/computer/orders/order_computer/mining_order.dm index 5cceac263fa..e50d3d7e22a 100644 --- a/code/game/machinery/computer/orders/order_computer/mining_order.dm +++ b/code/game/machinery/computer/orders/order_computer/mining_order.dm @@ -1,3 +1,6 @@ +#define MINING_SHIPPING_MULTIPLIER 0.65 +#define GET_MINING_SHIPPING_MULTIPLIER(cost) round(cost * MINING_SHIPPING_MULTIPLIER,5) + /obj/machinery/computer/order_console/mining name = "mining equipment order console" desc = "An equipment shop for miners, points collected at an ore redemption machine can be spent here." @@ -8,8 +11,12 @@ circuit = /obj/item/circuitboard/computer/order_console/mining cooldown_time = 10 SECONDS //just time to let you know your order went through. - express_cost_multiplier = 1.5 - uses_ltsrbt = TRUE + express_cost_multiplier = 1 + purchase_tooltip = @{"Your purchases will arrive at cargo, + and hopefully get delivered by them. + 35% cheaper than express delivery."} + express_tooltip = @{"Sends your purchases instantly."} + order_categories = list( CATEGORY_MINING, CATEGORY_CONSUMABLES, @@ -20,16 +27,15 @@ /obj/machinery/computer/order_console/mining/purchase_items(obj/item/card/id/card, express = FALSE) var/final_cost = get_total_cost() var/failure_message = "Sorry, but you do not have enough mining points." - if(express) - final_cost *= express_cost_multiplier - failure_message += "Remember, Express upcharges the cost!" + if(!express) + final_cost = GET_MINING_SHIPPING_MULTIPLIER(final_cost) if(final_cost <= card.mining_points) card.mining_points -= final_cost return TRUE say(failure_message) return FALSE -/obj/machinery/computer/order_console/mining/order_groceries(mob/living/purchaser, obj/item/card/id/card, list/groceries, ltsrbt_delivered = FALSE) +/obj/machinery/computer/order_console/mining/order_groceries(mob/living/purchaser, obj/item/card/id/card, list/groceries) var/list/things_to_order = list() for(var/datum/orderable_item/item as anything in groceries) things_to_order[item.item_path] = groceries[item] @@ -53,25 +59,14 @@ cost_type = "mp", can_be_cancelled = FALSE, ) - if(ltsrbt_delivered) - var/obj/machinery/mining_ltsrbt/ltsrbt - for(var/obj/machinery/mining_ltsrbt/all_ltsrbts as anything in GLOB.mining_ltsrbt) - if(all_ltsrbts.machine_stat & (NOPOWER|BROKEN|MAINT)) //not functional - continue - if(!all_ltsrbts.enabled) //not enabled - continue - ltsrbt = all_ltsrbts - break - if(ltsrbt && ltsrbt.recieve_order(new_order)) - return - say("Found no functional mining LTSRBTs. If there is one, it is likely destroyed, powered down, or under maintenance. Your delivery has instead been rerouted to Cargo.") - else - say("Thank you for your purchase! It will arrive on the next cargo shuttle!") + say("Thank you for your purchase! It will arrive on the next cargo shuttle!") radio.talk_into(src, "A shaft miner has ordered equipment which will arrive on the cargo shuttle! Please make sure it gets to them as soon as possible!", radio_channel) SSshuttle.shopping_list += new_order /obj/machinery/computer/order_console/mining/ui_data(mob/user) var/list/data = ..() + var/cost = get_total_cost() + data["total_cost"] = "[GET_MINING_SHIPPING_MULTIPLIER(cost)] (Express: [cost]) " if(!isliving(user)) return data var/mob/living/living_user = user @@ -86,6 +81,15 @@ if(!.) flick("mining-deny", src) +/obj/machinery/computer/order_console/mining/ui_static_data(mob/user) + var/list/data = ..() + for(var/list/order in data["order_datums"]) + var/cost = order["cost"] + if(isnull(cost)) //sanity check + continue + order["cost"] = GET_MINING_SHIPPING_MULTIPLIER(cost) // change costs to reflect mining shipping instead + return data + /obj/machinery/computer/order_console/mining/attackby(obj/item/weapon, mob/user, params) if(istype(weapon, /obj/item/mining_voucher)) redeem_voucher(weapon, user) @@ -206,3 +210,5 @@ #undef TO_POINT_CARD #undef TO_USER_ID +#undef MINING_SHIPPING_MULTIPLIER +#undef GET_MINING_SHIPPING_MULTIPLIER diff --git a/code/game/machinery/computer/orders/order_computer/order_computer.dm b/code/game/machinery/computer/orders/order_computer/order_computer.dm index f0933f0694a..ec4e986515c 100644 --- a/code/game/machinery/computer/orders/order_computer/order_computer.dm +++ b/code/game/machinery/computer/orders/order_computer/order_computer.dm @@ -7,14 +7,17 @@ GLOBAL_LIST_EMPTY(order_console_products) icon_screen = "request" icon_keyboard = "generic_key" light_color = LIGHT_COLOR_ORANGE + ///Tooltip for the express button in TGUI + var/express_tooltip = @{"Sends your purchases instantly, + but locks the console longer and increases the price!"} + ///Tooltip for the purchase button in TGUI + var/purchase_tooltip = @{"Your purchases will arrive at cargo, + and hopefully get delivered by them."} ///Cooldown between order uses. COOLDOWN_DECLARE(order_cooldown) ///Cooldown time between uses, express console will have extra time depending on express_cost_multiplier. var/cooldown_time = 60 SECONDS - ///Boolean on whether they can bluespace orders using a '/obj/machinery/mining_ltsrbt' - var/uses_ltsrbt = FALSE - ///The radio the console can speak into var/obj/item/radio/radio ///The channel we will attempt to speak into through our radio. @@ -63,7 +66,8 @@ GLOBAL_LIST_EMPTY(order_console_products) /obj/machinery/computer/order_console/ui_data(mob/user) var/list/data = list() - data["total_cost"] = get_total_cost() + var/cost = get_total_cost() + data["total_cost"] = "[cost] (Express: [cost*express_cost_multiplier])" data["off_cooldown"] = COOLDOWN_FINISHED(src, order_cooldown) if(!isliving(user)) @@ -77,7 +81,8 @@ GLOBAL_LIST_EMPTY(order_console_products) /obj/machinery/computer/order_console/ui_static_data(mob/user) var/list/data = list() - data["ltsrbt_available"] = (uses_ltsrbt && GLOB.mining_ltsrbt.len) + data["express_tooltip"] = express_tooltip + data["purchase_tooltip"] = purchase_tooltip data["forced_express"] = forced_express data["order_categories"] = order_categories data["order_datums"] = list() @@ -128,7 +133,7 @@ GLOBAL_LIST_EMPTY(order_console_products) if(get_total_cost() < CARGO_CRATE_VALUE) say("For the delivery order needs to cost more or equal to [CARGO_CRATE_VALUE] points!") return - order_groceries(living_user, used_id_card, grocery_list, ltsrbt_delivered = (action == "ltsrbt_deliver")) + order_groceries(living_user, used_id_card, grocery_list) grocery_list.Cut() COOLDOWN_START(src, order_cooldown, cooldown_time) if("express") @@ -180,5 +185,5 @@ GLOBAL_LIST_EMPTY(order_console_products) say(failure_message) return FALSE -/obj/machinery/computer/order_console/proc/order_groceries(mob/living/purchaser, obj/item/card/id/card, list/groceries, ltsrbt_delivered = FALSE) +/obj/machinery/computer/order_console/proc/order_groceries(mob/living/purchaser, obj/item/card/id/card, list/groceries) return diff --git a/code/game/machinery/computer/orders/order_items/mining/order_mining.dm b/code/game/machinery/computer/orders/order_items/mining/order_mining.dm index 033a0769249..2e7ad9c4c26 100644 --- a/code/game/machinery/computer/orders/order_items/mining/order_mining.dm +++ b/code/game/machinery/computer/orders/order_items/mining/order_mining.dm @@ -22,12 +22,6 @@ desc = "A mining-themed MODsuit that works best when in a mining environment." cost_per_order = 3000 -/datum/orderable_item/mining/mining_ltsrbt - item_path = /obj/item/circuitboard/machine/mining_ltsrbt - name = "Mining LTSRBT Board" - desc = "Tired of waiting on the Cargo shuttle? This item lets you bluespace mining orders directly to the station." - cost_per_order = 750 - /datum/orderable_item/mining/mining_belt item_path = /obj/item/storage/belt/mining cost_per_order = 500 diff --git a/code/modules/mining/mining_ltsrbt.dm b/code/modules/mining/mining_ltsrbt.dm deleted file mode 100644 index 81e6fd80c15..00000000000 --- a/code/modules/mining/mining_ltsrbt.dm +++ /dev/null @@ -1,103 +0,0 @@ -/obj/item/circuitboard/machine/mining_ltsrbt - name = "Mining LTSRBT" - icon_state = "bluespacearray" - build_path = /obj/machinery/mining_ltsrbt - req_components = list( - /obj/item/stack/ore/bluespace_crystal = 2, - /obj/item/stock_parts/subspace/ansible = 1, - /obj/item/stock_parts/micro_laser = 1, - ) - def_components = list( - /obj/item/stack/ore/bluespace_crystal = /obj/item/stack/ore/bluespace_crystal/artificial, - ) - -/** - * Mining LTSRBT - * - * Recieves orders from the mining produce console - * Uses power (scaling with parts) to get that item delivered - * Only works if it's enabled, and can only be enabled on-station. - */ -/obj/machinery/mining_ltsrbt - name = "mining LTSRBT" - desc = "A variant of the Long-To-Short-Range-Bluespace-Transceiver used to deliver Mining equipment to the station as required. Nanotrasen denies the existence of any other forms of the LTSRBT." - icon_state = "exonet_node" - circuit = /obj/item/circuitboard/machine/mining_ltsrbt - density = TRUE - - ///Boolean on whether the machine is active or not - var/enabled = FALSE - ///The amount of power each use of the machine costs. - var/power_usage_per_teleport = 10000 - -/obj/machinery/mining_ltsrbt/Initialize(mapload) - . = ..() - GLOB.mining_ltsrbt += src - register_context() - -/obj/machinery/mining_ltsrbt/Destroy() - GLOB.mining_ltsrbt -= src - return ..() - -/obj/machinery/mining_ltsrbt/add_context(atom/source, list/context, obj/item/held_item, mob/user) - . = ..() - if(!held_item) - context[SCREENTIP_CONTEXT_LMB] = "turn [enabled ? "off" : "on"]" - return CONTEXTUAL_SCREENTIP_SET - - if(held_item.tool_behaviour == TOOL_SCREWDRIVER) - context[SCREENTIP_CONTEXT_LMB] = "[panel_open ? "Close" : "Open"] panel" - return CONTEXTUAL_SCREENTIP_SET - if(held_item.tool_behaviour == TOOL_CROWBAR && panel_open) - context[SCREENTIP_CONTEXT_LMB] = "Deconstruct" - return CONTEXTUAL_SCREENTIP_SET - return . - -/obj/machinery/mining_ltsrbt/attack_hand(mob/living/user, list/modifiers) - . = ..() - if(!is_station_level(z)) - balloon_alert(user, "not on station!") - user.playsound_local(loc, 'sound/machines/buzz-two.ogg', 30, TRUE) - return - enabled = !enabled - balloon_alert(user, "turned [enabled ? "on" : "off"]") - update_appearance(UPDATE_ICON) - -/obj/machinery/mining_ltsrbt/update_icon_state() - . = ..() - icon_state = enabled ? initial(icon_state) : "[icon_state]_idle" - -/obj/machinery/mining_ltsrbt/RefreshParts() - . = ..() - for(var/obj/item/stock_parts/micro_laser/laser in component_parts) - power_usage_per_teleport = (initial(power_usage_per_teleport) % laser.rating) - -/obj/machinery/mining_ltsrbt/screwdriver_act(mob/living/user, obj/item/tool) - . = ..() - if(enabled) - enabled = FALSE - update_appearance(UPDATE_ICON) - default_deconstruction_screwdriver(user, icon_state, icon_state, tool) - return TRUE - -/obj/machinery/mining_ltsrbt/crowbar_act(mob/living/user, obj/item/tool) - . = ..() - default_deconstruction_crowbar(tool) - return TRUE - -/** - * # Recieve order - * - * Recieves the order and, if successfully goes through, returns TRUE - * Otherwise will return FALSE to cancel the order. - */ -/obj/machinery/mining_ltsrbt/proc/recieve_order(datum/supply_order/order) - if(!enabled) - return FALSE - order.generate(get_turf(src)) - use_power(power_usage_per_teleport) - var/datum/effect_system/spark_spread/sparks = new - sparks.set_up(5, 1, get_turf(src)) - sparks.attach(src) - sparks.start() - return TRUE diff --git a/modular_skyrat/modules/mapping/code/interdyne_mining.dm b/modular_skyrat/modules/mapping/code/interdyne_mining.dm index 8a05b38f6a4..53e5e6a3967 100644 --- a/modular_skyrat/modules/mapping/code/interdyne_mining.dm +++ b/modular_skyrat/modules/mapping/code/interdyne_mining.dm @@ -9,7 +9,6 @@ circuit = /obj/item/circuitboard/computer/order_console/mining/interdyne forced_express = TRUE express_cost_multiplier = 1 - uses_ltsrbt = FALSE order_categories = list( CATEGORY_MINING, CATEGORY_CONSUMABLES, diff --git a/tgstation.dme b/tgstation.dme index b20d6c6a13f..dbd3a9e2e9b 100644 --- a/tgstation.dme +++ b/tgstation.dme @@ -3654,7 +3654,6 @@ #include "code\modules\mining\machine_unloading.dm" #include "code\modules\mining\mine_items.dm" #include "code\modules\mining\minebot.dm" -#include "code\modules\mining\mining_ltsrbt.dm" #include "code\modules\mining\money_bag.dm" #include "code\modules\mining\ores_coins.dm" #include "code\modules\mining\satchel_ore_boxdm.dm" diff --git a/tgui/packages/tgui/interfaces/ProduceConsole.js b/tgui/packages/tgui/interfaces/ProduceConsole.js index 6c70525c5a0..2ce218eac06 100644 --- a/tgui/packages/tgui/interfaces/ProduceConsole.js +++ b/tgui/packages/tgui/interfaces/ProduceConsole.js @@ -1,4 +1,4 @@ -import { capitalize, multiline } from 'common/string'; +import { capitalize } from 'common/string'; import { useBackend, useLocalState } from '../backend'; import { Box, Button, Dimmer, Divider, Icon, NumberInput, Section, Stack } from '../components'; import { Window } from '../layouts'; @@ -94,7 +94,13 @@ const ShoppingTab = (props, context) => { const CheckoutTab = (props, context) => { const { data, act } = useBackend(context); - const { ltsrbt_available, forced_express, order_datums, total_cost } = data; + const { + purchase_tooltip, + express_tooltip, + forced_express, + order_datums, + total_cost, + } = data; const checkout_list = order_datums.filter((food) => food && (food.amt || 0)); return ( @@ -160,40 +166,19 @@ const CheckoutTab = (props, context) => { fluid icon="plane-departure" content="Purchase" - tooltip={multiline` - Your groceries will arrive at cargo, - and hopefully get delivered by them. - `} + tooltip={purchase_tooltip} tooltipPosition="top" onClick={() => act('purchase')} /> )} - {!!ltsrbt_available && ( - -