From 46e4dce2b5242b38d6c1398b73b796cf08413b2b Mon Sep 17 00:00:00 2001
From: FalloutFalcon <falloutfalconplays@gmail.com>
Date: Tue, 21 Nov 2023 19:40:42 -0600
Subject: [PATCH 01/89] a thing

---
 code/modules/guncrafting/lathe.dm |  24 ++++++++++++++++++++++++
 icons/obj/guncrafting.dmi         | Bin 0 -> 2238 bytes
 shiptest.dme                      |   1 +
 3 files changed, 25 insertions(+)
 create mode 100644 code/modules/guncrafting/lathe.dm
 create mode 100644 icons/obj/guncrafting.dmi

diff --git a/code/modules/guncrafting/lathe.dm b/code/modules/guncrafting/lathe.dm
new file mode 100644
index 000000000000..add8008603e1
--- /dev/null
+++ b/code/modules/guncrafting/lathe.dm
@@ -0,0 +1,24 @@
+/obj/structure/lathe
+	name = "Machine Lathe"
+	desc = "You could make alot of things with this."
+	icon = 'icons/obj/guncrafting.dmi'
+	icon_state = "lathe"
+	density = TRUE
+	anchored = FALSE
+	var/obj/item/work_piece = FALSE
+
+/obj/structure/lathe/AltClick(mob/user)
+	if(work_piece)
+		vis_contents -= work_piece
+		work_piece.forceMove(drop_location())
+		if(Adjacent(user) && !issilicon(user))
+			user.put_in_hands(work_piece)
+		work_piece = FALSE
+
+/obj/structure/lathe/attackby(obj/item/I, mob/user)
+	if(istype(I, /obj/item/gun))
+		I.forceMove(src)
+		work_piece = I
+		vis_contents += work_piece
+
+
diff --git a/icons/obj/guncrafting.dmi b/icons/obj/guncrafting.dmi
new file mode 100644
index 0000000000000000000000000000000000000000..4f4ff6072ea3a02af610374c244f776a196cd707
GIT binary patch
literal 2238
zcmV;v2toIWP)<h;3K|Lk000e1NJLTq001BW001Be1^@s6b9#F80001OdQ@0+L}hbh
za%pgMX>V=-0C=1w$2$suFc1a6I(v$T>BV20Mk10z?-0mp0)8M_^!gTdGaBPGyA^hE
z^l&cezF;ua4XHN;i7@CpQjyah<xdeW41?<M61gH3QZ6uPNp0Dm{99vME$rgx12-NT
z8NWtmcK`qg3`s;mR9J<@m*0;hRTalS_tvlOneOSH>7L)Riz_?0D;O3<i3Smf5Ftbp
zTtoDQWZ{9t2mcBmd^H9_;)BFQVxkYCkeDC?h`$ot9bk1?*xx-fJJY|WtGlbatLon4
zL+|uXGfM($;z=s0d#mc4&pG$r@4cl~S6BIen!C60)KgChfQXE}BqC_7$NH2~Jonsl
z>c0h0tE;Q5zWk#6<!^sy>QaTW?{i^kp6NylH;RUoN+BZjvRT6NG==&O)BQfLh+wTn
zDTPuWpJgw&3-I-CKB{(FEva7Fpb!Ln_SO~rbEj#?KBd^D==%(eq0?^T9J_;=x7Ikj
zxyj0bCGr<51b}nRp{EoA^d}|&n2aLaYj9f!7C3ovV+>|A1gF;4n6;Kdp+GxL$+d+!
z?cqC`*cievB*^86Q^S@Y(-+~;p+hvc>SSD(>A5T-P>A%X8d@oOOL^u7K1PI@V|RQs
zKx7m>V`zsV@4a`HFGdkNu1i4#R|H=v(oTo9ci!e`7}FRGxOnmu2a^ObhNu!V9|Y93
z#xn-jT8s#)rPu@#tvP-2<i6n;&8&92jRnpdLpGBk?>LmKB~DWmpn%YIQAtc8O)(<)
zo(sN@s}xORxZLkEnIudrMb2?hnG92og8^J?aUEwLz^DTGe4eD!VagbK$pEW0{UpKo
zJ}wXdJ*~mdaIRY?t2NCyL3%x^B1FDV#TYL4dSo4kDXqzAO<jbJwYa$)%~tE90VZ8&
zCkZ=o%x0_2dz~Iugp-~Jz};y|-f`$ULSPKF!GN&aqh~Evgvr4GUxY*{`o^F|h>T$%
zf~OR2r$asVJ{sV@d++7tbI;>xjiWVdo=dry=gEg30N{5oy+Xa!p$G(8BO=tAJG?IP
ziI(8h)YN`}H~#RFoH})idZEBUW9ak-l#6-ltq$$#I{iURwHZ<>4Eq*D_yD-`$O^g1
zEXE3s9zrCkp*M($<9MhKC<e)ZdaHv)@$9qDj?t<QOYzfBKRuGcC%^w~vXeP_QIAHW
z#;<?BI?A@$Y;xz36)M{`5_?@aJ*_yfIEOKYR=bO}marR<3TUnO0gUS_@XRyMs9i^A
z*4|?MgVWU4&$Dsi1AIr1f*d(?fcwKPr9zGq6BDDWRLJqwMo2cuke`?!2t1V5`-1=E
z$3K$M5C9xMeq0>Kp;#=Avi$4mEBx@jhX8o-wV%PBJ>p=s$tB0(_AXrBlfdm=IAaX+
z-7c4w=FzFb(HdhcKYii}d86OwYncppeDAy0=fLsf$E8#%QLopr*7A+JZlfnIzUT4t
z=YNSYhA$ucJb~{M$be?pVdvBt1UTt?lnOa!ibWbbJJeepR+0pAIb56Ysp(1X?<HJ`
zB5EQ$Rwz&%4EW>fD)&72@bw`mm&;@_86Nn;=a6e{r8Ku4x`|vy<GCJFo{*niCQ&{n
zP1%WKR=N>08{5b~&oZ;I&EalDnx-`Cb@XI`<tueAM-d%ka9x+0F=)rZUaO{t;dWcC
zR_XWqIF7^Y^3BXl`eZW!)|=qyEw|vgF2O{OBnrvuVenLhW}4D4hK4aj))E;*&swT+
zOb~c%_xsFcGAKZRg6HuM$6<FexB$NI(`YpCJde!O3|Yq#rHYIzSQ3mgL7`Y6>_&(v
zde&q4D_<h*by4ZA4h*+sj|A7z+?>zjIS%WC0bv|tfJB5hdp(jQ;X98!bR8f`5>{4L
z*xK5{w|x>-B%}L8L5^f+hbZo%T^HAN$!4?Ur}A`b8zhrHk#R8n4xX!-$Yc<I5`e5q
z=%kv$-FGpFWAct=YI=?{ufERw{5)shS>wTPJ$8K+xUNgD*CW;$vOqYnMBNBKKf_cI
z5GaG^xj2ph!o>UnwN^yV_K6Ei0Qj~~tcP-2EEJfCWAa&#tBp1~?GZM%=ytm}j>Btf
z|KbO`6%Y|Bl?njA_|0#}bYbuD?2}0Dhriu5$8lI+Umrbl0fHbP3`26c95*k{0${9V
zW_pHNy-sOnhB!&c1OYocO#l`b7Di4tuU=(wVF6<;>l+(bE2PGZWTRA?Artsit2NfE
zjp5-Y2!=`RO7Y{5KfWLLKQ!61L4CLiyZtY`@PZmuVArOnr)f5u`*y64YvoppPfty8
zX?`B16xLcC$H7|5u_)qK>+7Q!yEX<eH#bMK*(Bq+Bl=+i0w}cJla*3q(ky@|MUu^O
zczc_HwP;|{aqyL*ZOmAV8v<-?Z6P8&>Uy+|VNl92(dhH%T8(>VXPM9%S1DTM41ap(
z0*@>%qLl)rXe9}+TFb`vHX?$jHNsHoj0mx{pcGqMTVqul1E|;QIF3Ulia5WpfHjt*
zaflWn91M7~RKj&#j$GL$t2NbrpVLcA#Bt2w?QJ}zIGoROVR@M}P4Rsn5h3aKInwWQ
zVPj(y<Awk$D=VBkcaB7an>II5Ko7`jO(MdrwHg4)wahxkaPZ0%1|o=3WVI&mI2_&F
z9Q_NljKPTD6$&V&Mlo&(;JU-+<#roi>tWddUu)hE!_j?gExy)V>~x5&CD`-Z_HL^+
z_TA{d+Z~H>Lx5fLK68+TJ?q?Bp|Y_~p-`k+t5GZ#hZ9l2cQl=L8>L{jJWI7!!_k`M
zrNuFyn^&*G`O720+XrBbp;D<}jN$TDop;~A01OY2;kE2@x#8@+P}wA(&m$tV+ihTY
ztly~ZjM|lIV=U0FkKI`N0LtYu&1REwxjZ_S{jcrBi4zir;h4_+8<9yOno&Xl0ssI2
M07*qoM6N<$f*#>GR{#J2

literal 0
HcmV?d00001

diff --git a/shiptest.dme b/shiptest.dme
index e1b52aaaac6b..412bbd5f8c7e 100644
--- a/shiptest.dme
+++ b/shiptest.dme
@@ -2161,6 +2161,7 @@
 #include "code\modules\games\cas.dm"
 #include "code\modules\games\kotahi.dm"
 #include "code\modules\games\tarot.dm"
+#include "code\modules\guncrafting\lathe.dm"
 #include "code\modules\holiday\easter.dm"
 #include "code\modules\holiday\foreign_calendar.dm"
 #include "code\modules\holiday\holidays.dm"

From 55d0b191ca048f0c8f415d850abd546429ccea6a Mon Sep 17 00:00:00 2001
From: FalloutFalcon <falloutfalconplays@gmail.com>
Date: Tue, 21 Nov 2023 21:25:54 -0600
Subject: [PATCH 02/89] kinda workin

---
 code/modules/guncrafting/lathe.dm | 18 +++++++++++++++---
 1 file changed, 15 insertions(+), 3 deletions(-)

diff --git a/code/modules/guncrafting/lathe.dm b/code/modules/guncrafting/lathe.dm
index add8008603e1..431203385fd4 100644
--- a/code/modules/guncrafting/lathe.dm
+++ b/code/modules/guncrafting/lathe.dm
@@ -15,10 +15,22 @@
 			user.put_in_hands(work_piece)
 		work_piece = FALSE
 
+/*
+/obj/structure/lathe/attack_hand(mob/user)
+	if(work_piece)
+		var/list/choose_options = list()
+		choose_options += list("Screwdriver" = image(icon = 'icons/obj/tools.dmi', icon_state = "screwdriver_nuke"))
+		var/picked_option = show_radial_menu(user, src, choose_options, radius = 38, require_near = TRUE)
+		if(picked_option)
+			if(picked_option == "Screwdriver")
+				work_piece.screwdriver_act(user, /obj/item/screwdriver)
+*/
+
 /obj/structure/lathe/attackby(obj/item/I, mob/user)
-	if(istype(I, /obj/item/gun))
+	if(!work_piece && istype(I, /obj/item/gun))
 		I.forceMove(src)
 		work_piece = I
+		work_piece.vis_flags |= VIS_INHERIT_ID
 		vis_contents += work_piece
-
-
+	else
+		work_piece.attackby(I, user)

From 809d2049af08b834bd911fe15fdf7031d2bb3f19 Mon Sep 17 00:00:00 2001
From: FalloutFalcon <falloutfalconplays@gmail.com>
Date: Tue, 21 Nov 2023 22:34:41 -0600
Subject: [PATCH 03/89] this uhh is not working. gonna rework this all

---
 code/modules/guncrafting/lathe.dm |  23 ++++++++++++++++-------
 icons/obj/guncrafting.dmi         | Bin 2238 -> 2411 bytes
 2 files changed, 16 insertions(+), 7 deletions(-)

diff --git a/code/modules/guncrafting/lathe.dm b/code/modules/guncrafting/lathe.dm
index 431203385fd4..540aaa71e21c 100644
--- a/code/modules/guncrafting/lathe.dm
+++ b/code/modules/guncrafting/lathe.dm
@@ -15,22 +15,31 @@
 			user.put_in_hands(work_piece)
 		work_piece = FALSE
 
-/*
 /obj/structure/lathe/attack_hand(mob/user)
-	if(work_piece)
+	if(istype(work_piece, /obj/item/work_piece))
+		var/obj/item/work_piece/to_work = work_piece
 		var/list/choose_options = list()
 		choose_options += list("Screwdriver" = image(icon = 'icons/obj/tools.dmi', icon_state = "screwdriver_nuke"))
 		var/picked_option = show_radial_menu(user, src, choose_options, radius = 38, require_near = TRUE)
 		if(picked_option)
 			if(picked_option == "Screwdriver")
-				work_piece.screwdriver_act(user, /obj/item/screwdriver)
-*/
+				to_work.improve_item(user)
 
 /obj/structure/lathe/attackby(obj/item/I, mob/user)
-	if(!work_piece && istype(I, /obj/item/gun))
+	if(!work_piece && istype(I, /obj/item/work_piece))
 		I.forceMove(src)
 		work_piece = I
 		work_piece.vis_flags |= VIS_INHERIT_ID
 		vis_contents += work_piece
-	else
-		work_piece.attackby(I, user)
+
+/obj/item/work_piece
+	name = "Work Piece"
+	desc = "A piece of metal that can be worked on."
+	icon = 'icons/obj/guncrafting.dmi'
+	icon_state = "work_piece"
+	var/steps_left = 5
+
+/obj/item/work_piece/proc/improve_item(mob/user)
+	if(steps_left >= 0 && do_after(user, 20, target = src))
+		steps_left--
+		to_chat(user, "You made some progress on the work piece. You only have [steps_left] steps left.")
diff --git a/icons/obj/guncrafting.dmi b/icons/obj/guncrafting.dmi
index 4f4ff6072ea3a02af610374c244f776a196cd707..9f4de524fb8840ffb7c7f65d06855f2c7a08f53f 100644
GIT binary patch
literal 2411
zcmV-x36%DUP)<h;3K|Lk000e1NJLTq002M$001Be1^@s6qMd$(0001UdQ@0+L}hbh
za%pgMX>V=-0C=2JR&a84_w-Y6@%7{?OD!tS%+FJ>RWQ*r;NmRLOex7wuvIWN;^NFm
z%}mcIfpCgT5=&AQY!#Gp5=$~tmAE)lGK-28Y!wW-IMa#}b5kK~xGG!<loee4Tohb<
zJ-GltH6piBQ)p=b00^^5L_t(&f#sR)k6cw9$3N%Xr<vWEo!Q;lhi-vlrHid#D2fmh
zL?o6-(`bS<L=!>+B#>z0D_{5r_`<iw(2)4T#zbPGFRVaff-E3D2HOf%S}c9qhwjeI
z&d$@Fxew?3d@=2~gRSfWwVU{Tb<er?p5OU?f9Ia_J?E;qxjFuy;jS+{`Q(!VAR+?~
zi3nQjfjXrW&p!LCy4D@M)=+bEbIiSXME>xnKQnS}o|5l#W@d`f)jDn%0^llzh|tMq
zX_Q7ORM!~oc6mtzYb{DCl-jr!TS+(<;0s?qpw{YjDPLHm5CnYU)>-`1Cuqh#<FQN8
z_lb<5)okMIy@Rngj&o{hiP@WG$e*1j0Gvw=dP*TccW4NJ;V{I#B+l|p(;Pj!cpYe7
z9sN(>*zw~`SWBT$pqZxRn!=>^@EuKT42?#EAeSRf4a<H^SA?BAcT!ufl5t%|C$oq^
zA=LfRpp~LClV>vWF(QoZy<_VN5E@0t7@Ca+Cr_T@GhxV@>rxQG6~R}EwAJGHn}1_Z
zBW5*<ID7OMJCX!3hHyS+DhQ}*jb{w5wHOgpU9kitT65y)(d$U{%IME*&1Mq|ylV{E
zOoqJUFm5eznxX&&G+Y;z#1zsLBZBX_;QP2rQ8R|~-7dpP!l+W@90!%jFyc5Ez_k|F
zajw>n>xTXa$mjDUtrjE3&`Bb!)^w8u<NLTk0CcnlKf~#Em8{m(;soh*D2ovKKJ&(K
zzSAM=IE-jbPHU<nw5-L=<*3!`*N^E{&=+9Xg=Uhl7RM~ro1AQQup%7wJOJ)VQ}T{O
z+Ytg|s6-Ksc889&SP_P!2w#LmDZ0j>MF@={62Vgnx7DH=d)JNV)zBB<{`>CZ#nXrJ
zw8qhz<DN^YnCFRy9suCiFT6yx-l7NuS|cJ<YHPeIvZ*C-WMt$cC-Gt60=)K{7v$Kn
zV^j+Tb{Ipe6HzMWsn%OG%L{a)m~ySbc%fG}Ey6#6J9p2L8_r^^;OL$RNowdsF>xIC
z`~iw6iKy0FSQLj29ojM;04^D!^?3T}r~5YWiEn<D>~M}w*kN_G!Y`hm>u0-Gt8wS<
zS>{(NB=+CV(bI~XwoPJ;q26p`t)<ZpNd>glTVDX^iQs9)-Ft3ea<YU7EL~jTjgyNc
zR`9f9ypUsmWOzPs*dLkxyUzy>`?@KAnH;AbcIYM%m9-{D7$E<{AADcF{oU_<C^3#4
zJ|tJWci_>dHq>^14mf!5pg4|0u~_V9`Hv?q@SXb~>;-$}$FOdXu%le#oa1nN8_ut5
z@b)&mZ46WGHs@xh(5b@F8e=R!dh9WIt=r}EnGAP)<Le)qBtS4U{2z5u*xpdva7loJ
z2M@~l_&C*S6>BYDy6ZMN;^KQAKRNs}j4|B3_frJEPaqMsMvJv$ZzI4_-($RxW2{(Y
zb#0Amy~S*jKrV-C6K)tC=8K(#3t>n_gog_S%2C8`=jOO~-$NVf<dsOi-}6TfACirX
zg1!+dl}cnX86NobCy`5Kr8Kwgypdc+<GCIqo{*o|PNIBFnz9zh%(g?u7FUqJpJHrr
zg<b8CG)<{htLWhZ+b>i(ABMDy!F63K#-JSsEB`gI|1)UlZFkG%GTm+$$8nh0elugk
zKG{rw^@iAU%Pn}WOE8op2^(Z}k9;aZElpW9hE-z-ttB*uj<uBIm>}?2>2{gSWKe(r
z1<&KJj>ASi&?AQr$!4<;y-#3MbAa#rtgf!&c^;XOF|v*&Ocfbdup}5~h(fVIqa7lm
z=va^KpZhFnr;SQ4`+(k-*dxJpG&kq-c#gwD6w!!d43LQMdZ$B@Bz$fEgPSI{QSzIC
z3y>rUv$L}-FE8WUE{Q6V(OtqIN3ym?7`M@`i|e{%vsv;ZdD@jll3}0FIGAn=&(#cN
zGKk;HSXL#pQcdBWyNKeLyki*|o#gG8Uu9})ic@bMXWv&I-VmXUjDpL=H=6kY0RUXr
zrPJvU>kL_-5m~}^h@T&0BnSwU!Sh@kM*v}HYMM$tBxk$Cg&6>R+a=aLyIU+27>Z-^
zS&xgWO?29!vARsV-NtboUOD~`zV$wxJMidJ>d4_kveB$=mV93T5n+CQ9)O?z@>c^7
ztUn&xjOBgryO-fO4hstlSG;#6d=OHbfeR1>0gXn3TrS7W+a>@o)-pCaMx|P1d~A$3
zNyr2NYil(CwoOm>8(F$|k!{n{7;9NrT*O)-HKuPH#>dCV1U}_*g@y8J?{Fmut|hMx
zqwfSCdE}9gY+aId8>IJU`f~kq&po##Eb+jp@aX6$wOZ{1@7PN9Iv*Pu;oQ^|N-3<h
zIF5t0mc3!f&leW@F}4Z@1elzhq*kku@p{!Fa%mU~pwN0<R+SpC#sY{^B-t#xR#u3t
zMFYc*gRc}#V+LYu6$}Wlyu6HvaKQCw8bdUmVQ96>?<*DVotR)qYh0zMmoohB%`@!Z
zwhgTmC`CO<c-dMOS5^=aJgpIWPRoc8TMJ6Dyu5sUm|g_~0#vJ29LHfk40(5Y8fz?j
z;s#oTMilY-_&BcXvirgcS*<B|yPTMrA&z5qt*qcF#jbpwGuyY5rYXMfBO)Z-F1x#3
z&MYqWV{8=+2rxT4%jwgnNkq7DX$b{%fUMReBHUW30FcnjY|9vST)03af+$5+Yx0i6
zo~5P!zks?i7!kZe0i{$w##X_A0Iu6Bo^LksweAgDz}K308jb#SY%RXloNcv;ttD9Z
z+w84+ec-+Rb-O(fW2@kbz41Q2gXwkaytTso;sS+2k#eO%u~_U)gaW>!X*HWD1rwzS
z%9RR^)@+~IHqhqM#f$Ln`M%-WD(DMfjA4F$9%BsWm#e(>&KaP0h}pQ5{amg$d!LzK
zBA?GAA~c&#pm(gkSXt|r=gX@DfiAakIo4J|Uw~4nM6Fh%R4VbzGtXQTlk)iEk4vM`
d*it9M{{mp^Tz8l8zw7`2002ovPDHLkV1hWfl|=vm

literal 2238
zcmV;v2toIWP)<h;3K|Lk000e1NJLTq001BW001Be1^@s6b9#F80001OdQ@0+L}hbh
za%pgMX>V=-0C=1w$2$suFc1a6I(v$T>BV20Mk10z?-0mp0)8M_^!gTdGaBPGyA^hE
z^l&cezF;ua4XHN;i7@CpQjyah<xdeW41?<M61gH3QZ6uPNp0Dm{99vME$rgx12-NT
z8NWtmcK`qg3`s;mR9J<@m*0;hRTalS_tvlOneOSH>7L)Riz_?0D;O3<i3Smf5Ftbp
zTtoDQWZ{9t2mcBmd^H9_;)BFQVxkYCkeDC?h`$ot9bk1?*xx-fJJY|WtGlbatLon4
zL+|uXGfM($;z=s0d#mc4&pG$r@4cl~S6BIen!C60)KgChfQXE}BqC_7$NH2~Jonsl
z>c0h0tE;Q5zWk#6<!^sy>QaTW?{i^kp6NylH;RUoN+BZjvRT6NG==&O)BQfLh+wTn
zDTPuWpJgw&3-I-CKB{(FEva7Fpb!Ln_SO~rbEj#?KBd^D==%(eq0?^T9J_;=x7Ikj
zxyj0bCGr<51b}nRp{EoA^d}|&n2aLaYj9f!7C3ovV+>|A1gF;4n6;Kdp+GxL$+d+!
z?cqC`*cievB*^86Q^S@Y(-+~;p+hvc>SSD(>A5T-P>A%X8d@oOOL^u7K1PI@V|RQs
zKx7m>V`zsV@4a`HFGdkNu1i4#R|H=v(oTo9ci!e`7}FRGxOnmu2a^ObhNu!V9|Y93
z#xn-jT8s#)rPu@#tvP-2<i6n;&8&92jRnpdLpGBk?>LmKB~DWmpn%YIQAtc8O)(<)
zo(sN@s}xORxZLkEnIudrMb2?hnG92og8^J?aUEwLz^DTGe4eD!VagbK$pEW0{UpKo
zJ}wXdJ*~mdaIRY?t2NCyL3%x^B1FDV#TYL4dSo4kDXqzAO<jbJwYa$)%~tE90VZ8&
zCkZ=o%x0_2dz~Iugp-~Jz};y|-f`$ULSPKF!GN&aqh~Evgvr4GUxY*{`o^F|h>T$%
zf~OR2r$asVJ{sV@d++7tbI;>xjiWVdo=dry=gEg30N{5oy+Xa!p$G(8BO=tAJG?IP
ziI(8h)YN`}H~#RFoH})idZEBUW9ak-l#6-ltq$$#I{iURwHZ<>4Eq*D_yD-`$O^g1
zEXE3s9zrCkp*M($<9MhKC<e)ZdaHv)@$9qDj?t<QOYzfBKRuGcC%^w~vXeP_QIAHW
z#;<?BI?A@$Y;xz36)M{`5_?@aJ*_yfIEOKYR=bO}marR<3TUnO0gUS_@XRyMs9i^A
z*4|?MgVWU4&$Dsi1AIr1f*d(?fcwKPr9zGq6BDDWRLJqwMo2cuke`?!2t1V5`-1=E
z$3K$M5C9xMeq0>Kp;#=Avi$4mEBx@jhX8o-wV%PBJ>p=s$tB0(_AXrBlfdm=IAaX+
z-7c4w=FzFb(HdhcKYii}d86OwYncppeDAy0=fLsf$E8#%QLopr*7A+JZlfnIzUT4t
z=YNSYhA$ucJb~{M$be?pVdvBt1UTt?lnOa!ibWbbJJeepR+0pAIb56Ysp(1X?<HJ`
zB5EQ$Rwz&%4EW>fD)&72@bw`mm&;@_86Nn;=a6e{r8Ku4x`|vy<GCJFo{*niCQ&{n
zP1%WKR=N>08{5b~&oZ;I&EalDnx-`Cb@XI`<tueAM-d%ka9x+0F=)rZUaO{t;dWcC
zR_XWqIF7^Y^3BXl`eZW!)|=qyEw|vgF2O{OBnrvuVenLhW}4D4hK4aj))E;*&swT+
zOb~c%_xsFcGAKZRg6HuM$6<FexB$NI(`YpCJde!O3|Yq#rHYIzSQ3mgL7`Y6>_&(v
zde&q4D_<h*by4ZA4h*+sj|A7z+?>zjIS%WC0bv|tfJB5hdp(jQ;X98!bR8f`5>{4L
z*xK5{w|x>-B%}L8L5^f+hbZo%T^HAN$!4?Ur}A`b8zhrHk#R8n4xX!-$Yc<I5`e5q
z=%kv$-FGpFWAct=YI=?{ufERw{5)shS>wTPJ$8K+xUNgD*CW;$vOqYnMBNBKKf_cI
z5GaG^xj2ph!o>UnwN^yV_K6Ei0Qj~~tcP-2EEJfCWAa&#tBp1~?GZM%=ytm}j>Btf
z|KbO`6%Y|Bl?njA_|0#}bYbuD?2}0Dhriu5$8lI+Umrbl0fHbP3`26c95*k{0${9V
zW_pHNy-sOnhB!&c1OYocO#l`b7Di4tuU=(wVF6<;>l+(bE2PGZWTRA?Artsit2NfE
zjp5-Y2!=`RO7Y{5KfWLLKQ!61L4CLiyZtY`@PZmuVArOnr)f5u`*y64YvoppPfty8
zX?`B16xLcC$H7|5u_)qK>+7Q!yEX<eH#bMK*(Bq+Bl=+i0w}cJla*3q(ky@|MUu^O
zczc_HwP;|{aqyL*ZOmAV8v<-?Z6P8&>Uy+|VNl92(dhH%T8(>VXPM9%S1DTM41ap(
z0*@>%qLl)rXe9}+TFb`vHX?$jHNsHoj0mx{pcGqMTVqul1E|;QIF3Ulia5WpfHjt*
zaflWn91M7~RKj&#j$GL$t2NbrpVLcA#Bt2w?QJ}zIGoROVR@M}P4Rsn5h3aKInwWQ
zVPj(y<Awk$D=VBkcaB7an>II5Ko7`jO(MdrwHg4)wahxkaPZ0%1|o=3WVI&mI2_&F
z9Q_NljKPTD6$&V&Mlo&(;JU-+<#roi>tWddUu)hE!_j?gExy)V>~x5&CD`-Z_HL^+
z_TA{d+Z~H>Lx5fLK68+TJ?q?Bp|Y_~p-`k+t5GZ#hZ9l2cQl=L8>L{jJWI7!!_k`M
zrNuFyn^&*G`O720+XrBbp;D<}jN$TDop;~A01OY2;kE2@x#8@+P}wA(&m$tV+ihTY
ztly~ZjM|lIV=U0FkKI`N0LtYu&1REwxjZ_S{jcrBi4zir;h4_+8<9yOno&Xl0ssI2
M07*qoM6N<$f*#>GR{#J2


From c4906acbc7758f5571e067568e7d80e8fda0ccb5 Mon Sep 17 00:00:00 2001
From: FalloutFalcon <falloutfalconplays@gmail.com>
Date: Wed, 22 Nov 2023 12:46:15 -0600
Subject: [PATCH 04/89] Improves deconstruction functionality to lathe

---
 code/modules/guncrafting/lathe.dm | 90 +++++++++++++++++++++++++------
 1 file changed, 73 insertions(+), 17 deletions(-)

diff --git a/code/modules/guncrafting/lathe.dm b/code/modules/guncrafting/lathe.dm
index 540aaa71e21c..6ac3ab5392f5 100644
--- a/code/modules/guncrafting/lathe.dm
+++ b/code/modules/guncrafting/lathe.dm
@@ -1,3 +1,6 @@
+#define DECONSTRUCT_STAMINA_MINIMUM 50
+#define DECONSTRUCT_STAMINA_USE 40
+
 /obj/structure/lathe
 	name = "Machine Lathe"
 	desc = "You could make alot of things with this."
@@ -6,8 +9,28 @@
 	density = TRUE
 	anchored = FALSE
 	var/obj/item/work_piece = FALSE
+	var/steps_left = 0
+	//Whether there is an active job on the table
+	var/in_progress = FALSE
+	//Defines what job type its currently working on
+	var/mode = FALSE
+	//If activily doing a do untill loop
+	var/working = FALSE
+
+/obj/structure/lathe/Initialize()
+	AddComponent(/datum/component/material_container, list(/datum/material/iron, /datum/material/glass, /datum/material/silver, /datum/material/plasma, /datum/material/gold, /datum/material/diamond, /datum/material/plastic, /datum/material/uranium, /datum/material/bananium, /datum/material/titanium, /datum/material/bluespace), INFINITY, FALSE, null, null, null, TRUE)
+	. = ..()
+
+
+/obj/structure/lathe/examine(mob/user)
+	. = ..()
+	if(steps_left)
+		. += "\nThere are [steps_left] steps left."
 
 /obj/structure/lathe/AltClick(mob/user)
+	if(in_progress)
+		to_chat(user, "The lathe is currently in use.")
+		return
 	if(work_piece)
 		vis_contents -= work_piece
 		work_piece.forceMove(drop_location())
@@ -15,31 +38,64 @@
 			user.put_in_hands(work_piece)
 		work_piece = FALSE
 
-/obj/structure/lathe/attack_hand(mob/user)
-	if(istype(work_piece, /obj/item/work_piece))
-		var/obj/item/work_piece/to_work = work_piece
+/obj/structure/lathe/attack_hand(mob/living/carbon/human/user)
+	if(istype(work_piece, /obj/item) && !mode)
 		var/list/choose_options = list()
-		choose_options += list("Screwdriver" = image(icon = 'icons/obj/tools.dmi', icon_state = "screwdriver_nuke"))
-		var/picked_option = show_radial_menu(user, src, choose_options, radius = 38, require_near = TRUE)
-		if(picked_option)
-			if(picked_option == "Screwdriver")
-				to_work.improve_item(user)
+		choose_options += list("Deconstruct" = image(icon = 'icons/obj/tools.dmi', icon_state = "welder"))
+		mode = show_radial_menu(user, src, choose_options, radius = 38, require_near = TRUE)
+	if(mode && !working)
+		if(mode == "Deconstruct")
+			deconstruct_part(user)
 
 /obj/structure/lathe/attackby(obj/item/I, mob/user)
-	if(!work_piece && istype(I, /obj/item/work_piece))
+	if(!work_piece && istype(I, /obj/item))
 		I.forceMove(src)
 		work_piece = I
 		work_piece.vis_flags |= VIS_INHERIT_ID
 		vis_contents += work_piece
 
-/obj/item/work_piece
-	name = "Work Piece"
-	desc = "A piece of metal that can be worked on."
+/////////////////
+// DECONSTRUCT //
+/////////////////
+
+/obj/structure/lathe/proc/deconstruct_part(mob/living/carbon/human/user)
+	if(!in_progress)
+		in_progress = TRUE
+		steps_left = 3
+	working = TRUE
+	if(do_after(user, 20, work_piece))
+		if(steps_left > 1)
+			steps_left--
+			to_chat(user, "You have [steps_left] steps left.")
+			user.adjustStaminaLoss(DECONSTRUCT_STAMINA_USE)
+			deconstruct_part(user)
+		else
+			scrap_item(work_piece)
+	working = FALSE
+
+/obj/structure/lathe/proc/scrap_item(mob/user)
+	to_chat(user, "The [work_piece.name] is broken down into parts.")
+	if(istype (work_piece, /obj/item/gun))
+		deconstruct_gun()
+	var/datum/component/material_container/materials = GetComponent(/datum/component/material_container)
+	var/material_amount = materials.get_item_material_amount(work_piece)
+	if(material_amount)
+		materials.insert_item(work_piece)
+		materials.retrieve_all()
+	vis_contents -= work_piece
+	qdel(work_piece)
+	work_piece = FALSE
+	in_progress = FALSE
+	mode = FALSE
+
+/obj/structure/lathe/proc/deconstruct_gun()
+	var/obj/item/new_part = new /obj/item/gun_part
+	new_part.forceMove(drop_location())
+
+/obj/item/gun_part
+	name = "Gun Part"
+	desc = "This could fabcricate metal parts."
 	icon = 'icons/obj/guncrafting.dmi'
 	icon_state = "work_piece"
-	var/steps_left = 5
 
-/obj/item/work_piece/proc/improve_item(mob/user)
-	if(steps_left >= 0 && do_after(user, 20, target = src))
-		steps_left--
-		to_chat(user, "You made some progress on the work piece. You only have [steps_left] steps left.")
+/obj/item/mod_gun/frame

From b1c734ebf7b1bdc7ee6be1c1e96c464e3243c7c4 Mon Sep 17 00:00:00 2001
From: FalloutFalcon <falloutfalconplays@gmail.com>
Date: Wed, 22 Nov 2023 14:41:47 -0600
Subject: [PATCH 05/89] new options? half working

---
 code/modules/guncrafting/lathe.dm | 116 +++++++++++++++++++++++++-----
 icons/obj/guncrafting.dmi         | Bin 2411 -> 2682 bytes
 2 files changed, 98 insertions(+), 18 deletions(-)

diff --git a/code/modules/guncrafting/lathe.dm b/code/modules/guncrafting/lathe.dm
index 6ac3ab5392f5..f9ecd3e2a03a 100644
--- a/code/modules/guncrafting/lathe.dm
+++ b/code/modules/guncrafting/lathe.dm
@@ -9,6 +9,7 @@
 	density = TRUE
 	anchored = FALSE
 	var/obj/item/work_piece = FALSE
+	var/obj/item/blueprint/blueprint = FALSE
 	var/steps_left = 0
 	//Whether there is an active job on the table
 	var/in_progress = FALSE
@@ -31,29 +32,60 @@
 	if(in_progress)
 		to_chat(user, "The lathe is currently in use.")
 		return
-	if(work_piece)
-		vis_contents -= work_piece
-		work_piece.forceMove(drop_location())
-		if(Adjacent(user) && !issilicon(user))
-			user.put_in_hands(work_piece)
-		work_piece = FALSE
+	remove_part(user)
 
 /obj/structure/lathe/attack_hand(mob/living/carbon/human/user)
-	if(istype(work_piece, /obj/item) && !mode)
+	if(!mode)
 		var/list/choose_options = list()
-		choose_options += list("Deconstruct" = image(icon = 'icons/obj/tools.dmi', icon_state = "welder"))
+		if(istype(work_piece, /obj/item))
+			choose_options += list("Deconstruct" = image(icon = 'icons/obj/tools.dmi', icon_state = "welder"))
+			choose_options += list("Research" = image(icon = 'icons/obj/tools.dmi', icon_state = "analyzer"))
+		if(blueprint)
+			choose_options += list("Fabricate" = image(icon = 'icons/obj/tools.dmi', icon_state = "wrench"))
 		mode = show_radial_menu(user, src, choose_options, radius = 38, require_near = TRUE)
 	if(mode && !working)
 		if(mode == "Deconstruct")
 			deconstruct_part(user)
+		if(mode == "Research")
+			research_part(user)
+		if(mode == "Fabricate")
+			fabricate_part(user)
 
 /obj/structure/lathe/attackby(obj/item/I, mob/user)
-	if(!work_piece && istype(I, /obj/item))
+	if(istype(I, /obj/item/blueprint))
+		if(blueprint)
+			to_chat(user, "You cant add another blueprint to the lathe.")
+			return
+		I.forceMove(src)
+		blueprint = I
+		return
+	if(work_piece)
+		to_chat(user, "You cant add another item to the lathe.")
+		return
+	if(istype(I, /obj/item))
 		I.forceMove(src)
 		work_piece = I
 		work_piece.vis_flags |= VIS_INHERIT_ID
 		vis_contents += work_piece
 
+/obj/structure/lathe/proc/remove_part(mob/user)
+	if(work_piece)
+		vis_contents -= work_piece
+		work_piece.forceMove(drop_location())
+		if(Adjacent(user) && !issilicon(user))
+			user.put_in_hands(work_piece)
+		work_piece = FALSE
+		in_progress = FALSE
+		mode = FALSE
+
+/obj/structure/lathe/proc/destroy_part(mob/user)
+	if(work_piece)
+		vis_contents -= work_piece
+		qdel(work_piece)
+		work_piece = FALSE
+		in_progress = FALSE
+		mode = FALSE
+
 /////////////////
 // DECONSTRUCT //
 /////////////////
@@ -66,6 +98,7 @@
 	if(do_after(user, 20, work_piece))
 		if(steps_left > 1)
 			steps_left--
+			playsound(src,'sound/items/welder2.ogg',50,TRUE)
 			to_chat(user, "You have [steps_left] steps left.")
 			user.adjustStaminaLoss(DECONSTRUCT_STAMINA_USE)
 			deconstruct_part(user)
@@ -75,22 +108,58 @@
 
 /obj/structure/lathe/proc/scrap_item(mob/user)
 	to_chat(user, "The [work_piece.name] is broken down into parts.")
+	playsound(src,'sound/items/welder.ogg',50,TRUE)
 	if(istype (work_piece, /obj/item/gun))
-		deconstruct_gun()
+		var/obj/item/new_part = new /obj/item/gun_part
+		new_part.forceMove(drop_location())
 	var/datum/component/material_container/materials = GetComponent(/datum/component/material_container)
 	var/material_amount = materials.get_item_material_amount(work_piece)
 	if(material_amount)
 		materials.insert_item(work_piece)
 		materials.retrieve_all()
-	vis_contents -= work_piece
-	qdel(work_piece)
-	work_piece = FALSE
-	in_progress = FALSE
-	mode = FALSE
+	destroy_part(user)
 
-/obj/structure/lathe/proc/deconstruct_gun()
-	var/obj/item/new_part = new /obj/item/gun_part
-	new_part.forceMove(drop_location())
+//////////////
+// RESEARCH //
+//////////////
+
+/obj/structure/lathe/proc/research_part(mob/living/carbon/human/user)
+	if(!in_progress)
+		in_progress = TRUE
+		steps_left = 3
+	working = TRUE
+	if(do_after(user, 20, work_piece))
+		if(steps_left > 1)
+			steps_left--
+			playsound(src,'sound/items/welder2.ogg',50,TRUE)
+			to_chat(user, "You have [steps_left] steps left.")
+			user.adjustStaminaLoss(DECONSTRUCT_STAMINA_USE)
+			research_part(user)
+		else
+			var/obj/item/blueprint/blueprint = new /obj/item/blueprint
+			blueprint.desc += "\nA blueprint on [work_piece.name]."
+			blueprint.design = work_piece
+			blueprint.forceMove(drop_location())
+			if(Adjacent(user) && !issilicon(user))
+				user.put_in_hands(blueprint)
+			remove_part(user)
+	working = FALSE
+
+///////////////
+// FABRICATE //
+///////////////
+
+/obj/structure/lathe/proc/fabricate_part(mob/living/carbon/human/user)
+	if(blueprint)
+		var/obj/item/new_part = new blueprint.design(loc)
+		new_part.forceMove(drop_location())
+		if(Adjacent(user) && !issilicon(user))
+			user.put_in_hands(new_part)
+
+
+///////////
+// ITEMS //
+///////////
 
 /obj/item/gun_part
 	name = "Gun Part"
@@ -99,3 +168,14 @@
 	icon_state = "work_piece"
 
 /obj/item/mod_gun/frame
+
+/obj/item/blueprint
+	name = "Blueprint"
+	desc = "This could be used to make a gun."
+	icon = 'icons/obj/guncrafting.dmi'
+	icon_state = "blueprint"
+	var/design = FALSE
+
+/obj/item/blueprint/gun
+	name = "Gun Blueprint"
+	design = /obj/item/gun/ballistic/shotgun/winchester/mk1
diff --git a/icons/obj/guncrafting.dmi b/icons/obj/guncrafting.dmi
index 9f4de524fb8840ffb7c7f65d06855f2c7a08f53f..5bcfdde8c47a4fac7cf21c356a10415848f24c51 100644
GIT binary patch
delta 2589
zcmV+&3gY$a68aR77Y;xO1^@s6s%dfF0001fktJn+s`S#l_=3cu5`qeGDNt5$^>a~h
z@%7{a04(G#wHIJ;Apiggw@E}nRCt{2ncI(B#T~~#Gv{J^*Iw_%+1(^SXiAnQg^G|;
zP$imBR8WbcR-&m;D<LF60jZTLA@!kuKp!ggsj3J_eP~pvs8ajT6p$)W7AU<cO;Sk9
zr6G`i>?OOl*X!G{eU4{-eQ?&SLoQxIumkx#`P^oH-|uhEoZpPq^z<~JX57^Wk3RaS
z0EkG(O(KHUy5pQuil?7`T3zk{FE?s>dYb9y56WNv{tt%Un<3--oY*kI$WjqE2mo-E
zLPV$~5|lC{r1Q&+)a$$;g0&W<6iRjPML!vT=K}2d`X04hEK2s&9O+n$&)qnMfBYEb
z&}S@k8TNe|#!xAjakk&W=%J&$H9ybPbsI>%J3|a`&NS#Lg#h(|0RRSr0QZbJ3)f9@
z_}#f4$UHyoSK!FeqpY)*bUIDB*(6yO#<hp<XhLHsl}f~tNy4UK!4Ij6uzB-l3JZCE
z;;zfccmfef2f95Pv{KYIq!@4b7!gLd-_pMZ1V&LahH|OIn{U3w7lVLh*Cj22D}t{S
z%}Rx%ul<{CrI4jYgLe-fVN(<##t_VeOvGa3wZ=0B*IJASs;HO;BCR=g_;3%Uo}2c}
zRxX#Zz&pl}h{s7e4rA65Hk&9w0VUUeMMWX$W)mZV@44XnxJpqlhLiO=gHgnYQY0M*
z6^}FII2gdS7T0mk7e~)%kAPGvMO3LUWDK>afz_IN6k&WH7l;8ht-+6TyqYJWHH9!j
zYBjPV1isIVF`TT`NH`8dT9ee8ya*L*ag#|3#bWQ2o`<#pgD#Y#h~+S3zF6je%}Na`
z!eP$?;EraKl;co!gqShp8VyR-8Z~RNA`CVf_##9~Q8xxHLSPIH5j>@ED;4sg*E6B#
zqiw)lJ9qN@@dJ2T<7mxM&m}XQ;*tCA2H+3Ry+FQLVHk*MjfjvdEc3F+nm&O;Lqi|A
zh)cl*c;%1J$&n*R$fwh6GKNZjtwCluMZQ>}oSmiK2+0;ojHO%WCPnxkaO>77l7k71
z6&&3%A!-_GjgT-5TlE2oM${l*tYA^>-@m_aY5+J>2(9Mv#~*K(fscImn<NI4)PfpI
zOF4e~>~uTZg+hT_w@xv$m?N_9SB{=mT(^E4V+_S|6>BY}YCuy!Yu*2U20+UMPb+TU
zb`9g>8AM?I^dg7eoFlS=rxj!AB)c1iXJZb#8>ap2voVKz>P`MRK1MaDQI8trmdhBS
zL;TNv@?-h_4}Ww?W*j`QU(R=J&x4P3)pmOh*t>VHIF7^c@NhfJe>--HAKZ0stFxDW
z0jt&so3aJoa~y82!pT*C4c=UZH;iGTTIIbB6X>SG(HdhcKY!>Ud8J<GEAcqDeCOMj
zED|6#F!+IUjiB09+i=E!y?gh{*w`5Pd>(5pU%TxlYU1L19=|;BYm716zWocte4m&!
zD3mHJA9(`-4*MQs=_I4W!z?W?lP^}7iXuoRac#skBZGXk7I7+n2*`<We>zRJ(cn+h
z)7*K_eO(24E|C|z|KNfB(#<Gn7ebj#hIl;A-8(*yoH<rXbJON)Nyasv>oMdBsdXEP
zl#gjPSq?*{ssW>Oi^zZ8VsvhiE!BW#vq>SJM-Qgicq-4yAfRFluIrLB2JJXlxnN>H
zHZ-)ByV-1(dcBT+<2bC_cs-+oK8bh?>kY8&h8yr)m)Jm(C@7K8E%8ke3e6@<#;{}z
zfwct2P_ve77!r$lEY|Cc$KxnKfVAiFFUO&q7xdtP{j%2VL+ce-(;VRYK1)kWc%Dam
zXq1Fw37U$yD_A0oGeCMcO{p3nqNrJqjbHu}%~}=JT&V+pT1#S&2-neEpGx654zrC0
zr7*+*kqEEWYD7`Qw|3vVW?|imUkffk6h%x;O|h`BfN$$WYM8jL6U354%gY2|745pX
zu1g}3AT^YtnwujU^a+fEsaNn^%|JYk_^pg3R79nzN#AiBjW8tTScXQ%dE>>GnV6X1
zt=Eon&o}OW?@CZNqhLjNx0&xS0Kj!!YPA}nj*|dN4NFiB@Kd7<#bU&i!Sh@kM*v}9
zVv<}jAZhD_=?wt*woa&9<?e7g%|IBEN_d=JDx;e<N=pk=t5qDw;iaSh<$D(iZqI{{
zse=dhOSf5FtN6A7BErnf3;@6S-S0bYSiL>AmXh~>>}OYS9EaK2*>hey7avB{T5thk
zu^6RNiDWX#_3PIGV60_yWRzS!&)DcFVH6RM#aLc00I+^?vfar1>C>#AoWxkm?A#pI
z3Qc3$Wy9FmDDjw2Hk)HMyVTlTiN!9buC8fUf)70Kz(@97l2r?&vopPN{+VZ<>5G!M
zV^?^8WMqUwq41$sY?)$_&kPOm-oyk-DXg_Pj)S$9?LokAW@p=d^a~vZjE|2~C=`f$
zt<xfMW*7^g(0Wx?mFg&s1rVi(5(%~}F4C|T4GcOCzEYHp>FA?h=rCYmVF3|gkLyu3
zhQ?T&fu%Zs$>q3n-8u%e##M@9CeEK<JHhUM_3P0}fl?Hsh!?G8ZgCM2!P6R{RcRR!
zLTf=O78VwIqx3v<7?98BaU6%4AmE+JNvyGK3rlDbN{t4uj*a2EE?ZA6lF*uLz0R=>
z8wkUYEsKkIO0gxC;>5;{G@DI)-$z7<>UFl(>ztUIYxmJFbQmx-HO2Ac$B9I^c77gz
z1=N6q)<h!Qn9BhW(aLPa7&e_cMMDHpiiFmr9EWZ5^X>lvipF3>@X~3NQtdwag$@H;
zw{>{3T*lYBHEaQ2Yu+xE+P_0<@wMjNN`=r`Vypf(d%alfc&`1sTJ7kgUpQwp-e)&4
zx#~M_tuQk;OFBJFHkV^~c(^qY3iytHrcy4W6s*gvBb&?NXwAkA>pR+<KYbeBIoU3_
z`h~Uu#u#R1W-!KZav{&_Z=V2Ko0z3D*-s{0v-gRac~YqqB0{-b23p(dbGhaA@l1B9
zqob8JR{H7}+6H7Y84860nM{T!pM3JN6e$ls{IHZtrM}u3KIfj`$H}f;yL#GxzrOe_
zpKPug(CYwt%~b<>9YC+SYCx|8=rvaj=yd?S=8~3XyPnwjfqlg3pT5)=dwt!qW&_R^
zz2m7vo!9rhfBi}@qiX|Jgr6<=Y*t_2wQr~Ny9pOHpj+YRV#ia5`rd@DCczIQ{z~D3
z2JCubr+kvd!vzdD*9^Z_4(;22aj8vQb}l#qE+zXb;`{mihl?0+sTu5d@o)hHR)RmY
zZ^xRAxDtl`3K#qguFl{}fpekPVzuxqA^Wh#P0?;9#<dFX^`_{WO5rOdt83v?zZ$%1
zK(7PnHCGMjbpXBQssX(Ypx0bApw|KPn*Rfab*96KT(wjH0000<MNUKnu0mjfTaxLo

delta 2315
zcmV+m3H0{*6zdX@7Y-l@1^@s6qMd$(0001UktJn+DqISb6<qyX6kL2gxd1>lBDYaf
zXlVcd2(w8<K~!jg<(ch|TvZ*%Kj+-1ncbP4+1=TPZh>N@i>+WNiVzb-B$i0iXo59F
z6G8$ckZ9s7U-$?3!nelIkodyJL}H>ZtUzLdEFeAx+X_`$EPdLC?#|54&eNT_59j=R
zG3~g2gRSfWwVU{Tb<er?p5OU?f9Ia_J?E;qxjFuy;jS+{`Q(!VAR+?~i3nQjfjXrW
z&p!LCy4D@M)=+bEbIiSXME>xnKQnS}o|5l#W@d`f)jDn%0^llzh|tMqX_Q7ORM!~o
zc6mtzYb{DCl-jr!TS+(<;0s?qpw{YjDPLHBq!0vr;?`OG(<f-gKI5@V(f5grq19~S
z?7f4rH;!{^X^GjJX2_qNCjgvF4SGr;KzC>efZ;I2y(G@^P177byLcUFULE~U;Mnow
zOjt{yP@tKn<eI{y_V67|Yz&P?gCLh9P7TX`Ojm@RJ9koBu99(GMklj~Kq1uq(V&%o
zqBE0cGV(DZjP1Q+>k1GWMaLMLjRq%Ap5ilM$eQa?5Wy9}SBkXN;`p0?V^1SyHHtWU
z^cXvm1TltiK4vNisA`R846d~p5ma5V1SDE>;^@)qNcGC-&uq<R6AQd+4B1SEyyGx#
zEpeKn00lH$7nQ^m(i9_t@44XnxJprfGluisF2hN}s8Zw{2bIY%;y4(<wHDWLuGWw1
zhW-f1=kp}379+;cNg}M)bdv<*`?x>=bhHLP!|8UFtk%@x1nG1rixB!g^Tu$#(;@3P
zjA%_xYpNo&ti{dcsMYJ&kLgv=7hu?hW|FWL$1K&GoNRTlA{_NR0Paas@{U7)+Ytg|
zs6-Ksc889&SP_P!2w#LmDZ0j>MF@={62Vgnx7DH=d)JNV)zBB<{`>CZ#nXrJw8qhz
z<DN^YnCFRy9suCiFT6yx-l7NuS|cJ<YHPeIvZ*C-WMt$cC-Gt60=)K{7v$KnV^j+T
zb{Ipe6HzMWsn%OG%L{a)m~yRu!FZupH!Z?Hfjf84k{ixqtl;RL2uW(_L@{w3_xu5h
zD2b@nTUZo_4jtMu9sn*Gq4jwB>8JZP@QH7JmF#eiPS{~}wZbo+pX+D4R;zL6?pfwn
zDkS#b&e79~o3>42jG^9aW38pp4oL;H)>~fy=!xKI#oc>uU~;mA2rONHT;YwAizHU?
zv|_xFV}E3LK5*C{nf|-a2M+tXDSw$9ryX|aCJ~jjCPo+_|HB`AU%vg_?|mpSjvPKD
zSG#xM(Wf@lc7F~yc<`V&jzh6n>}UCpCob@v`ycEDd*#QlZjZ2|T;rVMaC;lhuWRu3
zHoR>NQ|&hAW~R`o!qFOkV=O;<>@j(*+vW3_40n9v>mQmVKrl4?A9YdK-cZ|cNq~a~
z56bxXIMr$uYb{^8>oz*#;(H!HIs7w>G2FfPQv|+GAQ81ji?w5KBfwGLW4w@KtXO1q
zZH;QZ#cYy5E{AIqZWtZri=BiEVMs-UhYJPDQN(ZO=D2s?LmTRU<dsOi-}6TfACirX
zg1!+dl}cnX86NobCy`5Kr8Kwgypdc+<GCIqo{*o|PNIBFnz9zh%(g?u7FUqJpJHrr
zg<b8CG)<{htLWhZ+b>i(ABMDy!F63K#-JSsEB`gI|1)UlZFkG%GTm+$$8nh0elugk
zKG{rw^@iAU%Pn|+u1heKBMBR1b&q^1LM=^MHHKAV2(2YFhK{wA<Cq}uSm}0|%w$l2
z00qzEua3h;KF}kF56Nb;54}%dQ*(gt`>d|6;&~pKkukE4B}^3=SFj`)XNW?vK%*TZ
zqUczU?VtNBX{U`!FZ+Prme?b~bu>5U^LUQKLKM-6V+@dgi12!+Ly{zXZU2LtCbm)X
zn}G|EBnh*#vn($!<J&HYDw5G%!XQVowniAY(XNZ@x@5Ci@*{cLl|_<apU^m%ZVS)V
z3}rHi-^*B5CA3ma;hwvQ;+VW+85y1A?U!F=YHEs8ZysmgS03IFp^c1!%fvUD`2hg{
zT-T-3=@9FG3|XKNS;BURpC4l+2ndwH^IRN90AXlqno2z+XS>9O8326SCDuK=TPze9
zievIwkBh5KblRb@x=g#>#&H~8IsOm6^*)_D@aR+O$l*h>(X4Kkd|v<&VSaudfS>;I
zR|5~MKOWnR<$dqFm*F@L3kwTZymuvh5K^0g3lIc<0gXn3TrS7W+a>@o)-pCaMx|P1
zd~A$3Nyr2NYil(CwoOm>8(F$|k!{n{7;9NrT*O)-HKuPH#>dCV1U}_*g@y8J?{Fmu
zt|hMxqwfSCdE}9gY+aId8>IJU`f~kq&po##Eb+jp@aX6$wOZ{1@7PN9Iv*Pu;oQ^|
zN-3;=wK$H0wU)hM$j=uR`Z2Z&1_YR#oTOH(k@0%fB64XM3!u<?T~?JEu*L$2QY6_d
zyH-|+tVILEj)SihO=AXPY!wU$u)MsCh;YF5Xc|K_o?&RU%kL`{?wy!mNNZfBsFyPQ
z?#(mo-?j~{6evYKNqE^>7FSjf5j?FCdQQuKh!9%~O0m4We0`W+1p@+9t5qDwVLl9b
zcX}FYEPLVxT7*Uv@%s2UuIsY<!U|cfDR;Y^n3*AtV|J~q;3>tfe4aDgx09wRzV9O<
zB;78%yIsyKF7{(=6$}V4J3Gti)2B&9xN&I-1$2O{)+8d_TB!h#(93Mg7<OE^KqP{H
zC`DFl@{YrvrKSGAfVwdl5xhbHrBpx0R>6P(uG=e~Z#MC@?hRYO*P3@4jsA6PExy*A
zZMBH4C0O^{?5%oz;JyBJyFCzNtKf>g@jkwT>2>S8wZi=30);}6a-~ACSnN%N0=}bZ
zHJc~}6Qv2tl?sm5Y@gXS(B{&`i}3Dp`M%-WD(DMfjA4F$9%BsWm#e(>&KaP0h}pQ5
z{amg$d!LzKBA?GAA~c&#pm(gkSXt|r=gX@DfiAakIo4J|Uw~4nM6Fh%R4VbzGtXQT
llk)iEk4vM`*it9M{{mp^Tz8l8zw7`2002ovPDHLkV1hP1a=icm


From 3bbba1fcc598d5f6c588be2a76d5c0f1a589cb8c Mon Sep 17 00:00:00 2001
From: FalloutFalcon <falloutfalconplays@gmail.com>
Date: Wed, 22 Nov 2023 18:25:19 -0600
Subject: [PATCH 06/89] might try to port some eris stuff (foolish)

---
 code/modules/guncrafting/lathe.dm | 32 +++++++++++++++++++++++--------
 1 file changed, 24 insertions(+), 8 deletions(-)

diff --git a/code/modules/guncrafting/lathe.dm b/code/modules/guncrafting/lathe.dm
index f9ecd3e2a03a..9b9c4910a31f 100644
--- a/code/modules/guncrafting/lathe.dm
+++ b/code/modules/guncrafting/lathe.dm
@@ -37,18 +37,25 @@
 /obj/structure/lathe/attack_hand(mob/living/carbon/human/user)
 	if(!mode)
 		var/list/choose_options = list()
-		if(istype(work_piece, /obj/item))
-			choose_options += list("Deconstruct" = image(icon = 'icons/obj/tools.dmi', icon_state = "welder"))
-			choose_options += list("Research" = image(icon = 'icons/obj/tools.dmi', icon_state = "analyzer"))
-		if(blueprint)
-			choose_options += list("Fabricate" = image(icon = 'icons/obj/tools.dmi', icon_state = "wrench"))
+		choose_options += list("Deconstruct" = image(icon = 'icons/obj/tools.dmi', icon_state = "welder"))
+		choose_options += list("Research" = image(icon = 'icons/obj/tools.dmi', icon_state = "analyzer"))
+		choose_options += list("Fabricate" = image(icon = 'icons/obj/tools.dmi', icon_state = "wrench"))
 		mode = show_radial_menu(user, src, choose_options, radius = 38, require_near = TRUE)
 	if(mode && !working)
 		if(mode == "Deconstruct")
+			if(!work_piece)
+				to_chat(user, "There is no item on the lathe.")
+				return
 			deconstruct_part(user)
 		if(mode == "Research")
+			if(!work_piece)
+				to_chat(user, "There is no item on the lathe.")
+				return
 			research_part(user)
 		if(mode == "Fabricate")
+			if(!blueprint)
+				to_chat(user, "There is no blueprint on the lathe.")
+				return
 			fabricate_part(user)
 
 /obj/structure/lathe/attackby(obj/item/I, mob/user)
@@ -175,7 +182,16 @@
 	icon = 'icons/obj/guncrafting.dmi'
 	icon_state = "blueprint"
 	var/design = FALSE
+	var/blueprint = FALSE
+
+/obj/item/blueprint/winchester
+	name = "Winchester Blueprint"
+	design = /obj/item/gun/ballistic/shotgun/winchester/mk2
+	blueprint = /datum/design/winchestermk2
+
+/obj/item/blueprint/gun_frame
+	name = "Gun Frame Blueprint"
+	design = /obj/item/mod_gun/frame
+	blueprint = /datum/design/gun_frame
+
 
-/obj/item/blueprint/gun
-	name = "Gun Blueprint"
-	design = /obj/item/gun/ballistic/shotgun/winchester/mk1

From 39679d8577ecc0ec65831afc00d5259b2c4228d6 Mon Sep 17 00:00:00 2001
From: FalloutFalcon <falloutfalconplays@gmail.com>
Date: Thu, 23 Nov 2023 14:12:22 -0600
Subject: [PATCH 07/89] gun parts

---
 code/modules/guncrafting/lathe.dm | 37 +++++++++++++++++++++++++++----
 1 file changed, 33 insertions(+), 4 deletions(-)

diff --git a/code/modules/guncrafting/lathe.dm b/code/modules/guncrafting/lathe.dm
index 9b9c4910a31f..31d4f2755fb2 100644
--- a/code/modules/guncrafting/lathe.dm
+++ b/code/modules/guncrafting/lathe.dm
@@ -168,13 +168,42 @@
 // ITEMS //
 ///////////
 
-/obj/item/gun_part
+/obj/item/stack/gun_part
 	name = "Gun Part"
 	desc = "This could fabcricate metal parts."
 	icon = 'icons/obj/guncrafting.dmi'
 	icon_state = "work_piece"
-
-/obj/item/mod_gun/frame
+	max_amount = 10
+
+/obj/item/part/gun
+	name = "gun part"
+	desc = "Spare part of gun."
+
+/obj/item/part/gun/frame
+	name = "gun frame"
+	desc = "a generic gun frame. consider debug"
+	var/result = /obj/item/gun/ballistic
+
+	// Currently installed grip
+	var/obj/item/part/gun/modular/grip/InstalledGrip
+	// Which grips does the frame accept?
+	var/list/gripvars = list(/obj/item/part/gun/modular/grip/wood, /obj/item/part/gun/modular/grip/black)
+	
+	// What are the results (in order relative to gripvars)?
+	//var/list/resultvars = list(/obj/item/gun/ballistic, /obj/item/gun/energy)
+
+	// Currently installed mechanism
+	var/obj/item/part/gun/modular/grip/InstalledMechanism
+	// Which mechanism the frame accepts?
+	var/list/mechanismvar = /obj/item/part/gun/modular/mechanism
+
+	// Currently installed barrel
+	var/obj/item/part/gun/modular/barrel/InstalledBarrel
+	// Which barrels does the frame accept?
+	var/list/barrelvars = list(/obj/item/part/gun/modular/barrel)
+
+	// Bonuses from forging/type or maluses from printing
+	var/cheap = FALSE // Set this to true for cheap variants
 
 /obj/item/blueprint
 	name = "Blueprint"
@@ -191,7 +220,7 @@
 
 /obj/item/blueprint/gun_frame
 	name = "Gun Frame Blueprint"
-	design = /obj/item/mod_gun/frame
+	design = /obj/item/part/gun/frame
 	blueprint = /datum/design/gun_frame
 
 

From d3155d0e2dc69351643caef7da199c7070b0dd18 Mon Sep 17 00:00:00 2001
From: FalloutFalcon <falloutfalconplays@gmail.com>
Date: Fri, 24 Nov 2023 18:39:53 -0600
Subject: [PATCH 08/89] "works" dont like how this is handled

---
 code/modules/guncrafting/lathe.dm | 213 +++++++++++++++++++++++++++---
 1 file changed, 196 insertions(+), 17 deletions(-)

diff --git a/code/modules/guncrafting/lathe.dm b/code/modules/guncrafting/lathe.dm
index 31d4f2755fb2..373a71df018e 100644
--- a/code/modules/guncrafting/lathe.dm
+++ b/code/modules/guncrafting/lathe.dm
@@ -116,8 +116,8 @@
 /obj/structure/lathe/proc/scrap_item(mob/user)
 	to_chat(user, "The [work_piece.name] is broken down into parts.")
 	playsound(src,'sound/items/welder.ogg',50,TRUE)
-	if(istype (work_piece, /obj/item/gun))
-		var/obj/item/new_part = new /obj/item/gun_part
+	if(istype (work_piece, /obj/item/modgun))
+		var/obj/item/new_part = new /obj/item/part/gun
 		new_part.forceMove(drop_location())
 	var/datum/component/material_container/materials = GetComponent(/datum/component/material_container)
 	var/material_amount = materials.get_item_material_amount(work_piece)
@@ -182,15 +182,15 @@
 /obj/item/part/gun/frame
 	name = "gun frame"
 	desc = "a generic gun frame. consider debug"
-	var/result = /obj/item/gun/ballistic
+	var/result = /obj/item/modgun
 
 	// Currently installed grip
 	var/obj/item/part/gun/modular/grip/InstalledGrip
 	// Which grips does the frame accept?
 	var/list/gripvars = list(/obj/item/part/gun/modular/grip/wood, /obj/item/part/gun/modular/grip/black)
-	
+
 	// What are the results (in order relative to gripvars)?
-	//var/list/resultvars = list(/obj/item/gun/ballistic, /obj/item/gun/energy)
+	var/list/resultvars = list(/obj/item/modgun, /obj/item/modgun)
 
 	// Currently installed mechanism
 	var/obj/item/part/gun/modular/grip/InstalledMechanism
@@ -205,6 +205,197 @@
 	// Bonuses from forging/type or maluses from printing
 	var/cheap = FALSE // Set this to true for cheap variants
 
+/obj/item/part/gun/frame/New(loc, ...)
+	. = ..()
+	var/obj/item/modgun/G = new result(null)
+
+/obj/item/part/gun/frame/New(loc)
+	..()
+	var/spawn_with_preinstalled_parts = FALSE
+
+	if(spawn_with_preinstalled_parts)
+		var/list/parts_list = list("mechanism", "barrel", "grip")
+
+		pick_n_take(parts_list)
+		if(prob(50))
+			pick_n_take(parts_list)
+
+		for(var/part in parts_list)
+			switch(part)
+				if("mechanism")
+					InstalledMechanism = new mechanismvar(src)
+				if("barrel")
+					var/select = pick(barrelvars)
+					InstalledBarrel = new select(src)
+				if("grip")
+					var/select = pick(gripvars)
+					InstalledGrip = new select(src)
+					var/variantnum = gripvars.Find(select)
+					result = resultvars[variantnum]
+
+/obj/item/part/gun/frame/proc/eject_item(obj/item/I, mob/living/user)
+	if(!I || !user.IsAdvancedToolUser() || user.stat || !user.Adjacent(I))
+		return FALSE
+	user.put_in_hands(I)
+	playsound(src.loc, 'sound/weapons/gun/pistol/mag_insert_alt.ogg', 75, 1)
+	user.visible_message(
+		"[user] removes [I] from [src].",
+		span_notice("You remove [I] from [src].")
+	)
+	return TRUE
+
+/obj/item/part/gun/frame/proc/insert_item(obj/item/I, mob/living/user)
+	if(!I || !istype(user) || user.stat)
+		return FALSE
+	I.forceMove(src)
+	playsound(src.loc, 'sound/weapons/gun/pistol/mag_release_alt.ogg', 75, 1)
+	to_chat(user, span_notice("You insert [I] into [src]."))
+	return TRUE
+
+/obj/item/part/gun/frame/proc/replace_item(obj/item/I_old, obj/item/I_new, mob/living/user)
+	if(!I_old || !I_new || !istype(user) || user.stat || !user.Adjacent(I_new) || !user.Adjacent(I_old))
+		return FALSE
+	I_new.forceMove(src)
+	user.put_in_hands(I_old)
+	playsound(src.loc, 'sound/weapons/gun/pistol/mag_release_alt.ogg', 75, 1)
+	spawn(2)
+		playsound(src.loc, 'sound/weapons/gun/pistol/mag_insert_alt.ogg', 75, 1)
+	user.visible_message(
+		"[user] replaces [I_old] with [I_new] in [src].",
+		span_notice("You replace [I_old] with [I_new] in [src]."))
+	return TRUE
+
+/obj/item/part/gun/frame/attackby(obj/item/I, mob/living/user, params)
+	if(istype(I, /obj/item/part/gun/modular/grip))
+		if(InstalledGrip)
+			to_chat(user, span_warning("[src] already has a grip attached!"))
+			return
+		else
+			handle_gripvar(I, user)
+
+	if(istype(I, /obj/item/part/gun/modular/mechanism))
+		if(InstalledMechanism)
+			to_chat(user, span_warning("[src] already has a mechanism attached!"))
+			return
+		else
+			handle_mechanismvar(I, user)
+
+	if(istype(I, /obj/item/part/gun/modular/barrel))
+		if(InstalledBarrel)
+			to_chat(user, span_warning("[src] already has a barrel attached!"))
+			return
+		else
+			handle_barrelvar(I, user)
+
+	if(I.tool_behaviour == TOOL_SCREWDRIVER)
+		var/list/possibles = contents.Copy()
+		var/obj/item/part/gun/toremove = input("Which part would you like to remove?","Removing parts") in possibles
+		if(!toremove)
+			return
+		if(I.use_tool(src, user, 40, volume=50))
+			eject_item(toremove, user)
+			if(istype(toremove, /obj/item/part/gun/modular/grip))
+				InstalledGrip = null
+			else if(istype(toremove, /obj/item/part/gun/modular/barrel))
+				InstalledBarrel = FALSE
+			else if(istype(toremove, /obj/item/part/gun/modular/mechanism))
+				InstalledMechanism = FALSE
+
+	return ..()
+
+/obj/item/part/gun/frame/proc/handle_gripvar(obj/item/I, mob/living/user)
+	if(I.type in gripvars)
+		if(insert_item(I, user))
+			var/variantnum = gripvars.Find(I.type)
+			result = resultvars[variantnum]
+			InstalledGrip = I
+			to_chat(user, span_notice("You have attached the grip to \the [src]."))
+			return
+	else
+		to_chat(user, span_warning("This grip does not fit!"))
+		return
+
+/obj/item/part/gun/frame/proc/handle_mechanismvar(obj/item/I, mob/living/user)
+	if(I.type == mechanismvar)
+		if(insert_item(I, user))
+			InstalledMechanism = I
+			to_chat(user, span_notice("You have attached the mechanism to \the [src]."))
+			return
+	else
+		to_chat(user, span_warning("This mechanism does not fit!"))
+		return
+
+/obj/item/part/gun/frame/proc/handle_barrelvar(obj/item/I, mob/living/user)
+	if(I.type in barrelvars)
+		if(insert_item(I, user))
+			InstalledBarrel = I
+			to_chat(user, span_notice("You have attached the barrel to \the [src]."))
+			return
+	else
+		to_chat(user, span_warning("This barrel does not fit!"))
+		return
+
+/obj/item/part/gun/frame/attack_self(mob/user)
+	. = ..()
+	var/turf/T = get_turf(src)
+	if(!InstalledGrip)
+		to_chat(user, span_warning("\the [src] does not have a grip!"))
+		return
+	if(!InstalledMechanism)
+		to_chat(user, span_warning("\the [src] does not have a mechanism!"))
+		return
+	if(!InstalledBarrel)
+		to_chat(user, span_warning("\the [src] does not have a barrel!"))
+		return
+	var/obj/item/modgun/G = new result(T)
+	if(barrelvars.len > 1 && istype(G, /obj/item/modgun))
+		var/obj/item/modgun/P = G
+		P.caliber = InstalledBarrel.caliber
+		G.gun_parts = list(src.type = 1, InstalledGrip.type = 1, InstalledMechanism.type = 1, InstalledBarrel.type = 1)
+	qdel(src)
+	return
+
+/obj/item/part/gun/frame/examine(user, distance)
+	. = ..()
+	if(.)
+		if(InstalledGrip)
+			to_chat(user, span_notice("\the [src] has \a [InstalledGrip] installed."))
+		else
+			to_chat(user, span_notice("\the [src] does not have a grip installed."))
+		if(InstalledMechanism)
+			to_chat(user, span_notice("\the [src] has \a [InstalledMechanism] installed."))
+		else
+			to_chat(user, span_notice("\the [src] does not have a mechanism installed."))
+		if(InstalledBarrel)
+			to_chat(user, span_notice("\the [src] has \a [InstalledBarrel] installed."))
+		else
+			to_chat(user, span_notice("\the [src] does not have a barrel installed."))
+
+/obj/item/modgun
+	name = "gun"
+	desc = "A gun."
+	icon = 'icons/obj/guns/projectile.dmi'
+	icon_state = "detective"
+	item_state = "gun"
+	var/caliber = 357
+	var/gun_parts = list()
+
+/obj/item/part/gun
+	name = "gun part"
+	desc = "Spare part of gun."
+	icon = 'icons/obj/guncrafting.dmi'
+	icon_state = "gun_part"
+
+/obj/item/part/gun/modular
+/obj/item/part/gun/modular/grip/wood
+	name = "wooden grip"
+/obj/item/part/gun/modular/grip/black
+	name = "black grip"
+/obj/item/part/gun/modular/mechanism
+	name = "mechanism"
+/obj/item/part/gun/modular/barrel
+	name = "barrel"
+	var/caliber = 357
 /obj/item/blueprint
 	name = "Blueprint"
 	desc = "This could be used to make a gun."
@@ -212,15 +403,3 @@
 	icon_state = "blueprint"
 	var/design = FALSE
 	var/blueprint = FALSE
-
-/obj/item/blueprint/winchester
-	name = "Winchester Blueprint"
-	design = /obj/item/gun/ballistic/shotgun/winchester/mk2
-	blueprint = /datum/design/winchestermk2
-
-/obj/item/blueprint/gun_frame
-	name = "Gun Frame Blueprint"
-	design = /obj/item/part/gun/frame
-	blueprint = /datum/design/gun_frame
-
-

From 5bbc36a8aafa0ce0eb90393d265fbf3393277436 Mon Sep 17 00:00:00 2001
From: FalloutFalcon <falloutfalconplays@gmail.com>
Date: Sat, 25 Nov 2023 00:57:15 -0600
Subject: [PATCH 09/89] we getting there

---
 code/modules/guncrafting/lathe.dm |  37 +++++++++++++++++++++++++-----
 icons/obj/crafts.dmi              | Bin 0 -> 8184 bytes
 2 files changed, 31 insertions(+), 6 deletions(-)
 create mode 100644 icons/obj/crafts.dmi

diff --git a/code/modules/guncrafting/lathe.dm b/code/modules/guncrafting/lathe.dm
index 373a71df018e..407a41f77681 100644
--- a/code/modules/guncrafting/lathe.dm
+++ b/code/modules/guncrafting/lathe.dm
@@ -182,6 +182,8 @@
 /obj/item/part/gun/frame
 	name = "gun frame"
 	desc = "a generic gun frame. consider debug"
+	icon_state = "frame_olivaw"
+	generic = FALSE
 	var/result = /obj/item/modgun
 
 	// Currently installed grip
@@ -380,21 +382,44 @@
 	var/caliber = 357
 	var/gun_parts = list()
 
+/obj/item/part
+	icon ='icons/obj/crafts.dmi'
+
 /obj/item/part/gun
 	name = "gun part"
 	desc = "Spare part of gun."
-	icon = 'icons/obj/guncrafting.dmi'
-	icon_state = "gun_part"
+	icon_state = "gun_part_1"
+	var/generic = TRUE
+
+/obj/item/part/gun/Initialize()
+	. = ..()
+	if(generic)
+		icon_state = "gun_part_[rand(1,6)]"
 
 /obj/item/part/gun/modular
+	name = "modular gun part"
+	desc = "You dont think this should exist."
+	generic = FALSE
+
 /obj/item/part/gun/modular/grip/wood
-	name = "wooden grip"
+	name = "wood grip"
+	desc = "A wood firearm grip, unattached from a firearm."
+	icon_state = "grip_wood"
+
 /obj/item/part/gun/modular/grip/black
-	name = "black grip"
+	name = "plastic grip"
+	desc = "A black plastic firearm grip, unattached from a firearm. For sleekness and decorum."
+	icon_state = "grip_black"
+
 /obj/item/part/gun/modular/mechanism
-	name = "mechanism"
+	name = "generic mechanism"
+	desc = "All the bits that makes the bullet go bang."
+	icon_state = "mechanism_pistol"
+
 /obj/item/part/gun/modular/barrel
-	name = "barrel"
+	name = "generic barrel"
+	desc = "A gun barrel, which keeps the bullet going in the right direction."
+	icon_state = "barrel_35"
 	var/caliber = 357
 /obj/item/blueprint
 	name = "Blueprint"
diff --git a/icons/obj/crafts.dmi b/icons/obj/crafts.dmi
new file mode 100644
index 0000000000000000000000000000000000000000..7f510b84c7e37b249bd78629ed8d933ff40839df
GIT binary patch
literal 8184
zcmZ8`WmFtcv*a*1!QI{69R_!Ich}$qA3V4-5Zo=eyA#|)a0%|gg0uO~?!LEgf85ij
z`)A*(Q`OyH)l_6rkO+|g004@-oRkIt044UHhXDPr@~ol_`IjiDDQQXf_xJ0#Ii(cF
zBPvR<iORKg*V@?Fh=_>r7AjUZwUY%}rKP2D^NZ+Mx{1l?)6vm!f)vJW#Qzja#itjJ
zkB{%}A3Ayll9AD|F^HuY^Y*4$q7qP8(sM_AP1EJ1^-|*=U;xRedF1%0)OC%<DY346
zXO<wuC#Pj+=aG?T;$<MDcI6?Lprz7~;}c?HCa0w1<CRd;w)!lun(V2ZtVK2Wg+0RC
zpe!du-@rUsi;G9pKcIOP^kpC+5z;j<PEN(rH8RG+A*`)$*)uktn)VGJpK@q?IxQ12
zI6Stpxur%(6Uic6FD}K#Cr8c5YiR5N5a*6gE=*CK1~{^IkN=#BSrU>|FrqHozxqo@
z&&|cF9+sr1W8|h}0qW}cBB#JZM=5|sK+QrUDgjc(CZJT;b^Mx=&&4Y*&(814!%0of
zGd#aM_(kwv8;kr4uKqO_%2Pu{6Cif@%LV`ddiiPTc}iJ(Si0MP_Oy3(0RVh+(jk*B
z>+I;#D-XK(<Gs<Q_Fczia%xuduc7Qkqm)dd;S@AuPtOY(nzq^|7u0*m0y$$il`qS)
zN2Y9b)#cl4lgTvMJGvm9E;h8uk$G<Uqs$ANjyWfT+_Fpvy<1SXqc3;NRYvTn+!XZL
z!5;a(uitxAgLOK!Z*h#B&?9BBlib>4D?&;;xwdLbk{6p<%ji5xf{UAHRIxvC;P8AM
zx*q{NS4hKmNUvbzoEdc=Lo2?4p$19hgxU%-K9Rmdoad6;(xF=IP`1=BoppDIy8TNi
z8a{r+y53b?j4iD0cT!ri$r8)b@o&dfTf^8BG#*^&q+ujr_x3C)63im=d}bs4A1<CG
zPL%15a<lA36tEodhL;21;;GVkGLn0YMyq}fCzNb-W0BMloFEL=t_Mr1PpE`rl&oy8
zSoh@5<!J%bt>u;CVD=h>cr21Qzxk33d+5v8vd23?7X)E#vA2k2Db>^1&M6a;y#yd2
z9MkUpe3A3tBfO`v5B0mVbl9$MIo|(XN;?@R8y1Z;Dzy^E^68f>%=!Q(=^vXiy4~5Q
z>!>nQDo(xz+ZJHyb9NyB{$-yCx-s*11i3D?-oE{nC+GSv^A9`CyjcQBK=4gK!a(wu
zpTPZ80iPUv2@k8g4$qfDSz}HU`vgQCz~s^7WDTYZeH%}9eUKOv#g7`jBJCuql;YjU
z@EKv7F!I*~7j!Qe7eratQLq!9jD{Vn!;J#)b9QgWXp%|=Q5uuP?5m76;pPFgBR?Ch
z6!#{pX^cK<*y&E*Nf^kDQC39gd*{dY-lgtrooZ$<LNFB7!2T2r^XosV6RpcjiEH`h
zTo}JeV#&6d;Czk7G+3&_iEVMl1!c#zILEL)p+}GOvaOgnZpUie8#p>%eSF-C98HbQ
zOwCM50Kk5EC=}yUmouU-Iaw$#pJ^xYk>SGr1bsgL)ez<~s6N_YIhIKFQBNSeYZk?%
z3J9bF4{U1kul~BHMTHYvtE|M*EH78d7xX&4Lq*Kt_kP_UPpugEiimLV`!}DZ`|~k}
zotDojGG$4BldY`{rXgS<Nvs6jG!%DC$HLORk>Ir%3ZjLexgizTwJkW+`FTPmC-3?A
zcVd}JE`K3H4gKfC^9`dMiM{jow1OagPPr&$(7J{WBy8LxWPFtSU63!(g|nUZPnRn4
zjEb^yE}aquD?fD}|92ezdqifs<DQ;}snx7lE_Ecj1p9}OzTaa!;Fy8YeQq&PdpIHv
z6dr^^pb;5C8qp_hsP~XpKe(||@{qpOPe?xwV9jnr&Fi&xuvu_mXL5R?Rc*t-PPaZA
z*YLT8%#otX4Cp2&mI&z4Q#@buPXG}q{r2N#;bKL#1k4_-*cG2E8+{=nARfn_UO>Q1
zMt%-|DR%S_{AWD1osskN4JC*KPQOfG3`n`)yp6E)jPg<}F`Ybzw?!h5*sdB1Dvo;0
zPf*@0iR@FnNBs5p?M|9xI}i*fwexh#3)ZxqQOZpk9$2hgELVMkk)VsF5XLI_Y!NEu
zJ2giqYZ+*SB577!iQohSv|rFMqwc5El)P(2a4Lvly5nOt?hSa-fX4f(I3r_II4R^B
z@mUVc?pg4tlHU&tbArVm_A0LG+n_*U(z-Ltp|K@Dl21`j@xnrqP4TDFPpn|c)RP$&
zMMbuY{~X%fc3c$w@muXpCJ(FOBu&9hqw>zVmK+$5l^^MKKb0YEo1vv0W)I&z`7w-7
ztWYSY;5CFTWp^AYI15n`XRyJfTOSibPCibapoREu27fe&Lzv072z}yc)a$uQcfF{Z
z+^>p54MrdSN$xH&Qb#+7xJzK6@+Xr4>1Za~ouJ<n*16UiIT*XClSoNMH}zSdgu|p<
zB{UWM*!)xaT>@u;q6VS608#3JHOEKR9LbbW<W2*#;_=(iQEUot!CZpH4r*2^=iTEi
z4n)c`q+U*r0bM7-8{F<dHDx+YE&(%>*G3^UoFevizd}EUxg#A58Zv|ZL1FT$td!&V
zBx!61Th?q%B3C3lLWcP(I)S2{(L@eTH@{|(5f)e%;1G$<ljOTCb9hk44#o|3gQIIk
z6?u0;+-orId0w^EEymtyYq5eUe{SanyS)u$XEMcVE5LLj&jbm6GiGqi5lEd@WwBZ!
zI32+@37@IkXB*v-@@AnTdA>V2!`~D!emlQ~3FCRQdiIxbN4MuKdY*J(ElKWY`jp=Z
znZ{L$P@N$U)5XP|NIaaz^7i$>4aR_@Ydl-AfVcU}Q~<KLc7P0JQ&@2ZCNC%j;<&gJ
ze?o+Q>4*I$P8>=Rgy$LY#q2uOX%}g(1{7N7O&0toImib?Hm=DAk;9i++)Oj<F6u5Y
zGFmI1OwJNBa-KWv>+;wk+qVdFA1K@~eSwgG%87E$cBCA5;E|$AA0+DF_ZLSdyrU@%
z^Xs+yGX|h@fS2~4zh8tCEDPMoIii<pgjs`s>_ouo<zNi6=EK8L#88CC!+?N@He~DR
zJ8SwZw$<vwZm-WRXF=O|gUhqM&!<dj6xVH*z%$mgMW)1AGWK?Mp%?3YS8((fV%eFT
z4)+nc&+oD4v5BBY9LO{zVvC<2bvvp~RgCO2O*ItqU_Nw&<uMx-+}MZ5cI~^$qqQ^2
zvm|+>$5*zp!{TM*IkM|IX7a!m<URHj!l=|=V<7%3+}q|j#MecJgxz&Ybat7?cT2ao
zwHCy^MACbTsc5r-PG*ZZ=rhKg0W)^|IFh|%0RvRL9e+kHepb1Fn*N4?z1z8sy!a}Z
z*jaIp=M8}<4EyO%Uu5v1xKG}j-fWA<Jw|glL<ovGJVDoC;rp{sUDlS_E~g8eEP;Mo
z3aJ@#Xh}mlOtXfSNU^be4_zoRpl@Q_=SnKo5z#keab;dy-?Q2qyl)S`-)*^WzYA(_
zxcCS<OO*)Yg>>T_UC;1sGjFwH&~R+_I^UZ^y%W2RmYi`fJ6a!@PF<{sUIx8fOdGag
z#=l;^T)76nd8G}jw5?x|Ti~dLikW-9#QLDeHtcD=#DRq5&7=EjR_lkj_TB6aY-tZr
zJHOz$arJ(zZ&SF)PO687K!EC@UlhQx+kjxcA{g2=y0`cgFn^f%yMm*5vHj+*7o#3o
z>A5&x-`j3fSDOQ3T$CF;4nCSWIr_2UU1%)&;8&N=3~Qp?TRisY{dgR3RIe0o(>9NN
zXm{BUw7-F`50_{@nwwM32<GT!l;Nq*#iHyyadJ>Hv6+{fi7jY|)WyQ0e3ZpjX?<}<
zBl3o`4~R-$i*4ZED@|jw>^?y#%wPtnt*+pYca8dr)n+)b92;b>E<@}kXZRE<*k=*=
z`reiHP7OwU*TTbRqIq8c!n{+$@Fq!|Xu3qAvCo*wByb7bjrJbsS0&sxRP>bqzV=zc
zx7PuOA4XuJ%_FD)qOy^@Fu^G#$^}(>W0mIYf-=j0L%MLxm_*>V<vt~?wP8DxrO0m6
z42o#QfRJ}NLl58>4H@dZvh^RaH#@&@Z9)eHzIZEy+z`^rlbgVmjV4*4>8*<{m`)XD
z?Ipg8486E(RQ_68;a9`%(df+TjF#C*NF<LQ&P0#UVT^R$(2FwxVmhqjNqTUOnEp(&
zRMRKqN3kJ}Y#eelTV><^V;a72slSvFgq6}j5JiWD^g1Siy0E^iTu)RVKS!1abVK+>
z5?rA!5YF9%rUv$R>V5&>w6{H?<FuEX!E*k`BK!y9|2v>^h4UZd5<Blp52oOWZT5_Z
z0f?c6<$W|-w6FnSMLT1P$qE&#Gqub9?+~`wq73m)rrMx|zhi&wPFq_o_i>X-O=g`r
zh=WyBzp#mg(m%fifn)c_4;VA85!TwlUSg!6ON_(Gh)NQH2N&^6jeF?XpKHr-N0XNg
zu?V4El*o}`19PQ-H9g30Je-Dpjt7`zH5N_G5}X&ph@M&o)7AoqohQE?zBh3f5~v!q
z<pa7WcT&M#3xO)J2BSyA+1zQNcqDH0iW?66+M3$hcH}!hiI7Vq-%!(ZvC_BD!4R1w
z+awV3)y=VcmmY$Lg+kf|9&6JitcFVhU{6;JM_d|z=G5qy!8xuv5c(Cn8KVbkmE+(s
zxqh#H&YZ)jGK8Om9~r>pDb+AT3%}*=;9CH^U|SMcdu5DdsnGD%-Y2zEF7#F&t`0qD
zOlXN!X}cH{2u%Nu_W)<5X~pvbxqE=uuBqKi^@yex70h7|ETZ%KlDI@b%fB^QU5xit
zeAsmLEo2lT%yy@Sv#r*CvHnEw1)!*@?R+f+j1OGNmP^&?#;-e51w{HZ!^T-GbJ2^$
zuS4FT?nB0zU<+XcMZLYI4kjr65c8)2uz2cMEw0$|-Wh%+0GcHIZqQ)sZ>w?0slIx)
z3BLmd|Lf2H9|T~48!eE}94}cqjc<$2GN1U;1Ab#}re-F@z1bVF{J1Ut&UEeWY`v4V
zj`FF4Er#+<^fm>l({<OlO^DEoMurLmRoK`{9~>FJ%-x8Z%)qdRzM&Zo+uC>t*m}O?
zdI2zg*BUcB7sPS>R#LulW|u;o>?N}q#VZVpJ5m4Bp#{m(l*=~xfw|;^F?}-`wbxS+
zB^R1_556@-7&f_|nnxUL4LvJ*kX_E%xQXK%Qz|{{3VCfmX24DmL3?_^_(A{$jwvED
zPUu9FH8!9&f(7#ICt+vP{-y4Gkm9VpBaS5|jWck{t@%Y<Q(&i~@Ko~!X)sae2Yw4C
zCd6Hs@iuRkl)wY&Boswx3Wmg-!rijpExq8W@R3^BQ(&;Zlt!t5oz(d2h6+V`=CC<k
zw5wl=%t(XvCn7=0h6GHUb{p(=&bxCT>U#4I#QdU)##~8u)-Hvd{Vj}VZT67(ZW;V(
zsy@Z@3F$#E{Fh6?y^1MvngbbQGgbO~jB@b$ALz;?D7Rhgep^S$X^(U$Ob9hSc|CKL
z)1u4~po*oMxY$s-tjtS|zz#<)yg>qX$|6Il99e1*vz`kX3lAR}#OM=J(YOs_hd1KO
zhV#t?U}!hnvLn;mz7QqQznG!V7I!Q9&UnM~$DJ>_fRNe2T_aEdPZs}|`u_(838FFn
zQRifPXd*dQlsBw@#raO`3Y$M^IYG;QI%C~h50dV?{=AQH-kjVZn;69Dd$(Bpx7CMa
zQ1D~{gSvh_c|(L#FZk{qyW*<)Z^H`}T5SHLqfaf@S!AG7Y*5`xU2w<MN-~y}U2c%>
zkCRp&*R!*A3U-c&@7tY^#+M3Tl|-<wgN}1(d)oaKgb0DkVv3NIR*D5Ifdke>UY3UD
z=KT>dym9|<hOD2-!}kil76>4}r4vsw(eout`sxTYu`j9<n~JiEwo-NW&t?Kq^#Koj
zp=F=y(1wkaMGlT8phsC-%9PZiPA(Xgf22RvW&ZV$F9E51C1ZIpobU6w+Dg0(5<Jr|
zIy<Xq_U@8Eb?Z`rU!S*>GZN5-#zvG~bMM}8qq6@+L}C0`q-hY&C@Pv2g{<3_ooIpK
z1(QKckf?F;5oSW6>%8<-z2QOqJSrl?aCf=gw~dCb=k40tDTYGj>$z4D%iD9gCaSNg
zGTTU8t%o#diG8Z(berpW;bra4X<x&r&H*)!{xId-acmD4JyqpVwZi0ylFKm9p@!ro
z6Mi#0UO74$sK>yVtdDHoSA9$$oJ!~*0u-W3_n2<@lHf3r%jlcofAcwaRDRo}tvJq>
zmdAufwU`<~@|R|TFr777#YHFX1$XG=zMwd8cPKBwI-(wDC^P_U{eggVR|mc3?3{bH
zK);Lri`QG4za%9`rE{Y)RG-re0t3U}D1JNVBe5BRyc;u*JEV~%^M{*(A13>@T-wH2
z0{=Z1J;8(#7Kh%ygE!~hWkvNGUiL|C^+M)nLk4R1=Z+z<OKUnM%!-^H?RP5#U2HuA
zF8?9~$V2#YxxDw>l>-(%_lJ8jQJeq_6^sLEW$~E-18svXQRQE9RFC@X-+CQG4Kqn6
zrZ#p*6=4o3GK&xW^f@QU(d`$XQRya}E8vo=fQpWyxUFW%+7>Xa)Rd+4;<lu|(emVS
zJrM{keovk5j!gTF+ixKK{WWRhj-=YBvruA!Xhx)~Jjs^cdiw)A<x<medyCY5cJJRl
z+>F}dL)BRMUI#i%V~$BpDBTGmqyevW?mcQ5zeOU*1a;IFc$CUFe}Y@T--y6gy6VD^
zA}k$9^JRd#nCs;0dmM??foNzqR4+$0lA%U)gEqi1=s;PIx)g%{p}Y8T!L+FBTKcl6
z4xOE0E~Cj2*#;g$J_l9ImaOy?2E80RYL;wGU3R*|3mPI&$3c}_KD35<2W8zoVa~1l
z?|~;=HPx=$nWKHf>sJ{Wd!qiG)6BsRnB3ZG$^zP#nlrBJeLiT$|G4YExZ!~I^WI>k
z2rHy%Tj8-figwzot@fiy%nXbEBgb@6)#bpKJT^!*4Xa>}S0Sq4hF?z88t?YCP#ry(
z@lwpm?{(Nblsj9CD~Uv&-gW!!CBm*H{K_9=0lXGU*~}iIvWbM>+3!EkxJ#%vDevJA
zr-O3xOUlDGKbxF!u{oJ5v>QtT#O#Al8x-#R@l9=xmpKf#vt8llhaN+46{#}+GsHbg
zQs`r2E-QQKF1Y!q%1w??tpz$=YEOq;RfQFWA55?FE>4ggsko~}eq_NqLCcRjmXm;@
z>a32#wT7qtEGyM_jUXip-9hw&2J^=IB)3405{dY9DakL?95h7FqwY<L^IL5hZ19NW
zl+15ngY8D0-9>;Py*mqFp$_JTtvZbigf4D0TbDU*^g8gSAqLJ*tdSD<m!d=g3t{r2
zp0@{LG<HtO<;athzCGR|l+=pr$AnZdg0n1Y)1zP@<Iz|hr=?5eyBtd%bQxY{&)Q?S
zr26j4xmguGdIpSh6Z8V-p7U8t%e2c7f$$AYcU`D$?1k1CLL=>KiC?Q~msrP?Qf6gF
z&TG_HB$b!<TKd+IS%x#~JD1iaDX*qZErlj6I@lBpjj_)^<uT}^?uGXRQ@`FPN%Kg0
zcnXi+722N>wy^0zZMxc#Z8ZE<o+sL*x<}{$ajzcC_~Xmha7<7p2{#HkWP#O9It{8*
zf?AL?c0?gN50k15R~f8C-<^#HQh<r0KJkAOfAR*%e=okZzIZDhnfm{P0v~zQe_(V}
zylsd6cONh5$LsCyv98td+zk8jnf&6!kD%B6Ow+t2bcmATYM|W{E8|Zx=-fz$8XZ#l
zs;^+;B%ovH<Gkvh{XBlKwSZfJv*@IA6X8?i&0t9$;aaNrpyO>t0hWSJbGcr($I;B*
zUc6l8_zyLynfFE0;J_*q89&J>p~x(luuB<R6BAo+v64^olbp@71tW#s9->Busl*cu
zk@Mj)iyqI0SExdg0n{&WAdWrMhDVegmGJ%zt8z>VIKDg=@{nQE-Q`6GdLOIa%+^<X
zq45h&i>aBiL%rZR?J(4Y4Z+wzFEUbRO-ILLef@dOp@kvJBur~q&R*>Vb}~xvkXpD`
zOCS5D?6z2VAlDaj_rv=%UFmcuC*h#(KX)M2_pp$lYdqik$FDTv3V5qQ^oi!w!4oIy
zUDt4%phx>vDP6D?J~fep>UyRpZv8HyTD#4xt8zVJ2}x!dZ~DM_VW6kP4sMdjK0Eq5
zx2qTbZC>Jl14L}o{Q|`GkPttnnkO9eECqZX$lra76v-|SLTfUKZ<be`;jMm3y?yXL
zD7QA@NEA~~JCw`<&QsRkU8Z}a8NhF!=rK$RGDhWjc#hoMxPw*0i#RoXRzwhsV?dA`
z+2&aal`TiS`>BmaD;U}jW`fX`Iq?vB@xc#3o@hkdgWW=M%EDSoat)$JxPyW6CGYw?
zWhE0=drH=F__djyimS1Tb+;gU@=`L~b`q0X*i9sg@)}8S+*QJPD!M|Sf~`yR1J!9H
z2~fJ0IXTT--%w5wt9F0J#M*M`i9F3|CSZ;OM$kB}Tue0(VmVEzrtB2o)K#T#G7r@E
zBWHNCT+qzxqIIg%LfszcDmcn4T}?Db^Gc+x!5tlr-(og+IFy)DI6K;ZtY(}GqfBa+
zNugRVc6tqg%K$fJ-j(!S@Fr+sEb7Dms2lf+e9446E!>8Gm`Dq?g3;kM8>8tJYHo;n
zxZB12HR(?ZY|=6$$GQC6YcZ>PUa+MdJt}U$TZc>`lB%j;muuO&E8=<Ul@k|75%-&f
z_}pUfhy&f{E#o$IJ)bm)Xyw!#a+dwy^VNTQZA)e+7t*PqdE{bYj;Q(0$0?b{!`lw!
zVbUwmEQe!GZy-?>cuUCsN^ZLlgzxlbW67j``?NtUe3<w93_adb<6G?BmPoD;qcGS}
zmTsr2Lo%PFf4cwscAf~6zW*U-#X;-S>(i|={A{(Ac<G<)5Ufy#E9E%x6V9`xP3z1{
z%nwcV_N%|_w==PLyupTshW$GQQwweOe|Y}_z>LG&9-`n``5Zlw(c)-p_OuSV<ug0-
zsH4;+@~8wq{f;qITWLcgd(!cs-Ib)p?886JhFYZbu!A9D&MvD(F6bmG6IPv-p&4@D
zz7=QQjprznYY!k@`##+qgbB3SFX)Lcie`usb;(euffxEHmF;lKN{4EwJWe_`3q1Lf
z`%+b&&3HU$=ognyx`PL%ZHrVZSzb8CLZ_1P={Fgp5?TD-)?H`kY)Uz&>|sT>b2R%^
z)$F|yEJJ2RlJ@r$4Z$hs4kj*#@ZRwg(tSzeLL4Jj!$mxlmd6#Fq)!hD7YZ;KH8oY#
z*3grdaq?KDG%`sHk%wyce5(5B^ZoayIL&*@OcVC@=|f+oJ&X$OV9h4s&^r{$)0_n5
z@Z5{?4nA4jKPk2$e#7q9$i)SV85J&a9ri3-9Pjs2!;X%bg>!ODWO+HmqLzx|u6GFn
zP!zh33{EhpeF{XQ0<&NmiuyA|zt_=gnW)D)2hAJNQ<fqb&g$q|b33M%Nbeldh96FT
zz;<h0%Nkkm_{$f^E1UJrbx;+H_^1RH2(@{HiygqUAQ~;U?(qcBY<fTNQ*PWPMdVCx
zxrR;^uT7Y$(~j!qDR`yyeXayDV(hn{;t%sK<KNtr-WL+GNJx$-eh6~38RX+X$Bl66
zfaA8DX(Yb&gVPDI!*mbFn;6X!R*GzoWFuD8`v^wu&a_(sSsV;YwDw@V!r0&vRHrCZ
zEH&e48)W$Xaer>Ce08{!1GAa};j~k}saz3tBVnh9tmltofyLTG$90BSeTeY;Fklnn
z{f10r-_D8u<aw!rVFvL!@YXAt{0H7#l4BvD=Q#l4tFxowD~CkC=rzGDpXfDZ(v#(X
z=}la&81c9jZxlk&wk@g;^gP>hLylmaa|q%F4W!>V)ZLBvJ@^3BT|o3G91|B+^y4lr
z%$-!Wt=S=B)v-G$q&FSD?(9_h=%{+2_e^5H=;P(eDgdKz$O7kpQ5$`8XWLq+h_B5Q
zZ@*gsoqk2J3%*E>u0uTmRfuB&wG9n8mDUxbL^U&&v5-JDP4Iht&ER><u9oi%yD#G>
zc*Tc>A4kie&<{597VX}NPJQH8@iduD<mM0Jv_B+^Q&oK*tV8@2{UHoWd-20$u3KdZ
z3T??Yzi7m}3>RR63<oLa973~AIUDm;+CCYQ>gkB|e7L6rz{f8Xi+S0@D{Xoyh0*Sx
zfWY6(NbFT&gZaS>ulo8=(_~j$J^n9a+pb$ZfyI9^NL?pzak)R5cm}?MHn#m(#230~
z)LYs3QcqJ<Yd9r6BS(Rr*xoW|g+|lXjvQ7aDs@$6)<jc^uzu@wKHP`6Fr;B8u+j?u
z&M6=oAPnX^+{F8wuViAMBHZ(WMMXfuzxDaNqhI^f$zgh#=*7)lHL~YITS1iQ%1>T<
z*V{k_#!X}4;BP8HvNCmgd^SFXLMKwn|GfR9Y{$i*Cx-*(RzGob-ES&67gc6rPehc7
z^C0m3$Mfz7_IpwJMo*R8dO{;7w7K~-VV5oaOTUjR&(?e~@-D7-P?lYUa_>5L6C>*R
z2C8$`;CpmngkL@xdhp(&>66NsL^_y#*Nl{`e_1G?TN#D2zc4%0*9aJ2$E{?>lEil!
z7V@KSR4<<s{SrEGeXM<{qoV0)8G580kH!4I(Dgrk_`mFrC`GtD8jkYfn4A~{=8GMy
z70@THsP234ml-5t=m~*uOkGFfd`HJ%Bio|vins>lIpQs)?MHM-Ud9O#SxJAG%dk3J
i)7XFSS7d=7Xp=FAHuwG!B>#@i0C{N@sagrM(EkOvyKM>p

literal 0
HcmV?d00001


From db2edc32a09122630acad770354fb63b3d4e14f4 Mon Sep 17 00:00:00 2001
From: FalloutFalcon <falloutfalconplays@gmail.com>
Date: Sat, 25 Nov 2023 01:02:02 -0600
Subject: [PATCH 10/89] grip dont control gun and seperate files

---
 code/modules/guncrafting/frame.dm | 197 +++++++++++++++++++++++++
 code/modules/guncrafting/lathe.dm | 237 ------------------------------
 code/modules/guncrafting/part.dm  |  39 +++++
 shiptest.dme                      |   2 +
 4 files changed, 238 insertions(+), 237 deletions(-)
 create mode 100644 code/modules/guncrafting/frame.dm
 create mode 100644 code/modules/guncrafting/part.dm

diff --git a/code/modules/guncrafting/frame.dm b/code/modules/guncrafting/frame.dm
new file mode 100644
index 000000000000..0ea6a1e791b9
--- /dev/null
+++ b/code/modules/guncrafting/frame.dm
@@ -0,0 +1,197 @@
+/obj/item/part/gun/frame
+	name = "gun frame"
+	desc = "a generic gun frame. consider debug"
+	icon_state = "frame_olivaw"
+	generic = FALSE
+	var/result = /obj/item/modgun
+
+	// Currently installed grip
+	var/obj/item/part/gun/modular/grip/InstalledGrip
+	// Which grips does the frame accept?
+	var/list/gripvars = list(/obj/item/part/gun/modular/grip/wood, /obj/item/part/gun/modular/grip/black)
+
+	// What are the results (in order relative to gripvars)?
+	var/list/resultvars = list(/obj/item/modgun, /obj/item/modgun)
+
+	// Currently installed mechanism
+	var/obj/item/part/gun/modular/grip/InstalledMechanism
+	// Which mechanism the frame accepts?
+	//var/list/mechanismvar = /obj/item/part/gun/modular/mechanism
+
+	// Currently installed barrel
+	var/obj/item/part/gun/modular/barrel/InstalledBarrel
+	// Which barrels does the frame accept?
+	var/list/barrelvars = list(/obj/item/part/gun/modular/barrel)
+
+	// Bonuses from forging/type or maluses from printing
+	var/cheap = FALSE // Set this to true for cheap variants
+
+/obj/item/part/gun/frame/New(loc, ...)
+	. = ..()
+	var/obj/item/modgun/G = new result(null)
+
+/obj/item/part/gun/frame/New(loc)
+	..()
+	var/spawn_with_preinstalled_parts = FALSE
+
+	if(spawn_with_preinstalled_parts)
+		var/list/parts_list = list("mechanism", "barrel", "grip")
+
+		pick_n_take(parts_list)
+		if(prob(50))
+			pick_n_take(parts_list)
+
+		for(var/part in parts_list)
+			switch(part)
+				if("mechanism")
+					InstalledMechanism = new mechanismvar(src)
+				if("barrel")
+					var/select = pick(barrelvars)
+					InstalledBarrel = new select(src)
+				if("grip")
+					var/select = pick(gripvars)
+					InstalledGrip = new select(src)
+					/*
+					var/variantnum = gripvars.Find(select)
+					result = resultvars[variantnum]
+					*/
+
+/obj/item/part/gun/frame/proc/eject_item(obj/item/I, mob/living/user)
+	if(!I || !user.IsAdvancedToolUser() || user.stat || !user.Adjacent(I))
+		return FALSE
+	user.put_in_hands(I)
+	playsound(src.loc, 'sound/weapons/gun/pistol/mag_insert_alt.ogg', 75, 1)
+	user.visible_message(
+		"[user] removes [I] from [src].",
+		span_notice("You remove [I] from [src].")
+	)
+	return TRUE
+
+/obj/item/part/gun/frame/proc/insert_item(obj/item/I, mob/living/user)
+	if(!I || !istype(user) || user.stat)
+		return FALSE
+	I.forceMove(src)
+	playsound(src.loc, 'sound/weapons/gun/pistol/mag_release_alt.ogg', 75, 1)
+	to_chat(user, span_notice("You insert [I] into [src]."))
+	return TRUE
+
+/obj/item/part/gun/frame/proc/replace_item(obj/item/I_old, obj/item/I_new, mob/living/user)
+	if(!I_old || !I_new || !istype(user) || user.stat || !user.Adjacent(I_new) || !user.Adjacent(I_old))
+		return FALSE
+	I_new.forceMove(src)
+	user.put_in_hands(I_old)
+	playsound(src.loc, 'sound/weapons/gun/pistol/mag_release_alt.ogg', 75, 1)
+	spawn(2)
+		playsound(src.loc, 'sound/weapons/gun/pistol/mag_insert_alt.ogg', 75, 1)
+	user.visible_message(
+		"[user] replaces [I_old] with [I_new] in [src].",
+		span_notice("You replace [I_old] with [I_new] in [src]."))
+	return TRUE
+
+/obj/item/part/gun/frame/attackby(obj/item/I, mob/living/user, params)
+	if(istype(I, /obj/item/part/gun/modular/grip))
+		if(InstalledGrip)
+			to_chat(user, span_warning("[src] already has a grip attached!"))
+			return
+		else
+			handle_gripvar(I, user)
+
+	if(istype(I, /obj/item/part/gun/modular/mechanism))
+		if(InstalledMechanism)
+			to_chat(user, span_warning("[src] already has a mechanism attached!"))
+			return
+		else
+			handle_mechanismvar(I, user)
+
+	if(istype(I, /obj/item/part/gun/modular/barrel))
+		if(InstalledBarrel)
+			to_chat(user, span_warning("[src] already has a barrel attached!"))
+			return
+		else
+			handle_barrelvar(I, user)
+
+	if(I.tool_behaviour == TOOL_SCREWDRIVER)
+		var/list/possibles = contents.Copy()
+		var/obj/item/part/gun/toremove = input("Which part would you like to remove?","Removing parts") in possibles
+		if(!toremove)
+			return
+		if(I.use_tool(src, user, 40, volume=50))
+			eject_item(toremove, user)
+			if(istype(toremove, /obj/item/part/gun/modular/grip))
+				InstalledGrip = null
+			else if(istype(toremove, /obj/item/part/gun/modular/barrel))
+				InstalledBarrel = FALSE
+			else if(istype(toremove, /obj/item/part/gun/modular/mechanism))
+				InstalledMechanism = FALSE
+
+	return ..()
+
+/obj/item/part/gun/frame/proc/handle_gripvar(obj/item/I, mob/living/user)
+	if(I.type in gripvars)
+		if(insert_item(I, user))
+			/*
+			var/variantnum = gripvars.Find(I.type)
+			result = resultvars[variantnum]
+			*/
+			InstalledGrip = I
+			to_chat(user, span_notice("You have attached the grip to \the [src]."))
+			return
+	else
+		to_chat(user, span_warning("This grip does not fit!"))
+		return
+
+/obj/item/part/gun/frame/proc/handle_mechanismvar(obj/item/I, mob/living/user)
+	if(I.type == mechanismvar)
+		if(insert_item(I, user))
+			InstalledMechanism = I
+			to_chat(user, span_notice("You have attached the mechanism to \the [src]."))
+			return
+	else
+		to_chat(user, span_warning("This mechanism does not fit!"))
+		return
+
+/obj/item/part/gun/frame/proc/handle_barrelvar(obj/item/I, mob/living/user)
+	if(I.type in barrelvars)
+		if(insert_item(I, user))
+			InstalledBarrel = I
+			to_chat(user, span_notice("You have attached the barrel to \the [src]."))
+			return
+	else
+		to_chat(user, span_warning("This barrel does not fit!"))
+		return
+
+/obj/item/part/gun/frame/attack_self(mob/user)
+	. = ..()
+	var/turf/T = get_turf(src)
+	if(!InstalledGrip)
+		to_chat(user, span_warning("\the [src] does not have a grip!"))
+		return
+	if(!InstalledMechanism)
+		to_chat(user, span_warning("\the [src] does not have a mechanism!"))
+		return
+	if(!InstalledBarrel)
+		to_chat(user, span_warning("\the [src] does not have a barrel!"))
+		return
+	var/obj/item/modgun/G = new result(T)
+	if(barrelvars.len > 1 && istype(G, /obj/item/modgun))
+		var/obj/item/modgun/P = G
+		P.caliber = InstalledBarrel.caliber
+		G.gun_parts = list(src.type = 1, InstalledGrip.type = 1, InstalledMechanism.type = 1, InstalledBarrel.type = 1)
+	qdel(src)
+	return
+
+/obj/item/part/gun/frame/examine(user, distance)
+	. = ..()
+	if(.)
+		if(InstalledGrip)
+			to_chat(user, span_notice("\the [src] has \a [InstalledGrip] installed."))
+		else
+			to_chat(user, span_notice("\the [src] does not have a grip installed."))
+		if(InstalledMechanism)
+			to_chat(user, span_notice("\the [src] has \a [InstalledMechanism] installed."))
+		else
+			to_chat(user, span_notice("\the [src] does not have a mechanism installed."))
+		if(InstalledBarrel)
+			to_chat(user, span_notice("\the [src] has \a [InstalledBarrel] installed."))
+		else
+			to_chat(user, span_notice("\the [src] does not have a barrel installed."))
diff --git a/code/modules/guncrafting/lathe.dm b/code/modules/guncrafting/lathe.dm
index 407a41f77681..5c954c7c8f15 100644
--- a/code/modules/guncrafting/lathe.dm
+++ b/code/modules/guncrafting/lathe.dm
@@ -175,204 +175,6 @@
 	icon_state = "work_piece"
 	max_amount = 10
 
-/obj/item/part/gun
-	name = "gun part"
-	desc = "Spare part of gun."
-
-/obj/item/part/gun/frame
-	name = "gun frame"
-	desc = "a generic gun frame. consider debug"
-	icon_state = "frame_olivaw"
-	generic = FALSE
-	var/result = /obj/item/modgun
-
-	// Currently installed grip
-	var/obj/item/part/gun/modular/grip/InstalledGrip
-	// Which grips does the frame accept?
-	var/list/gripvars = list(/obj/item/part/gun/modular/grip/wood, /obj/item/part/gun/modular/grip/black)
-
-	// What are the results (in order relative to gripvars)?
-	var/list/resultvars = list(/obj/item/modgun, /obj/item/modgun)
-
-	// Currently installed mechanism
-	var/obj/item/part/gun/modular/grip/InstalledMechanism
-	// Which mechanism the frame accepts?
-	var/list/mechanismvar = /obj/item/part/gun/modular/mechanism
-
-	// Currently installed barrel
-	var/obj/item/part/gun/modular/barrel/InstalledBarrel
-	// Which barrels does the frame accept?
-	var/list/barrelvars = list(/obj/item/part/gun/modular/barrel)
-
-	// Bonuses from forging/type or maluses from printing
-	var/cheap = FALSE // Set this to true for cheap variants
-
-/obj/item/part/gun/frame/New(loc, ...)
-	. = ..()
-	var/obj/item/modgun/G = new result(null)
-
-/obj/item/part/gun/frame/New(loc)
-	..()
-	var/spawn_with_preinstalled_parts = FALSE
-
-	if(spawn_with_preinstalled_parts)
-		var/list/parts_list = list("mechanism", "barrel", "grip")
-
-		pick_n_take(parts_list)
-		if(prob(50))
-			pick_n_take(parts_list)
-
-		for(var/part in parts_list)
-			switch(part)
-				if("mechanism")
-					InstalledMechanism = new mechanismvar(src)
-				if("barrel")
-					var/select = pick(barrelvars)
-					InstalledBarrel = new select(src)
-				if("grip")
-					var/select = pick(gripvars)
-					InstalledGrip = new select(src)
-					var/variantnum = gripvars.Find(select)
-					result = resultvars[variantnum]
-
-/obj/item/part/gun/frame/proc/eject_item(obj/item/I, mob/living/user)
-	if(!I || !user.IsAdvancedToolUser() || user.stat || !user.Adjacent(I))
-		return FALSE
-	user.put_in_hands(I)
-	playsound(src.loc, 'sound/weapons/gun/pistol/mag_insert_alt.ogg', 75, 1)
-	user.visible_message(
-		"[user] removes [I] from [src].",
-		span_notice("You remove [I] from [src].")
-	)
-	return TRUE
-
-/obj/item/part/gun/frame/proc/insert_item(obj/item/I, mob/living/user)
-	if(!I || !istype(user) || user.stat)
-		return FALSE
-	I.forceMove(src)
-	playsound(src.loc, 'sound/weapons/gun/pistol/mag_release_alt.ogg', 75, 1)
-	to_chat(user, span_notice("You insert [I] into [src]."))
-	return TRUE
-
-/obj/item/part/gun/frame/proc/replace_item(obj/item/I_old, obj/item/I_new, mob/living/user)
-	if(!I_old || !I_new || !istype(user) || user.stat || !user.Adjacent(I_new) || !user.Adjacent(I_old))
-		return FALSE
-	I_new.forceMove(src)
-	user.put_in_hands(I_old)
-	playsound(src.loc, 'sound/weapons/gun/pistol/mag_release_alt.ogg', 75, 1)
-	spawn(2)
-		playsound(src.loc, 'sound/weapons/gun/pistol/mag_insert_alt.ogg', 75, 1)
-	user.visible_message(
-		"[user] replaces [I_old] with [I_new] in [src].",
-		span_notice("You replace [I_old] with [I_new] in [src]."))
-	return TRUE
-
-/obj/item/part/gun/frame/attackby(obj/item/I, mob/living/user, params)
-	if(istype(I, /obj/item/part/gun/modular/grip))
-		if(InstalledGrip)
-			to_chat(user, span_warning("[src] already has a grip attached!"))
-			return
-		else
-			handle_gripvar(I, user)
-
-	if(istype(I, /obj/item/part/gun/modular/mechanism))
-		if(InstalledMechanism)
-			to_chat(user, span_warning("[src] already has a mechanism attached!"))
-			return
-		else
-			handle_mechanismvar(I, user)
-
-	if(istype(I, /obj/item/part/gun/modular/barrel))
-		if(InstalledBarrel)
-			to_chat(user, span_warning("[src] already has a barrel attached!"))
-			return
-		else
-			handle_barrelvar(I, user)
-
-	if(I.tool_behaviour == TOOL_SCREWDRIVER)
-		var/list/possibles = contents.Copy()
-		var/obj/item/part/gun/toremove = input("Which part would you like to remove?","Removing parts") in possibles
-		if(!toremove)
-			return
-		if(I.use_tool(src, user, 40, volume=50))
-			eject_item(toremove, user)
-			if(istype(toremove, /obj/item/part/gun/modular/grip))
-				InstalledGrip = null
-			else if(istype(toremove, /obj/item/part/gun/modular/barrel))
-				InstalledBarrel = FALSE
-			else if(istype(toremove, /obj/item/part/gun/modular/mechanism))
-				InstalledMechanism = FALSE
-
-	return ..()
-
-/obj/item/part/gun/frame/proc/handle_gripvar(obj/item/I, mob/living/user)
-	if(I.type in gripvars)
-		if(insert_item(I, user))
-			var/variantnum = gripvars.Find(I.type)
-			result = resultvars[variantnum]
-			InstalledGrip = I
-			to_chat(user, span_notice("You have attached the grip to \the [src]."))
-			return
-	else
-		to_chat(user, span_warning("This grip does not fit!"))
-		return
-
-/obj/item/part/gun/frame/proc/handle_mechanismvar(obj/item/I, mob/living/user)
-	if(I.type == mechanismvar)
-		if(insert_item(I, user))
-			InstalledMechanism = I
-			to_chat(user, span_notice("You have attached the mechanism to \the [src]."))
-			return
-	else
-		to_chat(user, span_warning("This mechanism does not fit!"))
-		return
-
-/obj/item/part/gun/frame/proc/handle_barrelvar(obj/item/I, mob/living/user)
-	if(I.type in barrelvars)
-		if(insert_item(I, user))
-			InstalledBarrel = I
-			to_chat(user, span_notice("You have attached the barrel to \the [src]."))
-			return
-	else
-		to_chat(user, span_warning("This barrel does not fit!"))
-		return
-
-/obj/item/part/gun/frame/attack_self(mob/user)
-	. = ..()
-	var/turf/T = get_turf(src)
-	if(!InstalledGrip)
-		to_chat(user, span_warning("\the [src] does not have a grip!"))
-		return
-	if(!InstalledMechanism)
-		to_chat(user, span_warning("\the [src] does not have a mechanism!"))
-		return
-	if(!InstalledBarrel)
-		to_chat(user, span_warning("\the [src] does not have a barrel!"))
-		return
-	var/obj/item/modgun/G = new result(T)
-	if(barrelvars.len > 1 && istype(G, /obj/item/modgun))
-		var/obj/item/modgun/P = G
-		P.caliber = InstalledBarrel.caliber
-		G.gun_parts = list(src.type = 1, InstalledGrip.type = 1, InstalledMechanism.type = 1, InstalledBarrel.type = 1)
-	qdel(src)
-	return
-
-/obj/item/part/gun/frame/examine(user, distance)
-	. = ..()
-	if(.)
-		if(InstalledGrip)
-			to_chat(user, span_notice("\the [src] has \a [InstalledGrip] installed."))
-		else
-			to_chat(user, span_notice("\the [src] does not have a grip installed."))
-		if(InstalledMechanism)
-			to_chat(user, span_notice("\the [src] has \a [InstalledMechanism] installed."))
-		else
-			to_chat(user, span_notice("\the [src] does not have a mechanism installed."))
-		if(InstalledBarrel)
-			to_chat(user, span_notice("\the [src] has \a [InstalledBarrel] installed."))
-		else
-			to_chat(user, span_notice("\the [src] does not have a barrel installed."))
-
 /obj/item/modgun
 	name = "gun"
 	desc = "A gun."
@@ -382,45 +184,6 @@
 	var/caliber = 357
 	var/gun_parts = list()
 
-/obj/item/part
-	icon ='icons/obj/crafts.dmi'
-
-/obj/item/part/gun
-	name = "gun part"
-	desc = "Spare part of gun."
-	icon_state = "gun_part_1"
-	var/generic = TRUE
-
-/obj/item/part/gun/Initialize()
-	. = ..()
-	if(generic)
-		icon_state = "gun_part_[rand(1,6)]"
-
-/obj/item/part/gun/modular
-	name = "modular gun part"
-	desc = "You dont think this should exist."
-	generic = FALSE
-
-/obj/item/part/gun/modular/grip/wood
-	name = "wood grip"
-	desc = "A wood firearm grip, unattached from a firearm."
-	icon_state = "grip_wood"
-
-/obj/item/part/gun/modular/grip/black
-	name = "plastic grip"
-	desc = "A black plastic firearm grip, unattached from a firearm. For sleekness and decorum."
-	icon_state = "grip_black"
-
-/obj/item/part/gun/modular/mechanism
-	name = "generic mechanism"
-	desc = "All the bits that makes the bullet go bang."
-	icon_state = "mechanism_pistol"
-
-/obj/item/part/gun/modular/barrel
-	name = "generic barrel"
-	desc = "A gun barrel, which keeps the bullet going in the right direction."
-	icon_state = "barrel_35"
-	var/caliber = 357
 /obj/item/blueprint
 	name = "Blueprint"
 	desc = "This could be used to make a gun."
diff --git a/code/modules/guncrafting/part.dm b/code/modules/guncrafting/part.dm
new file mode 100644
index 000000000000..697d5e26febc
--- /dev/null
+++ b/code/modules/guncrafting/part.dm
@@ -0,0 +1,39 @@
+/obj/item/part
+	icon ='icons/obj/crafts.dmi'
+
+/obj/item/part/gun
+	name = "gun part"
+	desc = "Spare part of gun."
+	icon_state = "gun_part_1"
+	var/generic = TRUE
+
+/obj/item/part/gun/Initialize()
+	. = ..()
+	if(generic)
+		icon_state = "gun_part_[rand(1,6)]"
+
+/obj/item/part/gun/modular
+	name = "modular gun part"
+	desc = "You dont think this should exist."
+	generic = FALSE
+
+/obj/item/part/gun/modular/grip/wood
+	name = "wood grip"
+	desc = "A wood firearm grip, unattached from a firearm."
+	icon_state = "grip_wood"
+
+/obj/item/part/gun/modular/grip/black
+	name = "plastic grip"
+	desc = "A black plastic firearm grip, unattached from a firearm. For sleekness and decorum."
+	icon_state = "grip_black"
+
+/obj/item/part/gun/modular/mechanism
+	name = "generic mechanism"
+	desc = "All the bits that makes the bullet go bang."
+	icon_state = "mechanism_pistol"
+
+/obj/item/part/gun/modular/barrel
+	name = "generic barrel"
+	desc = "A gun barrel, which keeps the bullet going in the right direction."
+	icon_state = "barrel_35"
+	var/caliber = 357
diff --git a/shiptest.dme b/shiptest.dme
index 412bbd5f8c7e..15600e073602 100644
--- a/shiptest.dme
+++ b/shiptest.dme
@@ -2161,7 +2161,9 @@
 #include "code\modules\games\cas.dm"
 #include "code\modules\games\kotahi.dm"
 #include "code\modules\games\tarot.dm"
+#include "code\modules\guncrafting\frame.dm"
 #include "code\modules\guncrafting\lathe.dm"
+#include "code\modules\guncrafting\part.dm"
 #include "code\modules\holiday\easter.dm"
 #include "code\modules\holiday\foreign_calendar.dm"
 #include "code\modules\holiday\holidays.dm"

From de7c2b5e20656f473e40cd24312e6e26c5a89ae6 Mon Sep 17 00:00:00 2001
From: FalloutFalcon <falloutfalconplays@gmail.com>
Date: Sat, 25 Nov 2023 11:01:56 -0600
Subject: [PATCH 11/89] shrug

---
 code/modules/guncrafting/part.dm | 2 ++
 1 file changed, 2 insertions(+)

diff --git a/code/modules/guncrafting/part.dm b/code/modules/guncrafting/part.dm
index 697d5e26febc..17a03247668b 100644
--- a/code/modules/guncrafting/part.dm
+++ b/code/modules/guncrafting/part.dm
@@ -16,6 +16,8 @@
 	name = "modular gun part"
 	desc = "You dont think this should exist."
 	generic = FALSE
+	var/list/attached_mods = list()
+	var/list/legal_mods = list()
 
 /obj/item/part/gun/modular/grip/wood
 	name = "wood grip"

From 22de36f410a942ac71aac58fef482cf5055bd43e Mon Sep 17 00:00:00 2001
From: FalloutFalcon <falloutfalconplays@gmail.com>
Date: Fri, 19 Jan 2024 00:45:07 -0600
Subject: [PATCH 12/89] scrap blueprint system

---
 code/modules/guncrafting/frame.dm | 33 ++++++-----------
 code/modules/guncrafting/lathe.dm | 61 +++++--------------------------
 code/modules/projectiles/gun.dm   |  3 ++
 3 files changed, 25 insertions(+), 72 deletions(-)

diff --git a/code/modules/guncrafting/frame.dm b/code/modules/guncrafting/frame.dm
index 0ea6a1e791b9..a6120a6e76a0 100644
--- a/code/modules/guncrafting/frame.dm
+++ b/code/modules/guncrafting/frame.dm
@@ -3,20 +3,17 @@
 	desc = "a generic gun frame. consider debug"
 	icon_state = "frame_olivaw"
 	generic = FALSE
-	var/result = /obj/item/modgun
+	var/result = /obj/item/gun
 
 	// Currently installed grip
 	var/obj/item/part/gun/modular/grip/InstalledGrip
 	// Which grips does the frame accept?
 	var/list/gripvars = list(/obj/item/part/gun/modular/grip/wood, /obj/item/part/gun/modular/grip/black)
 
-	// What are the results (in order relative to gripvars)?
-	var/list/resultvars = list(/obj/item/modgun, /obj/item/modgun)
-
 	// Currently installed mechanism
 	var/obj/item/part/gun/modular/grip/InstalledMechanism
 	// Which mechanism the frame accepts?
-	//var/list/mechanismvar = /obj/item/part/gun/modular/mechanism
+	var/list/mechanismvar = /obj/item/part/gun/modular/mechanism
 
 	// Currently installed barrel
 	var/obj/item/part/gun/modular/barrel/InstalledBarrel
@@ -32,15 +29,10 @@
 
 /obj/item/part/gun/frame/New(loc)
 	..()
-	var/spawn_with_preinstalled_parts = FALSE
+	var/spawn_with_preinstalled_parts = TRUE
 
 	if(spawn_with_preinstalled_parts)
 		var/list/parts_list = list("mechanism", "barrel", "grip")
-
-		pick_n_take(parts_list)
-		if(prob(50))
-			pick_n_take(parts_list)
-
 		for(var/part in parts_list)
 			switch(part)
 				if("mechanism")
@@ -51,10 +43,6 @@
 				if("grip")
 					var/select = pick(gripvars)
 					InstalledGrip = new select(src)
-					/*
-					var/variantnum = gripvars.Find(select)
-					result = resultvars[variantnum]
-					*/
 
 /obj/item/part/gun/frame/proc/eject_item(obj/item/I, mob/living/user)
 	if(!I || !user.IsAdvancedToolUser() || user.stat || !user.Adjacent(I))
@@ -184,14 +172,17 @@
 	. = ..()
 	if(.)
 		if(InstalledGrip)
-			to_chat(user, span_notice("\the [src] has \a [InstalledGrip] installed."))
+			. += "<span class='notice'>\the [src] has \a [InstalledGrip] installed.</span>"
 		else
-			to_chat(user, span_notice("\the [src] does not have a grip installed."))
+			. += "<span class='notice'>\the [src] does not have a grip installed.</span>"
 		if(InstalledMechanism)
-			to_chat(user, span_notice("\the [src] has \a [InstalledMechanism] installed."))
+			. += "<span class='notice'>\the [src] has \a [InstalledMechanism] installed.</span>"
 		else
-			to_chat(user, span_notice("\the [src] does not have a mechanism installed."))
+			. += "<span class='notice'>\the [src] does not have a mechanism installed.</span>"
 		if(InstalledBarrel)
-			to_chat(user, span_notice("\the [src] has \a [InstalledBarrel] installed."))
+			. += "<span class='notice'>\the [src] has \a [InstalledBarrel] installed.</span>"
 		else
-			to_chat(user, span_notice("\the [src] does not have a barrel installed."))
+			. += "<span class='notice'>\the [src] does not have a barrel installed.</span>"
+
+/obj/item/part/gun/frame/mk1
+	result = /obj/item/gun/ballistic/shotgun/winchester/mk1
diff --git a/code/modules/guncrafting/lathe.dm b/code/modules/guncrafting/lathe.dm
index 5c954c7c8f15..a29644753a79 100644
--- a/code/modules/guncrafting/lathe.dm
+++ b/code/modules/guncrafting/lathe.dm
@@ -1,5 +1,5 @@
 #define DECONSTRUCT_STAMINA_MINIMUM 50
-#define DECONSTRUCT_STAMINA_USE 40
+#define DECONSTRUCT_STAMINA_USE 20
 
 /obj/structure/lathe
 	name = "Machine Lathe"
@@ -9,7 +9,6 @@
 	density = TRUE
 	anchored = FALSE
 	var/obj/item/work_piece = FALSE
-	var/obj/item/blueprint/blueprint = FALSE
 	var/steps_left = 0
 	//Whether there is an active job on the table
 	var/in_progress = FALSE
@@ -38,7 +37,6 @@
 	if(!mode)
 		var/list/choose_options = list()
 		choose_options += list("Deconstruct" = image(icon = 'icons/obj/tools.dmi', icon_state = "welder"))
-		choose_options += list("Research" = image(icon = 'icons/obj/tools.dmi', icon_state = "analyzer"))
 		choose_options += list("Fabricate" = image(icon = 'icons/obj/tools.dmi', icon_state = "wrench"))
 		mode = show_radial_menu(user, src, choose_options, radius = 38, require_near = TRUE)
 	if(mode && !working)
@@ -47,25 +45,10 @@
 				to_chat(user, "There is no item on the lathe.")
 				return
 			deconstruct_part(user)
-		if(mode == "Research")
-			if(!work_piece)
-				to_chat(user, "There is no item on the lathe.")
-				return
-			research_part(user)
 		if(mode == "Fabricate")
-			if(!blueprint)
-				to_chat(user, "There is no blueprint on the lathe.")
-				return
 			fabricate_part(user)
 
 /obj/structure/lathe/attackby(obj/item/I, mob/user)
-	if(istype(I, /obj/item/blueprint))
-		if(blueprint)
-			to_chat(user, "You cant add another blueprint to the lathe.")
-			return
-		I.forceMove(src)
-		blueprint = I
-		return
 	if(work_piece)
 		to_chat(user, "You cant add another item to the lathe.")
 		return
@@ -101,6 +84,9 @@
 	if(!in_progress)
 		in_progress = TRUE
 		steps_left = 3
+	if(user.getStaminaLoss() > DECONSTRUCT_STAMINA_MINIMUM)
+		balloon_alert(user, "too tired")
+		return
 	working = TRUE
 	if(do_after(user, 20, work_piece))
 		if(steps_left > 1)
@@ -116,9 +102,13 @@
 /obj/structure/lathe/proc/scrap_item(mob/user)
 	to_chat(user, "The [work_piece.name] is broken down into parts.")
 	playsound(src,'sound/items/welder.ogg',50,TRUE)
-	if(istype (work_piece, /obj/item/modgun))
+	if(istype (work_piece, /obj/item/gun))
+		var/obj/item/gun/gun_work_piece = work_piece
 		var/obj/item/new_part = new /obj/item/part/gun
 		new_part.forceMove(drop_location())
+		if(gun_work_piece.frame)
+			var/obj/item/frame = gun_work_piece.frame
+			frame.forceMove(drop_location())
 	var/datum/component/material_container/materials = GetComponent(/datum/component/material_container)
 	var/material_amount = materials.get_item_material_amount(work_piece)
 	if(material_amount)
@@ -126,43 +116,12 @@
 		materials.retrieve_all()
 	destroy_part(user)
 
-//////////////
-// RESEARCH //
-//////////////
-
-/obj/structure/lathe/proc/research_part(mob/living/carbon/human/user)
-	if(!in_progress)
-		in_progress = TRUE
-		steps_left = 3
-	working = TRUE
-	if(do_after(user, 20, work_piece))
-		if(steps_left > 1)
-			steps_left--
-			playsound(src,'sound/items/welder2.ogg',50,TRUE)
-			to_chat(user, "You have [steps_left] steps left.")
-			user.adjustStaminaLoss(DECONSTRUCT_STAMINA_USE)
-			research_part(user)
-		else
-			var/obj/item/blueprint/blueprint = new /obj/item/blueprint
-			blueprint.desc += "\nA blueprint on [work_piece.name]."
-			blueprint.design = work_piece
-			blueprint.forceMove(drop_location())
-			if(Adjacent(user) && !issilicon(user))
-				user.put_in_hands(blueprint)
-			remove_part(user)
-	working = FALSE
-
 ///////////////
 // FABRICATE //
 ///////////////
 
 /obj/structure/lathe/proc/fabricate_part(mob/living/carbon/human/user)
-	if(blueprint)
-		var/obj/item/new_part = new blueprint.design(loc)
-		new_part.forceMove(drop_location())
-		if(Adjacent(user) && !issilicon(user))
-			user.put_in_hands(new_part)
-
+	return
 
 ///////////
 // ITEMS //
diff --git a/code/modules/projectiles/gun.dm b/code/modules/projectiles/gun.dm
index b250e23751d5..e3b503b4b30e 100644
--- a/code/modules/projectiles/gun.dm
+++ b/code/modules/projectiles/gun.dm
@@ -133,6 +133,9 @@
 	///If the saftey on? If so, we can't fire the weapon
 	var/safety = FALSE
 
+	// Used when deconstructing
+	var/frame = FALSE
+
 /obj/item/gun/Initialize()
 	. = ..()
 	RegisterSignal(src, COMSIG_TWOHANDED_WIELD, PROC_REF(on_wield))

From 8f28e6bd1766f3c940d8b2f372586ffe8feae3db Mon Sep 17 00:00:00 2001
From: FalloutFalcon <falloutfalconplays@gmail.com>
Date: Fri, 19 Jan 2024 20:51:26 -0600
Subject: [PATCH 13/89] frames on gun init

---
 code/modules/guncrafting/frame.dm |  4 ----
 code/modules/guncrafting/lathe.dm | 29 +++++++++++++++++++++++++----
 code/modules/projectiles/gun.dm   |  4 +++-
 3 files changed, 28 insertions(+), 9 deletions(-)

diff --git a/code/modules/guncrafting/frame.dm b/code/modules/guncrafting/frame.dm
index a6120a6e76a0..1c6de3a7b5b5 100644
--- a/code/modules/guncrafting/frame.dm
+++ b/code/modules/guncrafting/frame.dm
@@ -23,10 +23,6 @@
 	// Bonuses from forging/type or maluses from printing
 	var/cheap = FALSE // Set this to true for cheap variants
 
-/obj/item/part/gun/frame/New(loc, ...)
-	. = ..()
-	var/obj/item/modgun/G = new result(null)
-
 /obj/item/part/gun/frame/New(loc)
 	..()
 	var/spawn_with_preinstalled_parts = TRUE
diff --git a/code/modules/guncrafting/lathe.dm b/code/modules/guncrafting/lathe.dm
index a29644753a79..dada9a36ec15 100644
--- a/code/modules/guncrafting/lathe.dm
+++ b/code/modules/guncrafting/lathe.dm
@@ -34,6 +34,9 @@
 	remove_part(user)
 
 /obj/structure/lathe/attack_hand(mob/living/carbon/human/user)
+	if(!work_piece)
+		to_chat(user, "There is no item on the lathe.")
+		return
 	if(!mode)
 		var/list/choose_options = list()
 		choose_options += list("Deconstruct" = image(icon = 'icons/obj/tools.dmi', icon_state = "welder"))
@@ -41,9 +44,6 @@
 		mode = show_radial_menu(user, src, choose_options, radius = 38, require_near = TRUE)
 	if(mode && !working)
 		if(mode == "Deconstruct")
-			if(!work_piece)
-				to_chat(user, "There is no item on the lathe.")
-				return
 			deconstruct_part(user)
 		if(mode == "Fabricate")
 			fabricate_part(user)
@@ -121,7 +121,28 @@
 ///////////////
 
 /obj/structure/lathe/proc/fabricate_part(mob/living/carbon/human/user)
-	return
+	if(istype (work_piece, /obj/item/gun))
+		var/obj/item/gun/gun_work_piece = work_piece
+		var/list/choose_options = list()
+		choose_options += list("Grip" = image(icon ='icons/obj/crafts.dmi', icon_state = "grip_wood"))
+		choose_options += list("Mechanism" = image(icon ='icons/obj/crafts.dmi', icon_state = "mechanism_pistol"))
+		choose_options += list("Barrel" = image(icon ='icons/obj/crafts.dmi', icon_state = "barrel_35"))
+		if(gun_work_piece.frame)
+			choose_options += list("Frame" = image(icon ='icons/obj/crafts.dmi', icon_state = gun_work_piece.frame.icon_state))
+		var/choosen_part = show_radial_menu(user, src, choose_options, radius = 38, require_near = TRUE)
+		if(choosen_part)
+			var/obj/part_to_build
+			switch(choosen_part)
+				if("Grip")
+					part_to_build = new /obj/item/part/gun/modular/grip/wood
+				if("Mechanism")
+					part_to_build = new /obj/item/part/gun/modular/mechanism
+				if("Barrel")
+					part_to_build = new /obj/item/part/gun/modular/barrel
+				if("Frame")
+					part_to_build = new /obj/item/part/gun/frame
+			part_to_build.forceMove(drop_location())
+	mode = FALSE
 
 ///////////
 // ITEMS //
diff --git a/code/modules/projectiles/gun.dm b/code/modules/projectiles/gun.dm
index e3b503b4b30e..8f53f5895835 100644
--- a/code/modules/projectiles/gun.dm
+++ b/code/modules/projectiles/gun.dm
@@ -134,10 +134,12 @@
 	var/safety = FALSE
 
 	// Used when deconstructing
-	var/frame = FALSE
+	var/obj/item/part/gun/frame/frame
 
 /obj/item/gun/Initialize()
 	. = ..()
+	if(!frame)
+		frame = new(src)
 	RegisterSignal(src, COMSIG_TWOHANDED_WIELD, PROC_REF(on_wield))
 	RegisterSignal(src, COMSIG_TWOHANDED_UNWIELD, PROC_REF(on_unwield))
 	if(pin)

From 976ae141b84266f4d630597b67199e56c2d634aa Mon Sep 17 00:00:00 2001
From: FalloutFalcon <falloutfalconplays@gmail.com>
Date: Mon, 22 Jan 2024 17:28:32 -0600
Subject: [PATCH 14/89] dynamicly generate the parts

---
 code/modules/guncrafting/lathe.dm | 17 ++++++++++-------
 1 file changed, 10 insertions(+), 7 deletions(-)

diff --git a/code/modules/guncrafting/lathe.dm b/code/modules/guncrafting/lathe.dm
index dada9a36ec15..f1e49db7242f 100644
--- a/code/modules/guncrafting/lathe.dm
+++ b/code/modules/guncrafting/lathe.dm
@@ -124,9 +124,12 @@
 	if(istype (work_piece, /obj/item/gun))
 		var/obj/item/gun/gun_work_piece = work_piece
 		var/list/choose_options = list()
-		choose_options += list("Grip" = image(icon ='icons/obj/crafts.dmi', icon_state = "grip_wood"))
-		choose_options += list("Mechanism" = image(icon ='icons/obj/crafts.dmi', icon_state = "mechanism_pistol"))
-		choose_options += list("Barrel" = image(icon ='icons/obj/crafts.dmi', icon_state = "barrel_35"))
+		if(gun_work_piece.frame.InstalledGrip)
+			choose_options += list("Grip" = image(icon ='icons/obj/crafts.dmi', icon_state = gun_work_piece.frame.InstalledGrip.icon_state))
+		if(gun_work_piece.frame.InstalledMechanism)
+			choose_options += list("Mechanism" = image(icon ='icons/obj/crafts.dmi', icon_state = gun_work_piece.frame.InstalledMechanism.icon_state))
+		if(gun_work_piece.frame.InstalledBarrel)
+			choose_options += list("Barrel" = image(icon ='icons/obj/crafts.dmi', icon_state = gun_work_piece.frame.InstalledBarrel.icon_state))
 		if(gun_work_piece.frame)
 			choose_options += list("Frame" = image(icon ='icons/obj/crafts.dmi', icon_state = gun_work_piece.frame.icon_state))
 		var/choosen_part = show_radial_menu(user, src, choose_options, radius = 38, require_near = TRUE)
@@ -134,13 +137,13 @@
 			var/obj/part_to_build
 			switch(choosen_part)
 				if("Grip")
-					part_to_build = new /obj/item/part/gun/modular/grip/wood
+					part_to_build = new gun_work_piece.frame.InstalledGrip.type
 				if("Mechanism")
-					part_to_build = new /obj/item/part/gun/modular/mechanism
+					part_to_build = new gun_work_piece.frame.InstalledMechanism.type
 				if("Barrel")
-					part_to_build = new /obj/item/part/gun/modular/barrel
+					part_to_build = new gun_work_piece.frame.InstalledBarrel.type
 				if("Frame")
-					part_to_build = new /obj/item/part/gun/frame
+					part_to_build = new gun_work_piece.frame.type
 			part_to_build.forceMove(drop_location())
 	mode = FALSE
 

From 04982c490477aa6879487d2243b38d4e745e9b21 Mon Sep 17 00:00:00 2001
From: fallcon <falloutfalconplays@gmail.com>
Date: Wed, 24 Jan 2024 12:53:02 -0600
Subject: [PATCH 15/89] yea

---
 code/modules/guncrafting/frame.dm | 11 ++++-------
 code/modules/projectiles/gun.dm   | 10 +++++++---
 2 files changed, 11 insertions(+), 10 deletions(-)

diff --git a/code/modules/guncrafting/frame.dm b/code/modules/guncrafting/frame.dm
index 1c6de3a7b5b5..9d29078973b9 100644
--- a/code/modules/guncrafting/frame.dm
+++ b/code/modules/guncrafting/frame.dm
@@ -146,7 +146,6 @@
 
 /obj/item/part/gun/frame/attack_self(mob/user)
 	. = ..()
-	var/turf/T = get_turf(src)
 	if(!InstalledGrip)
 		to_chat(user, span_warning("\the [src] does not have a grip!"))
 		return
@@ -156,12 +155,10 @@
 	if(!InstalledBarrel)
 		to_chat(user, span_warning("\the [src] does not have a barrel!"))
 		return
-	var/obj/item/modgun/G = new result(T)
-	if(barrelvars.len > 1 && istype(G, /obj/item/modgun))
-		var/obj/item/modgun/P = G
-		P.caliber = InstalledBarrel.caliber
-		G.gun_parts = list(src.type = 1, InstalledGrip.type = 1, InstalledMechanism.type = 1, InstalledBarrel.type = 1)
-	qdel(src)
+	var/turf/T = get_turf(src)
+	var/obj/item/gun/newGun = new result(T)
+	newGun.frame = src
+	src.forceMove(newGun)
 	return
 
 /obj/item/part/gun/frame/examine(user, distance)
diff --git a/code/modules/projectiles/gun.dm b/code/modules/projectiles/gun.dm
index 8f53f5895835..25e26933a5b0 100644
--- a/code/modules/projectiles/gun.dm
+++ b/code/modules/projectiles/gun.dm
@@ -133,13 +133,17 @@
 	///If the saftey on? If so, we can't fire the weapon
 	var/safety = FALSE
 
-	// Used when deconstructing
+	// Guncrafting
 	var/obj/item/part/gun/frame/frame
+	// 0 means no frame 1-5 are diffrent quality parts
+	var/quality = 3
+
 
 /obj/item/gun/Initialize()
 	. = ..()
-	if(!frame)
-		frame = new(src)
+	if(quality != 0)
+		if(!frame)
+			frame = new(src)
 	RegisterSignal(src, COMSIG_TWOHANDED_WIELD, PROC_REF(on_wield))
 	RegisterSignal(src, COMSIG_TWOHANDED_UNWIELD, PROC_REF(on_unwield))
 	if(pin)

From 08df15fbaa7caaf94c35c353e1ee261cee96a308 Mon Sep 17 00:00:00 2001
From: fallcon <falloutfalconplays@gmail.com>
Date: Wed, 24 Jan 2024 16:17:16 -0600
Subject: [PATCH 16/89] yea

---
 code/modules/guncrafting/frame.dm | 22 ++++++++++++----------
 1 file changed, 12 insertions(+), 10 deletions(-)

diff --git a/code/modules/guncrafting/frame.dm b/code/modules/guncrafting/frame.dm
index 9d29078973b9..d9c0aafd70ec 100644
--- a/code/modules/guncrafting/frame.dm
+++ b/code/modules/guncrafting/frame.dm
@@ -8,12 +8,12 @@
 	// Currently installed grip
 	var/obj/item/part/gun/modular/grip/InstalledGrip
 	// Which grips does the frame accept?
-	var/list/gripvars = list(/obj/item/part/gun/modular/grip/wood, /obj/item/part/gun/modular/grip/black)
+	var/list/validGrips = list(/obj/item/part/gun/modular/grip/wood, /obj/item/part/gun/modular/grip/black)
 
 	// Currently installed mechanism
 	var/obj/item/part/gun/modular/grip/InstalledMechanism
 	// Which mechanism the frame accepts?
-	var/list/mechanismvar = /obj/item/part/gun/modular/mechanism
+	var/list/validMechanism = /obj/item/part/gun/modular/mechanism
 
 	// Currently installed barrel
 	var/obj/item/part/gun/modular/barrel/InstalledBarrel
@@ -32,12 +32,12 @@
 		for(var/part in parts_list)
 			switch(part)
 				if("mechanism")
-					InstalledMechanism = new mechanismvar(src)
+					InstalledMechanism = new validMechanism(src)
 				if("barrel")
 					var/select = pick(barrelvars)
 					InstalledBarrel = new select(src)
 				if("grip")
-					var/select = pick(gripvars)
+					var/select = pick(validGrips)
 					InstalledGrip = new select(src)
 
 /obj/item/part/gun/frame/proc/eject_item(obj/item/I, mob/living/user)
@@ -85,7 +85,7 @@
 			to_chat(user, span_warning("[src] already has a mechanism attached!"))
 			return
 		else
-			handle_mechanismvar(I, user)
+			handle_validMechanism(I, user)
 
 	if(istype(I, /obj/item/part/gun/modular/barrel))
 		if(InstalledBarrel)
@@ -111,10 +111,10 @@
 	return ..()
 
 /obj/item/part/gun/frame/proc/handle_gripvar(obj/item/I, mob/living/user)
-	if(I.type in gripvars)
+	if(I.type in validGrips)
 		if(insert_item(I, user))
 			/*
-			var/variantnum = gripvars.Find(I.type)
+			var/variantnum = validGrips.Find(I.type)
 			result = resultvars[variantnum]
 			*/
 			InstalledGrip = I
@@ -124,8 +124,8 @@
 		to_chat(user, span_warning("This grip does not fit!"))
 		return
 
-/obj/item/part/gun/frame/proc/handle_mechanismvar(obj/item/I, mob/living/user)
-	if(I.type == mechanismvar)
+/obj/item/part/gun/frame/proc/handle_validMechanism(obj/item/I, mob/living/user)
+	if(I.type == validMechanism)
 		if(insert_item(I, user))
 			InstalledMechanism = I
 			to_chat(user, span_notice("You have attached the mechanism to \the [src]."))
@@ -156,7 +156,9 @@
 		to_chat(user, span_warning("\the [src] does not have a barrel!"))
 		return
 	var/turf/T = get_turf(src)
-	var/obj/item/gun/newGun = new result(T)
+	var/obj/item/gun/newGun = result
+	newGun.quality = 0
+	new newGun(T)
 	newGun.frame = src
 	src.forceMove(newGun)
 	return

From 8cc5bfebbb168bccfa312c3a7297550c2fb6715b Mon Sep 17 00:00:00 2001
From: FalloutFalcon <falloutfalconplays@gmail.com>
Date: Wed, 24 Jan 2024 16:41:34 -0600
Subject: [PATCH 17/89] aaa

---
 code/modules/guncrafting/frame.dm | 32 ++++++++++++++-----------------
 code/modules/guncrafting/lathe.dm | 17 ----------------
 2 files changed, 14 insertions(+), 35 deletions(-)

diff --git a/code/modules/guncrafting/frame.dm b/code/modules/guncrafting/frame.dm
index d9c0aafd70ec..e48d011cef19 100644
--- a/code/modules/guncrafting/frame.dm
+++ b/code/modules/guncrafting/frame.dm
@@ -13,15 +13,14 @@
 	// Currently installed mechanism
 	var/obj/item/part/gun/modular/grip/InstalledMechanism
 	// Which mechanism the frame accepts?
-	var/list/validMechanism = /obj/item/part/gun/modular/mechanism
+	var/list/validMechanisms = list(/obj/item/part/gun/modular/mechanism)
 
 	// Currently installed barrel
 	var/obj/item/part/gun/modular/barrel/InstalledBarrel
 	// Which barrels does the frame accept?
-	var/list/barrelvars = list(/obj/item/part/gun/modular/barrel)
+	var/list/validBarrels = list(/obj/item/part/gun/modular/barrel)
 
-	// Bonuses from forging/type or maluses from printing
-	var/cheap = FALSE // Set this to true for cheap variants
+	var/quality = 4
 
 /obj/item/part/gun/frame/New(loc)
 	..()
@@ -32,9 +31,10 @@
 		for(var/part in parts_list)
 			switch(part)
 				if("mechanism")
-					InstalledMechanism = new validMechanism(src)
+					var/select = pick(validMechanisms)
+					InstalledMechanism = new select(src)
 				if("barrel")
-					var/select = pick(barrelvars)
+					var/select = pick(validBarrels)
 					InstalledBarrel = new select(src)
 				if("grip")
 					var/select = pick(validGrips)
@@ -78,21 +78,21 @@
 			to_chat(user, span_warning("[src] already has a grip attached!"))
 			return
 		else
-			handle_gripvar(I, user)
+			handle_grip(I, user)
 
 	if(istype(I, /obj/item/part/gun/modular/mechanism))
 		if(InstalledMechanism)
 			to_chat(user, span_warning("[src] already has a mechanism attached!"))
 			return
 		else
-			handle_validMechanism(I, user)
+			handle_mechanism(I, user)
 
 	if(istype(I, /obj/item/part/gun/modular/barrel))
 		if(InstalledBarrel)
 			to_chat(user, span_warning("[src] already has a barrel attached!"))
 			return
 		else
-			handle_barrelvar(I, user)
+			handle_barrel(I, user)
 
 	if(I.tool_behaviour == TOOL_SCREWDRIVER)
 		var/list/possibles = contents.Copy()
@@ -110,13 +110,9 @@
 
 	return ..()
 
-/obj/item/part/gun/frame/proc/handle_gripvar(obj/item/I, mob/living/user)
+/obj/item/part/gun/frame/proc/handle_grip(obj/item/I, mob/living/user)
 	if(I.type in validGrips)
 		if(insert_item(I, user))
-			/*
-			var/variantnum = validGrips.Find(I.type)
-			result = resultvars[variantnum]
-			*/
 			InstalledGrip = I
 			to_chat(user, span_notice("You have attached the grip to \the [src]."))
 			return
@@ -124,8 +120,8 @@
 		to_chat(user, span_warning("This grip does not fit!"))
 		return
 
-/obj/item/part/gun/frame/proc/handle_validMechanism(obj/item/I, mob/living/user)
-	if(I.type == validMechanism)
+/obj/item/part/gun/frame/proc/handle_mechanism(obj/item/I, mob/living/user)
+	if(I.type == validMechanisms)
 		if(insert_item(I, user))
 			InstalledMechanism = I
 			to_chat(user, span_notice("You have attached the mechanism to \the [src]."))
@@ -134,8 +130,8 @@
 		to_chat(user, span_warning("This mechanism does not fit!"))
 		return
 
-/obj/item/part/gun/frame/proc/handle_barrelvar(obj/item/I, mob/living/user)
-	if(I.type in barrelvars)
+/obj/item/part/gun/frame/proc/handle_barrel(obj/item/I, mob/living/user)
+	if(I.type in validBarrels)
 		if(insert_item(I, user))
 			InstalledBarrel = I
 			to_chat(user, span_notice("You have attached the barrel to \the [src]."))
diff --git a/code/modules/guncrafting/lathe.dm b/code/modules/guncrafting/lathe.dm
index f1e49db7242f..65313f1cdeb9 100644
--- a/code/modules/guncrafting/lathe.dm
+++ b/code/modules/guncrafting/lathe.dm
@@ -157,20 +157,3 @@
 	icon = 'icons/obj/guncrafting.dmi'
 	icon_state = "work_piece"
 	max_amount = 10
-
-/obj/item/modgun
-	name = "gun"
-	desc = "A gun."
-	icon = 'icons/obj/guns/projectile.dmi'
-	icon_state = "detective"
-	item_state = "gun"
-	var/caliber = 357
-	var/gun_parts = list()
-
-/obj/item/blueprint
-	name = "Blueprint"
-	desc = "This could be used to make a gun."
-	icon = 'icons/obj/guncrafting.dmi'
-	icon_state = "blueprint"
-	var/design = FALSE
-	var/blueprint = FALSE

From 5304d07e5e8e2f40b1f3844b654604ccfa386df3 Mon Sep 17 00:00:00 2001
From: FalloutFalcon <falloutfalconplays@gmail.com>
Date: Wed, 24 Jan 2024 19:21:56 -0600
Subject: [PATCH 18/89] wow it just works!!

---
 code/modules/guncrafting/frame.dm | 17 +++++++++--------
 code/modules/guncrafting/part.dm  | 11 ++++++++++-
 code/modules/projectiles/gun.dm   |  4 +++-
 3 files changed, 22 insertions(+), 10 deletions(-)

diff --git a/code/modules/guncrafting/frame.dm b/code/modules/guncrafting/frame.dm
index e48d011cef19..6989e364cc4e 100644
--- a/code/modules/guncrafting/frame.dm
+++ b/code/modules/guncrafting/frame.dm
@@ -1,9 +1,9 @@
 /obj/item/part/gun/frame
 	name = "gun frame"
-	desc = "a generic gun frame. consider debug"
+	desc = "a generic gun frame."
 	icon_state = "frame_olivaw"
 	generic = FALSE
-	var/result = /obj/item/gun
+	var/obj/item/gun/result = /obj/item/gun
 
 	// Currently installed grip
 	var/obj/item/part/gun/modular/grip/InstalledGrip
@@ -20,9 +20,7 @@
 	// Which barrels does the frame accept?
 	var/list/validBarrels = list(/obj/item/part/gun/modular/barrel)
 
-	var/quality = 4
-
-/obj/item/part/gun/frame/New(loc)
+/obj/item/part/gun/frame/Initialize(mapload)
 	..()
 	var/spawn_with_preinstalled_parts = TRUE
 
@@ -152,9 +150,7 @@
 		to_chat(user, span_warning("\the [src] does not have a barrel!"))
 		return
 	var/turf/T = get_turf(src)
-	var/obj/item/gun/newGun = result
-	newGun.quality = 0
-	new newGun(T)
+	var/obj/item/gun/newGun = new result(T, 0)
 	newGun.frame = src
 	src.forceMove(newGun)
 	return
@@ -176,4 +172,9 @@
 			. += "<span class='notice'>\the [src] does not have a barrel installed.</span>"
 
 /obj/item/part/gun/frame/mk1
+	name = "wellmade gun frame"
+	icon_state = "frame_shotgun"
 	result = /obj/item/gun/ballistic/shotgun/winchester/mk1
+	validGrips = list(/obj/item/part/gun/modular/grip/wood)
+	validMechanisms = list(/obj/item/part/gun/modular/mechanism/shotgun)
+	validBarrels = list(/obj/item/part/gun/modular/barrel/shotgun)
diff --git a/code/modules/guncrafting/part.dm b/code/modules/guncrafting/part.dm
index 17a03247668b..785a749c3469 100644
--- a/code/modules/guncrafting/part.dm
+++ b/code/modules/guncrafting/part.dm
@@ -34,8 +34,17 @@
 	desc = "All the bits that makes the bullet go bang."
 	icon_state = "mechanism_pistol"
 
+/obj/item/part/gun/modular/mechanism/shotgun
+	name = "generic shotgun mechanism"
+	desc = "All the bits that makes the bullet go bang."
+	icon_state = "mechanism_shotgun"
+
 /obj/item/part/gun/modular/barrel
 	name = "generic barrel"
 	desc = "A gun barrel, which keeps the bullet going in the right direction."
 	icon_state = "barrel_35"
-	var/caliber = 357
+
+/obj/item/part/gun/modular/barrel/shotgun
+	name = "generic shotgun barrel"
+	desc = "A gun barrel, which keeps the bullet going in the right direction."
+	icon_state = "barrel_30"
diff --git a/code/modules/projectiles/gun.dm b/code/modules/projectiles/gun.dm
index 25e26933a5b0..56af3894f2f6 100644
--- a/code/modules/projectiles/gun.dm
+++ b/code/modules/projectiles/gun.dm
@@ -139,8 +139,10 @@
 	var/quality = 3
 
 
-/obj/item/gun/Initialize()
+/obj/item/gun/Initialize(mapload, proviedQuality)
 	. = ..()
+	if(proviedQuality)
+		quality = proviedQuality
 	if(quality != 0)
 		if(!frame)
 			frame = new(src)

From 182551f82cee3cf21d6b3df477f0bd93f3ddd856 Mon Sep 17 00:00:00 2001
From: fallcon <falloutfalconplays@gmail.com>
Date: Thu, 25 Jan 2024 10:39:42 -0600
Subject: [PATCH 19/89] bitflags soon

---
 code/__DEFINES/gun_crafting.dm     |  4 ++++
 code/modules/guncrafting/frame.dm  |  2 ++
 code/modules/guncrafting/part.dm   | 13 +++++++++----
 code/modules/guncrafting/recipe.dm | 18 ++++++++++++++++++
 shiptest.dme                       |  2 ++
 5 files changed, 35 insertions(+), 4 deletions(-)
 create mode 100644 code/__DEFINES/gun_crafting.dm
 create mode 100644 code/modules/guncrafting/recipe.dm

diff --git a/code/__DEFINES/gun_crafting.dm b/code/__DEFINES/gun_crafting.dm
new file mode 100644
index 000000000000..a0257209d6f9
--- /dev/null
+++ b/code/__DEFINES/gun_crafting.dm
@@ -0,0 +1,4 @@
+#define GUN_PART_FRAME (1<<0)
+#define GUN_PART_BARREL (1<<1)
+#define GUN_PART_MECHANISM (1<<2)
+#define GUN_PART_GRIP (1<<3)
diff --git a/code/modules/guncrafting/frame.dm b/code/modules/guncrafting/frame.dm
index 6989e364cc4e..46f8496d75d9 100644
--- a/code/modules/guncrafting/frame.dm
+++ b/code/modules/guncrafting/frame.dm
@@ -19,6 +19,8 @@
 	var/obj/item/part/gun/modular/barrel/InstalledBarrel
 	// Which barrels does the frame accept?
 	var/list/validBarrels = list(/obj/item/part/gun/modular/barrel)
+	
+	gun_part_type = FRAME
 
 /obj/item/part/gun/frame/Initialize(mapload)
 	..()
diff --git a/code/modules/guncrafting/part.dm b/code/modules/guncrafting/part.dm
index 785a749c3469..a037697a41f0 100644
--- a/code/modules/guncrafting/part.dm
+++ b/code/modules/guncrafting/part.dm
@@ -5,7 +5,7 @@
 	name = "gun part"
 	desc = "Spare part of gun."
 	icon_state = "gun_part_1"
-	var/generic = TRUE
+	var/gun_part_type = NONE
 
 /obj/item/part/gun/Initialize()
 	. = ..()
@@ -15,9 +15,12 @@
 /obj/item/part/gun/modular
 	name = "modular gun part"
 	desc = "You dont think this should exist."
-	generic = FALSE
-	var/list/attached_mods = list()
-	var/list/legal_mods = list()
+
+/obj/item/part/gun/modular/grip
+	name = "generic grip"
+	desc = "A firearm grip, unattached from a firearm."
+	icon_state = "grip_wood"
+	gun_part_type = GRIP
 
 /obj/item/part/gun/modular/grip/wood
 	name = "wood grip"
@@ -33,6 +36,7 @@
 	name = "generic mechanism"
 	desc = "All the bits that makes the bullet go bang."
 	icon_state = "mechanism_pistol"
+	gun_part_type = MECHANISM
 
 /obj/item/part/gun/modular/mechanism/shotgun
 	name = "generic shotgun mechanism"
@@ -43,6 +47,7 @@
 	name = "generic barrel"
 	desc = "A gun barrel, which keeps the bullet going in the right direction."
 	icon_state = "barrel_35"
+	gun_part_type = BARREL
 
 /obj/item/part/gun/modular/barrel/shotgun
 	name = "generic shotgun barrel"
diff --git a/code/modules/guncrafting/recipe.dm b/code/modules/guncrafting/recipe.dm
new file mode 100644
index 000000000000..7e4807361a14
--- /dev/null
+++ b/code/modules/guncrafting/recipe.dm
@@ -0,0 +1,18 @@
+/datum/lathe_recipe
+	var/obj/item/result = /obj/item/gun
+
+/datum/lathe_recipe/gun
+	var/list/validParts = list()
+	var/requiredPartTypes = ALL
+
+/datum/lathe_recipe/gun/winchester
+	result = /obj/item/gun/ballistic/shotgun/winchester
+	var/list/validParts = list(
+		/obj/item/part/gun/frame/mk1,
+		/obj/item/part/gun/modular/grip/wood,
+		/obj/item/part/gun/modular/mechanism/shotgun,
+		/obj/item/part/gun/modular/barrel/shotgun
+		)
+
+
+
diff --git a/shiptest.dme b/shiptest.dme
index 15600e073602..ed720cc109a9 100644
--- a/shiptest.dme
+++ b/shiptest.dme
@@ -65,6 +65,7 @@
 #include "code\__DEFINES\food.dm"
 #include "code\__DEFINES\footsteps.dm"
 #include "code\__DEFINES\forensics.dm"
+#include "code\__DEFINES\gun_crafting.dm"
 #include "code\__DEFINES\hud.dm"
 #include "code\__DEFINES\icon_smoothing.dm"
 #include "code\__DEFINES\important_recursive_contents.dm"
@@ -2164,6 +2165,7 @@
 #include "code\modules\guncrafting\frame.dm"
 #include "code\modules\guncrafting\lathe.dm"
 #include "code\modules\guncrafting\part.dm"
+#include code\modules\guncrafting\recipe.dm
 #include "code\modules\holiday\easter.dm"
 #include "code\modules\holiday\foreign_calendar.dm"
 #include "code\modules\holiday\holidays.dm"

From ad28497971e07ec9412451208b2addd579a6592e Mon Sep 17 00:00:00 2001
From: FalloutFalcon <falloutfalconplays@gmail.com>
Date: Thu, 25 Jan 2024 20:57:20 -0600
Subject: [PATCH 20/89] ye

---
 code/modules/guncrafting/frame.dm | 9 +++++++--
 code/modules/guncrafting/lathe.dm | 2 +-
 2 files changed, 8 insertions(+), 3 deletions(-)

diff --git a/code/modules/guncrafting/frame.dm b/code/modules/guncrafting/frame.dm
index 46f8496d75d9..ae6c1e29f9e6 100644
--- a/code/modules/guncrafting/frame.dm
+++ b/code/modules/guncrafting/frame.dm
@@ -19,13 +19,18 @@
 	var/obj/item/part/gun/modular/barrel/InstalledBarrel
 	// Which barrels does the frame accept?
 	var/list/validBarrels = list(/obj/item/part/gun/modular/barrel)
-	
+
 	gun_part_type = FRAME
 
 /obj/item/part/gun/frame/Initialize(mapload)
 	..()
 	var/spawn_with_preinstalled_parts = TRUE
 
+/obj/item/part/gun/frame/Initialize(mapload, dont_spawn_with_parts)
+	..()
+	if(dont_spawn_with_parts)
+		spawn_with_preinstalled_parts = FALSE
+
 	if(spawn_with_preinstalled_parts)
 		var/list/parts_list = list("mechanism", "barrel", "grip")
 		for(var/part in parts_list)
@@ -121,7 +126,7 @@
 		return
 
 /obj/item/part/gun/frame/proc/handle_mechanism(obj/item/I, mob/living/user)
-	if(I.type == validMechanisms)
+	if(I.type in validMechanisms)
 		if(insert_item(I, user))
 			InstalledMechanism = I
 			to_chat(user, span_notice("You have attached the mechanism to \the [src]."))
diff --git a/code/modules/guncrafting/lathe.dm b/code/modules/guncrafting/lathe.dm
index 65313f1cdeb9..8b3810ab6120 100644
--- a/code/modules/guncrafting/lathe.dm
+++ b/code/modules/guncrafting/lathe.dm
@@ -143,7 +143,7 @@
 				if("Barrel")
 					part_to_build = new gun_work_piece.frame.InstalledBarrel.type
 				if("Frame")
-					part_to_build = new gun_work_piece.frame.type
+					part_to_build = new gun_work_piece.frame.type(src, TRUE)
 			part_to_build.forceMove(drop_location())
 	mode = FALSE
 

From 8a870e01ef8cb57314f186c0a316d94214f4541d Mon Sep 17 00:00:00 2001
From: FalloutFalcon <falloutfalconplays@gmail.com>
Date: Thu, 25 Jan 2024 21:41:03 -0600
Subject: [PATCH 21/89] yea

---
 code/modules/guncrafting/frame.dm  |  8 ++------
 code/modules/guncrafting/part.dm   | 11 +++--------
 code/modules/guncrafting/recipe.dm | 11 ++++++++++-
 shiptest.dme                       |  2 +-
 4 files changed, 16 insertions(+), 16 deletions(-)

diff --git a/code/modules/guncrafting/frame.dm b/code/modules/guncrafting/frame.dm
index ae6c1e29f9e6..06589ce61f98 100644
--- a/code/modules/guncrafting/frame.dm
+++ b/code/modules/guncrafting/frame.dm
@@ -2,7 +2,6 @@
 	name = "gun frame"
 	desc = "a generic gun frame."
 	icon_state = "frame_olivaw"
-	generic = FALSE
 	var/obj/item/gun/result = /obj/item/gun
 
 	// Currently installed grip
@@ -20,14 +19,11 @@
 	// Which barrels does the frame accept?
 	var/list/validBarrels = list(/obj/item/part/gun/modular/barrel)
 
-	gun_part_type = FRAME
-
-/obj/item/part/gun/frame/Initialize(mapload)
-	..()
-	var/spawn_with_preinstalled_parts = TRUE
+	gun_part_type = GUN_PART_FRAME
 
 /obj/item/part/gun/frame/Initialize(mapload, dont_spawn_with_parts)
 	..()
+	var/spawn_with_preinstalled_parts = TRUE
 	if(dont_spawn_with_parts)
 		spawn_with_preinstalled_parts = FALSE
 
diff --git a/code/modules/guncrafting/part.dm b/code/modules/guncrafting/part.dm
index a037697a41f0..3c95f5a6390b 100644
--- a/code/modules/guncrafting/part.dm
+++ b/code/modules/guncrafting/part.dm
@@ -7,11 +7,6 @@
 	icon_state = "gun_part_1"
 	var/gun_part_type = NONE
 
-/obj/item/part/gun/Initialize()
-	. = ..()
-	if(generic)
-		icon_state = "gun_part_[rand(1,6)]"
-
 /obj/item/part/gun/modular
 	name = "modular gun part"
 	desc = "You dont think this should exist."
@@ -20,7 +15,7 @@
 	name = "generic grip"
 	desc = "A firearm grip, unattached from a firearm."
 	icon_state = "grip_wood"
-	gun_part_type = GRIP
+	gun_part_type = GUN_PART_GRIP
 
 /obj/item/part/gun/modular/grip/wood
 	name = "wood grip"
@@ -36,7 +31,7 @@
 	name = "generic mechanism"
 	desc = "All the bits that makes the bullet go bang."
 	icon_state = "mechanism_pistol"
-	gun_part_type = MECHANISM
+	gun_part_type = GUN_PART_MECHANISM
 
 /obj/item/part/gun/modular/mechanism/shotgun
 	name = "generic shotgun mechanism"
@@ -47,7 +42,7 @@
 	name = "generic barrel"
 	desc = "A gun barrel, which keeps the bullet going in the right direction."
 	icon_state = "barrel_35"
-	gun_part_type = BARREL
+	gun_part_type = GUN_PART_BARREL
 
 /obj/item/part/gun/modular/barrel/shotgun
 	name = "generic shotgun barrel"
diff --git a/code/modules/guncrafting/recipe.dm b/code/modules/guncrafting/recipe.dm
index 7e4807361a14..f9b2f90da651 100644
--- a/code/modules/guncrafting/recipe.dm
+++ b/code/modules/guncrafting/recipe.dm
@@ -7,7 +7,16 @@
 
 /datum/lathe_recipe/gun/winchester
 	result = /obj/item/gun/ballistic/shotgun/winchester
-	var/list/validParts = list(
+	validParts = list(
+		/obj/item/part/gun/frame/mk1,
+		/obj/item/part/gun/modular/grip/wood,
+		/obj/item/part/gun/modular/mechanism/shotgun,
+		/obj/item/part/gun/modular/barrel/shotgun
+		)
+
+/datum/lathe_recipe/gun/winchester
+	result = /obj/item/gun/ballistic/shotgun/winchester
+	validParts = list(
 		/obj/item/part/gun/frame/mk1,
 		/obj/item/part/gun/modular/grip/wood,
 		/obj/item/part/gun/modular/mechanism/shotgun,
diff --git a/shiptest.dme b/shiptest.dme
index ed720cc109a9..6c743328d115 100644
--- a/shiptest.dme
+++ b/shiptest.dme
@@ -2165,7 +2165,7 @@
 #include "code\modules\guncrafting\frame.dm"
 #include "code\modules\guncrafting\lathe.dm"
 #include "code\modules\guncrafting\part.dm"
-#include code\modules\guncrafting\recipe.dm
+#include "code\modules\guncrafting\recipe.dm"
 #include "code\modules\holiday\easter.dm"
 #include "code\modules\holiday\foreign_calendar.dm"
 #include "code\modules\holiday\holidays.dm"

From a5dc31707feb67ff82fdcc64c7d37a09b757dbd8 Mon Sep 17 00:00:00 2001
From: fallcon <falloutfalconplays@gmail.com>
Date: Tue, 30 Jan 2024 18:25:49 -0600
Subject: [PATCH 22/89] commit to recipes

---
 code/modules/guncrafting/frame.dm  | 35 ++++++++++++++++++++++++++----
 code/modules/guncrafting/recipe.dm | 23 ++++++++++++++++----
 2 files changed, 50 insertions(+), 8 deletions(-)

diff --git a/code/modules/guncrafting/frame.dm b/code/modules/guncrafting/frame.dm
index 06589ce61f98..1efce108fea0 100644
--- a/code/modules/guncrafting/frame.dm
+++ b/code/modules/guncrafting/frame.dm
@@ -23,6 +23,7 @@
 
 /obj/item/part/gun/frame/Initialize(mapload, dont_spawn_with_parts)
 	..()
+	/*
 	var/spawn_with_preinstalled_parts = TRUE
 	if(dont_spawn_with_parts)
 		spawn_with_preinstalled_parts = FALSE
@@ -40,6 +41,7 @@
 				if("grip")
 					var/select = pick(validGrips)
 					InstalledGrip = new select(src)
+	*/
 
 /obj/item/part/gun/frame/proc/eject_item(obj/item/I, mob/living/user)
 	if(!I || !user.IsAdvancedToolUser() || user.stat || !user.Adjacent(I))
@@ -102,15 +104,17 @@
 			return
 		if(I.use_tool(src, user, 40, volume=50))
 			eject_item(toremove, user)
+			/*
 			if(istype(toremove, /obj/item/part/gun/modular/grip))
 				InstalledGrip = null
 			else if(istype(toremove, /obj/item/part/gun/modular/barrel))
 				InstalledBarrel = FALSE
 			else if(istype(toremove, /obj/item/part/gun/modular/mechanism))
 				InstalledMechanism = FALSE
+			*/
 
 	return ..()
-
+/*
 /obj/item/part/gun/frame/proc/handle_grip(obj/item/I, mob/living/user)
 	if(I.type in validGrips)
 		if(insert_item(I, user))
@@ -140,9 +144,21 @@
 	else
 		to_chat(user, span_warning("This barrel does not fit!"))
 		return
+*/
+
+/obj/item/part/gun/frame/proc/handle_part(obj/item/I, mob/living/user)
+	/obj/item/part/gun/frame/proc/handle_part(obj/item/I, mob/living/user)
+	if(I.type in /datum/lathe_recipe/gun/m1911/validParts)
+		if(insert_item(I, user))
+			to_chat(user, span_notice("You have attached the part to \the [src]."))
+			return
+	else
+		to_chat(user, span_warning("This part does not fit!"))
+		return
 
 /obj/item/part/gun/frame/attack_self(mob/user)
 	. = ..()
+	/*
 	if(!InstalledGrip)
 		to_chat(user, span_warning("\the [src] does not have a grip!"))
 		return
@@ -152,6 +168,8 @@
 	if(!InstalledBarrel)
 		to_chat(user, span_warning("\the [src] does not have a barrel!"))
 		return
+	*/
+	for each(I in )
 	var/turf/T = get_turf(src)
 	var/obj/item/gun/newGun = new result(T, 0)
 	newGun.frame = src
@@ -174,10 +192,19 @@
 		else
 			. += "<span class='notice'>\the [src] does not have a barrel installed.</span>"
 
-/obj/item/part/gun/frame/mk1
-	name = "wellmade gun frame"
+/obj/item/part/gun/frame/winchester
+	name = "Winchester Gun Frame
 	icon_state = "frame_shotgun"
-	result = /obj/item/gun/ballistic/shotgun/winchester/mk1
+	result = /obj/item/gun/ballistic/shotgun/winchester
 	validGrips = list(/obj/item/part/gun/modular/grip/wood)
 	validMechanisms = list(/obj/item/part/gun/modular/mechanism/shotgun)
 	validBarrels = list(/obj/item/part/gun/modular/barrel/shotgun)
+
+/obj/item/part/gun/frame/winchester/mk1
+	result = /obj/item/gun/ballistic/shotgun/winchester/mk1
+
+/obj/item/part/gun/frame/m1911
+	result = /obj/item/gun/ballistic/automatic/pistol/m1911
+
+/obj/item/part/gun/frame/commander
+	result = /obj/item/gun/ballistic/automatic/pistol/commander
diff --git a/code/modules/guncrafting/recipe.dm b/code/modules/guncrafting/recipe.dm
index f9b2f90da651..616a19f982b4 100644
--- a/code/modules/guncrafting/recipe.dm
+++ b/code/modules/guncrafting/recipe.dm
@@ -8,20 +8,35 @@
 /datum/lathe_recipe/gun/winchester
 	result = /obj/item/gun/ballistic/shotgun/winchester
 	validParts = list(
-		/obj/item/part/gun/frame/mk1,
+		/obj/item/part/gun/frame/winchester,
 		/obj/item/part/gun/modular/grip/wood,
 		/obj/item/part/gun/modular/mechanism/shotgun,
 		/obj/item/part/gun/modular/barrel/shotgun
 		)
 
 /datum/lathe_recipe/gun/winchester
-	result = /obj/item/gun/ballistic/shotgun/winchester
+	result = /obj/item/gun/ballistic/shotgun/winchester/mk1
 	validParts = list(
-		/obj/item/part/gun/frame/mk1,
+		/obj/item/part/gun/frame/winchester/mk1,
 		/obj/item/part/gun/modular/grip/wood,
 		/obj/item/part/gun/modular/mechanism/shotgun,
 		/obj/item/part/gun/modular/barrel/shotgun
 		)
 
+/datum/lathe_recipe/gun/m1911
+	result = /obj/item/gun/ballistic/automatic/pistol/m1911
+	validParts = list(
+		/obj/item/part/gun/frame/m1911,
+		/obj/item/part/gun/modular/grip/wood,
+		/obj/item/part/gun/modular/mechanism/pistol,
+		/obj/item/part/gun/modular/barrel/pistolm1911
+		)
 
-
+/datum/lathe_recipe/gun/tec9
+	result = /obj/item/gun/ballistic/automatic/pistol/tec9
+	validParts = list(
+		/obj/item/part/gun/frame/tec9,
+		/obj/item/part/gun/modular/grip/plastic,
+		/obj/item/part/gun/modular/mechanism/pistol,
+		/obj/item/part/gun/modular/barrel/pistol
+		)

From 98b5d805e65ce6d89fbac1eab3e2f81c3a5a0da5 Mon Sep 17 00:00:00 2001
From: FalloutFalcon <falloutfalconplays@gmail.com>
Date: Tue, 30 Jan 2024 20:23:35 -0600
Subject: [PATCH 23/89] yea

---
 code/modules/guncrafting/frame.dm  | 49 +++++++++++++++++-------------
 code/modules/guncrafting/lathe.dm  |  2 ++
 code/modules/guncrafting/recipe.dm | 14 +++++----
 code/modules/guncrafting/tools.dm  | 27 ++++++++++++++++
 code/modules/projectiles/gun.dm    |  1 +
 5 files changed, 66 insertions(+), 27 deletions(-)
 create mode 100644 code/modules/guncrafting/tools.dm

diff --git a/code/modules/guncrafting/frame.dm b/code/modules/guncrafting/frame.dm
index 1efce108fea0..e4b95cc1c009 100644
--- a/code/modules/guncrafting/frame.dm
+++ b/code/modules/guncrafting/frame.dm
@@ -2,22 +2,23 @@
 	name = "gun frame"
 	desc = "a generic gun frame."
 	icon_state = "frame_olivaw"
-	var/obj/item/gun/result = /obj/item/gun
+	//var/obj/item/gun/result = /obj/item/gun
+	var/list/installedParts = list()
 
 	// Currently installed grip
-	var/obj/item/part/gun/modular/grip/InstalledGrip
+	//var/obj/item/part/gun/modular/grip/InstalledGrip
 	// Which grips does the frame accept?
-	var/list/validGrips = list(/obj/item/part/gun/modular/grip/wood, /obj/item/part/gun/modular/grip/black)
+	//var/list/validGrips = list(/obj/item/part/gun/modular/grip/wood, /obj/item/part/gun/modular/grip/black)
 
 	// Currently installed mechanism
-	var/obj/item/part/gun/modular/grip/InstalledMechanism
+	//var/obj/item/part/gun/modular/grip/InstalledMechanism
 	// Which mechanism the frame accepts?
-	var/list/validMechanisms = list(/obj/item/part/gun/modular/mechanism)
+	//var/list/validMechanisms = list(/obj/item/part/gun/modular/mechanism)
 
 	// Currently installed barrel
-	var/obj/item/part/gun/modular/barrel/InstalledBarrel
+	//var/obj/item/part/gun/modular/barrel/InstalledBarrel
 	// Which barrels does the frame accept?
-	var/list/validBarrels = list(/obj/item/part/gun/modular/barrel)
+	//var/list/validBarrels = list(/obj/item/part/gun/modular/barrel)
 
 	gun_part_type = GUN_PART_FRAME
 
@@ -76,6 +77,7 @@
 	return TRUE
 
 /obj/item/part/gun/frame/attackby(obj/item/I, mob/living/user, params)
+	/*
 	if(istype(I, /obj/item/part/gun/modular/grip))
 		if(InstalledGrip)
 			to_chat(user, span_warning("[src] already has a grip attached!"))
@@ -96,6 +98,7 @@
 			return
 		else
 			handle_barrel(I, user)
+		*/
 
 	if(I.tool_behaviour == TOOL_SCREWDRIVER)
 		var/list/possibles = contents.Copy()
@@ -147,15 +150,14 @@
 */
 
 /obj/item/part/gun/frame/proc/handle_part(obj/item/I, mob/living/user)
-	/obj/item/part/gun/frame/proc/handle_part(obj/item/I, mob/living/user)
-	if(I.type in /datum/lathe_recipe/gun/m1911/validParts)
-		if(insert_item(I, user))
-			to_chat(user, span_notice("You have attached the part to \the [src]."))
-			return
+	//if(I.type in /datum/lathe_recipe/gun/m1911.validParts)
+	if(insert_item(I, user))
+		to_chat(user, span_notice("You have attached the part to \the [src]."))
+		return
 	else
 		to_chat(user, span_warning("This part does not fit!"))
 		return
-
+/*
 /obj/item/part/gun/frame/attack_self(mob/user)
 	. = ..()
 	/*
@@ -175,7 +177,9 @@
 	newGun.frame = src
 	src.forceMove(newGun)
 	return
+*/
 
+/*
 /obj/item/part/gun/frame/examine(user, distance)
 	. = ..()
 	if(.)
@@ -191,20 +195,23 @@
 			. += "<span class='notice'>\the [src] has \a [InstalledBarrel] installed.</span>"
 		else
 			. += "<span class='notice'>\the [src] does not have a barrel installed.</span>"
+*/
 
 /obj/item/part/gun/frame/winchester
-	name = "Winchester Gun Frame
+	name = "Winchester Gun Frame"
 	icon_state = "frame_shotgun"
-	result = /obj/item/gun/ballistic/shotgun/winchester
-	validGrips = list(/obj/item/part/gun/modular/grip/wood)
-	validMechanisms = list(/obj/item/part/gun/modular/mechanism/shotgun)
-	validBarrels = list(/obj/item/part/gun/modular/barrel/shotgun)
+	//result = /obj/item/gun/ballistic/shotgun/winchester
+	//validGrips = list(/obj/item/part/gun/modular/grip/wood)
+	//validMechanisms = list(/obj/item/part/gun/modular/mechanism/shotgun)
+	//validBarrels = list(/obj/item/part/gun/modular/barrel/shotgun)
 
 /obj/item/part/gun/frame/winchester/mk1
-	result = /obj/item/gun/ballistic/shotgun/winchester/mk1
+	//result = /obj/item/gun/ballistic/shotgun/winchester/mk1
 
 /obj/item/part/gun/frame/m1911
-	result = /obj/item/gun/ballistic/automatic/pistol/m1911
+	//result = /obj/item/gun/ballistic/automatic/pistol/m1911
 
 /obj/item/part/gun/frame/commander
-	result = /obj/item/gun/ballistic/automatic/pistol/commander
+	//result = /obj/item/gun/ballistic/automatic/pistol/commander
+
+/obj/item/part/gun/frame/boltaction
diff --git a/code/modules/guncrafting/lathe.dm b/code/modules/guncrafting/lathe.dm
index 8b3810ab6120..f3a6445931a1 100644
--- a/code/modules/guncrafting/lathe.dm
+++ b/code/modules/guncrafting/lathe.dm
@@ -121,6 +121,7 @@
 ///////////////
 
 /obj/structure/lathe/proc/fabricate_part(mob/living/carbon/human/user)
+	/*
 	if(istype (work_piece, /obj/item/gun))
 		var/obj/item/gun/gun_work_piece = work_piece
 		var/list/choose_options = list()
@@ -145,6 +146,7 @@
 				if("Frame")
 					part_to_build = new gun_work_piece.frame.type(src, TRUE)
 			part_to_build.forceMove(drop_location())
+	*/
 	mode = FALSE
 
 ///////////
diff --git a/code/modules/guncrafting/recipe.dm b/code/modules/guncrafting/recipe.dm
index 616a19f982b4..b0cc8f5afd0d 100644
--- a/code/modules/guncrafting/recipe.dm
+++ b/code/modules/guncrafting/recipe.dm
@@ -28,15 +28,17 @@
 	validParts = list(
 		/obj/item/part/gun/frame/m1911,
 		/obj/item/part/gun/modular/grip/wood,
-		/obj/item/part/gun/modular/mechanism/pistol,
-		/obj/item/part/gun/modular/barrel/pistolm1911
+		/obj/item/part/gun/modular/mechanism,
+		/obj/item/part/gun/modular/barrel
 		)
 
 /datum/lathe_recipe/gun/tec9
 	result = /obj/item/gun/ballistic/automatic/pistol/tec9
 	validParts = list(
-		/obj/item/part/gun/frame/tec9,
-		/obj/item/part/gun/modular/grip/plastic,
-		/obj/item/part/gun/modular/mechanism/pistol,
-		/obj/item/part/gun/modular/barrel/pistol
+		/obj/item/part/gun/frame,
+		/obj/item/part/gun/modular/grip,
+		/obj/item/part/gun/modular/mechanism,
+		/obj/item/part/gun/modular/barrel
 		)
+/datum/lathe_recipe/gun/boltaction
+	result	= /obj/item/gun/ballistic/rifle/boltaction
diff --git a/code/modules/guncrafting/tools.dm b/code/modules/guncrafting/tools.dm
new file mode 100644
index 000000000000..f17ddb9f0cea
--- /dev/null
+++ b/code/modules/guncrafting/tools.dm
@@ -0,0 +1,27 @@
+/obj/item/tool/hammer
+	name = "hammer"
+
+/obj/item/tool/file
+	name = "file"
+
+/obj/item/tool/saw
+	name = "saw"
+
+/obj/item/storage/box/parts
+	name = "gunmakers box"
+	desc = "A set of tools and parts to assemble your first weapon"
+
+/obj/item/storage/box/parts/PopulateContents()
+	new /obj/item/tool/hammer(src)
+	new /obj/item/tool/file(src)
+	new /obj/item/tool/saw(src)
+	/*
+	new /obj/item/part/gun/frame/winchester(src)
+	new /obj/item/part/gun/modular/grip/wood(src)
+	new /obj/item/part/gun/modular/mechanism/shotgun(src)
+	new /obj/item/part/gun/modular/barrel/shotgun(src)
+	new /obj/item/part/gun/frame/winchester(src)
+	new /obj/item/part/gun/modular/grip/wood(src)
+	new /obj/item/part/gun/modular/mechanism/shotgun(src)
+	new /obj/item/part/gun/modular/barrel/shotgun(src)
+	*/
diff --git a/code/modules/projectiles/gun.dm b/code/modules/projectiles/gun.dm
index 56af3894f2f6..2a053adb3098 100644
--- a/code/modules/projectiles/gun.dm
+++ b/code/modules/projectiles/gun.dm
@@ -3,6 +3,7 @@
 #define FIRING_PIN_REMOVAL_DELAY 50
 
 #define MANUFACTURER_NONE null
+#define MANUFACTURER_KYBER "the simple, handmade marking of an unknown gunsmith"
 #define MANUFACTURER_SHARPLITE "the Sharplite Defense logo"
 #define MANUFACTURER_SHARPLITE_NEW "the Nanotrasen-Sharplite logo"
 #define MANUFACTURER_HUNTERSPRIDE "the Hunter's Pride Arms and Ammunition logo"

From 8c1b7c500ecb6b1dfdfe95119591e2cc7621c309 Mon Sep 17 00:00:00 2001
From: FalloutFalcon <falloutfalconplays@gmail.com>
Date: Wed, 31 Jan 2024 09:41:22 -0600
Subject: [PATCH 24/89] Refactor gun crafting module and add new tools

---
 code/modules/guncrafting/frame.dm | 9 ++++++---
 code/modules/guncrafting/tools.dm | 8 ++++++--
 shiptest.dme                      | 1 +
 3 files changed, 13 insertions(+), 5 deletions(-)

diff --git a/code/modules/guncrafting/frame.dm b/code/modules/guncrafting/frame.dm
index e4b95cc1c009..60b877f8cf89 100644
--- a/code/modules/guncrafting/frame.dm
+++ b/code/modules/guncrafting/frame.dm
@@ -150,16 +150,19 @@
 */
 
 /obj/item/part/gun/frame/proc/handle_part(obj/item/I, mob/living/user)
-	//if(I.type in /datum/lathe_recipe/gun/m1911.validParts)
 	if(insert_item(I, user))
 		to_chat(user, span_notice("You have attached the part to \the [src]."))
 		return
 	else
 		to_chat(user, span_warning("This part does not fit!"))
 		return
-/*
+
 /obj/item/part/gun/frame/attack_self(mob/user)
 	. = ..()
+	for(var/datum/lathe_recipe/gun/recipe in /datum/lathe_recipe/gun)
+		if(src.type in recipe.validParts)
+			if(I.type in recipe.validParts)
+				handle_part(I, user)
 	/*
 	if(!InstalledGrip)
 		to_chat(user, span_warning("\the [src] does not have a grip!"))
@@ -171,7 +174,7 @@
 		to_chat(user, span_warning("\the [src] does not have a barrel!"))
 		return
 	*/
-	for each(I in )
+/*
 	var/turf/T = get_turf(src)
 	var/obj/item/gun/newGun = new result(T, 0)
 	newGun.frame = src
diff --git a/code/modules/guncrafting/tools.dm b/code/modules/guncrafting/tools.dm
index f17ddb9f0cea..1a6805ce5234 100644
--- a/code/modules/guncrafting/tools.dm
+++ b/code/modules/guncrafting/tools.dm
@@ -1,11 +1,17 @@
 /obj/item/tool/hammer
 	name = "hammer"
+	icon = 'icons/obj/tools.dmi'
+	icon_state = "oldcrowbar"
 
 /obj/item/tool/file
 	name = "file"
+	icon = 'icons/obj/tools.dmi'
+	icon_state = "oldwrench"
 
 /obj/item/tool/saw
 	name = "saw"
+	icon = 'icons/obj/tools.dmi'
+	icon_state = "oldcutters_map"
 
 /obj/item/storage/box/parts
 	name = "gunmakers box"
@@ -15,7 +21,6 @@
 	new /obj/item/tool/hammer(src)
 	new /obj/item/tool/file(src)
 	new /obj/item/tool/saw(src)
-	/*
 	new /obj/item/part/gun/frame/winchester(src)
 	new /obj/item/part/gun/modular/grip/wood(src)
 	new /obj/item/part/gun/modular/mechanism/shotgun(src)
@@ -24,4 +29,3 @@
 	new /obj/item/part/gun/modular/grip/wood(src)
 	new /obj/item/part/gun/modular/mechanism/shotgun(src)
 	new /obj/item/part/gun/modular/barrel/shotgun(src)
-	*/
diff --git a/shiptest.dme b/shiptest.dme
index 6c743328d115..73cd4f734c28 100644
--- a/shiptest.dme
+++ b/shiptest.dme
@@ -2166,6 +2166,7 @@
 #include "code\modules\guncrafting\lathe.dm"
 #include "code\modules\guncrafting\part.dm"
 #include "code\modules\guncrafting\recipe.dm"
+#include "code\modules\guncrafting\tools.dm"
 #include "code\modules\holiday\easter.dm"
 #include "code\modules\holiday\foreign_calendar.dm"
 #include "code\modules\holiday\holidays.dm"

From 2959730798568b46f17a76f22df51e8936ffb867 Mon Sep 17 00:00:00 2001
From: fallcon <falloutfalconplays@gmail.com>
Date: Wed, 31 Jan 2024 10:13:51 -0600
Subject: [PATCH 25/89] poorly optimized holy dang

---
 code/modules/guncrafting/frame.dm | 32 ++++++++++++++++++++++++++-----
 1 file changed, 27 insertions(+), 5 deletions(-)

diff --git a/code/modules/guncrafting/frame.dm b/code/modules/guncrafting/frame.dm
index 60b877f8cf89..93161ebea3a9 100644
--- a/code/modules/guncrafting/frame.dm
+++ b/code/modules/guncrafting/frame.dm
@@ -149,17 +149,32 @@
 		return
 */
 
-/obj/item/part/gun/frame/proc/handle_part(obj/item/I, mob/living/user)
-	if(insert_item(I, user))
-		to_chat(user, span_notice("You have attached the part to \the [src]."))
-		return
+/obj/item/part/gun/frame/proc/handle_part(obj/item/part/gun/I, mob/living/user)
+	if(I.gun_part_type && !(I.gun_part_type & get_part_types()))
+		if(insert_item(I, user))
+			to_chat(user, span_notice("You have attached the part to \the [src]."))
+			return
 	else
 		to_chat(user, span_warning("This part does not fit!"))
 		return
 
+//Finds all recipes that match the current parts
+/obj/item/part/gun/frame/proc/get_current_recipes()
+	var/list/gun_recipes = subtypesof(/datum/lathe_recipe/gun)
+	var/list/filtered_recipes = list()
+
+	for(var/datum/lathe_recipe/gun/recipe in gun_recipes)
+		if(istype(src.type))
+			filtered_recipes += recipe_type
+		for(var/obj/item/part/gun/installed_part in installedParts)
+			if(istype(part, installed_part))
+				filtered_recipes += recipe_type
+
+	return filtered_recipes
+
 /obj/item/part/gun/frame/attack_self(mob/user)
 	. = ..()
-	for(var/datum/lathe_recipe/gun/recipe in /datum/lathe_recipe/gun)
+	for(var/datum/lathe_recipe/gun/recipe in get_current_recipes())
 		if(src.type in recipe.validParts)
 			if(I.type in recipe.validParts)
 				handle_part(I, user)
@@ -182,6 +197,13 @@
 	return
 */
 
+/obj/item/part/gun/frame/proc/get_part_types()
+	var/part_types = NONE
+	part_types |= gun_part_type
+	for(var/obj/item/part/gun/part in installedParts)
+		part_types |= part.gin_part_type
+	return part_types
+
 /*
 /obj/item/part/gun/frame/examine(user, distance)
 	. = ..()

From 93f18130d2b77a41d82c7c7be6c4f095149c7221 Mon Sep 17 00:00:00 2001
From: fallcon <falloutfalconplays@gmail.com>
Date: Wed, 31 Jan 2024 10:18:48 -0600
Subject: [PATCH 26/89] yea

---
 code/modules/guncrafting/frame.dm | 8 ++++----
 1 file changed, 4 insertions(+), 4 deletions(-)

diff --git a/code/modules/guncrafting/frame.dm b/code/modules/guncrafting/frame.dm
index 93161ebea3a9..43f31b8e47f3 100644
--- a/code/modules/guncrafting/frame.dm
+++ b/code/modules/guncrafting/frame.dm
@@ -165,14 +165,14 @@
 
 	for(var/datum/lathe_recipe/gun/recipe in gun_recipes)
 		if(istype(src.type))
-			filtered_recipes += recipe_type
+			filtered_recipes += recipe
 		for(var/obj/item/part/gun/installed_part in installedParts)
 			if(istype(part, installed_part))
-				filtered_recipes += recipe_type
+				filtered_recipes += recipe
 
 	return filtered_recipes
 
-/obj/item/part/gun/frame/attack_self(mob/user)
+/obj/item/part/gun/frame/attack_self(obj/item/I, mob/user)
 	. = ..()
 	for(var/datum/lathe_recipe/gun/recipe in get_current_recipes())
 		if(src.type in recipe.validParts)
@@ -201,7 +201,7 @@
 	var/part_types = NONE
 	part_types |= gun_part_type
 	for(var/obj/item/part/gun/part in installedParts)
-		part_types |= part.gin_part_type
+		part_types |= part.gun_part_type
 	return part_types
 
 /*

From 2bf0717f5355d5de2edaf33122e0b732764a8722 Mon Sep 17 00:00:00 2001
From: fallcon <falloutfalconplays@gmail.com>
Date: Wed, 31 Jan 2024 10:24:38 -0600
Subject: [PATCH 27/89] evil tbh

---
 code/modules/guncrafting/frame.dm | 9 ++++-----
 1 file changed, 4 insertions(+), 5 deletions(-)

diff --git a/code/modules/guncrafting/frame.dm b/code/modules/guncrafting/frame.dm
index 43f31b8e47f3..1441982c4c42 100644
--- a/code/modules/guncrafting/frame.dm
+++ b/code/modules/guncrafting/frame.dm
@@ -164,10 +164,10 @@
 	var/list/filtered_recipes = list()
 
 	for(var/datum/lathe_recipe/gun/recipe in gun_recipes)
-		if(istype(src.type))
+		if(istype(recipe, src.type))
 			filtered_recipes += recipe
 		for(var/obj/item/part/gun/installed_part in installedParts)
-			if(istype(part, installed_part))
+			if(istype(recipe, installed_part.type))
 				filtered_recipes += recipe
 
 	return filtered_recipes
@@ -175,9 +175,8 @@
 /obj/item/part/gun/frame/attack_self(obj/item/I, mob/user)
 	. = ..()
 	for(var/datum/lathe_recipe/gun/recipe in get_current_recipes())
-		if(src.type in recipe.validParts)
-			if(I.type in recipe.validParts)
-				handle_part(I, user)
+		if(I.type in recipe.validParts)
+			handle_part(I, user)
 	/*
 	if(!InstalledGrip)
 		to_chat(user, span_warning("\the [src] does not have a grip!"))

From f08b4bb18ea1487e11d70ef712021043be84e289 Mon Sep 17 00:00:00 2001
From: fallcon <falloutfalconplays@gmail.com>
Date: Wed, 31 Jan 2024 10:37:13 -0600
Subject: [PATCH 28/89] ye

---
 code/modules/guncrafting/frame.dm | 15 +++++++--------
 1 file changed, 7 insertions(+), 8 deletions(-)

diff --git a/code/modules/guncrafting/frame.dm b/code/modules/guncrafting/frame.dm
index 1441982c4c42..be194726100f 100644
--- a/code/modules/guncrafting/frame.dm
+++ b/code/modules/guncrafting/frame.dm
@@ -203,10 +203,16 @@
 		part_types |= part.gun_part_type
 	return part_types
 
-/*
 /obj/item/part/gun/frame/examine(user, distance)
 	. = ..()
 	if(.)
+		for (var/obj/item/part/gun/part in installedParts)
+			. += "<span class='notice'>\the [src] has \a [part] [icon2html(part, user)] installed.</span>"
+		for(var/datum/lathe_recipe/gun/recipe in get_current_recipes())
+			for(var/obj/item/part in recipe.validParts)
+				. += "<span class='notice'>\the [src] could hold \a [part] [icon2html(part, user)].</span>"
+
+/*
 		if(InstalledGrip)
 			. += "<span class='notice'>\the [src] has \a [InstalledGrip] installed.</span>"
 		else
@@ -224,18 +230,11 @@
 /obj/item/part/gun/frame/winchester
 	name = "Winchester Gun Frame"
 	icon_state = "frame_shotgun"
-	//result = /obj/item/gun/ballistic/shotgun/winchester
-	//validGrips = list(/obj/item/part/gun/modular/grip/wood)
-	//validMechanisms = list(/obj/item/part/gun/modular/mechanism/shotgun)
-	//validBarrels = list(/obj/item/part/gun/modular/barrel/shotgun)
 
 /obj/item/part/gun/frame/winchester/mk1
-	//result = /obj/item/gun/ballistic/shotgun/winchester/mk1
 
 /obj/item/part/gun/frame/m1911
-	//result = /obj/item/gun/ballistic/automatic/pistol/m1911
 
 /obj/item/part/gun/frame/commander
-	//result = /obj/item/gun/ballistic/automatic/pistol/commander
 
 /obj/item/part/gun/frame/boltaction

From 4420698086e1b5e013b65447b63481d6b843ca96 Mon Sep 17 00:00:00 2001
From: fallcon <falloutfalconplays@gmail.com>
Date: Wed, 31 Jan 2024 10:47:17 -0600
Subject: [PATCH 29/89] kinda working i think?

---
 code/modules/guncrafting/frame.dm | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/code/modules/guncrafting/frame.dm b/code/modules/guncrafting/frame.dm
index be194726100f..7e7271963ad8 100644
--- a/code/modules/guncrafting/frame.dm
+++ b/code/modules/guncrafting/frame.dm
@@ -22,9 +22,9 @@
 
 	gun_part_type = GUN_PART_FRAME
 
+/*
 /obj/item/part/gun/frame/Initialize(mapload, dont_spawn_with_parts)
 	..()
-	/*
 	var/spawn_with_preinstalled_parts = TRUE
 	if(dont_spawn_with_parts)
 		spawn_with_preinstalled_parts = FALSE

From f4c2581c113ea802dfa5a3a6a9090479d68cfe4e Mon Sep 17 00:00:00 2001
From: fallcon <falloutfalconplays@gmail.com>
Date: Wed, 31 Jan 2024 11:23:38 -0600
Subject: [PATCH 30/89] unit test?

---
 code/modules/guncrafting/frame.dm       | 21 +++++++++++----------
 code/modules/unit_tests/_unit_tests.dm  |  1 +
 code/modules/unit_tests/gun_crafting.dm | 12 ++++++++++++
 3 files changed, 24 insertions(+), 10 deletions(-)
 create mode 100644 code/modules/unit_tests/gun_crafting.dm

diff --git a/code/modules/guncrafting/frame.dm b/code/modules/guncrafting/frame.dm
index 7e7271963ad8..cbf87de8f778 100644
--- a/code/modules/guncrafting/frame.dm
+++ b/code/modules/guncrafting/frame.dm
@@ -150,13 +150,15 @@
 */
 
 /obj/item/part/gun/frame/proc/handle_part(obj/item/part/gun/I, mob/living/user)
-	if(I.gun_part_type && !(I.gun_part_type & get_part_types()))
-		if(insert_item(I, user))
-			to_chat(user, span_notice("You have attached the part to \the [src]."))
-			return
-	else
-		to_chat(user, span_warning("This part does not fit!"))
-		return
+	for(var/datum/lathe_recipe/gun/recipe in get_current_recipes())
+		if(I.type in recipe.validParts)
+			if(I.gun_part_type && !(I.gun_part_type & get_part_types()))
+				if(insert_item(I, user))
+					to_chat(user, span_notice("You have attached the part to \the [src]."))
+					return
+			else
+				to_chat(user, span_warning("This part does not fit!"))
+				return
 
 //Finds all recipes that match the current parts
 /obj/item/part/gun/frame/proc/get_current_recipes()
@@ -174,9 +176,8 @@
 
 /obj/item/part/gun/frame/attack_self(obj/item/I, mob/user)
 	. = ..()
-	for(var/datum/lathe_recipe/gun/recipe in get_current_recipes())
-		if(I.type in recipe.validParts)
-			handle_part(I, user)
+	if(istype(I, obj/item/part/gun))
+		handle_part(I, user)
 	/*
 	if(!InstalledGrip)
 		to_chat(user, span_warning("\the [src] does not have a grip!"))
diff --git a/code/modules/unit_tests/_unit_tests.dm b/code/modules/unit_tests/_unit_tests.dm
index cc12fe0c638f..74ed6919862f 100644
--- a/code/modules/unit_tests/_unit_tests.dm
+++ b/code/modules/unit_tests/_unit_tests.dm
@@ -72,6 +72,7 @@
 #include "create_and_destroy.dm"
 #include "biome_lists.dm"
 #include "emoting.dm"
+#include "gun_crafting.dm"
 #include "keybinding_init.dm"
 #include "machine_disassembly.dm"
 #include "open_air.dm"
diff --git a/code/modules/unit_tests/gun_crafting.dm b/code/modules/unit_tests/gun_crafting.dm
new file mode 100644
index 000000000000..0efba76beefa
--- /dev/null
+++ b/code/modules/unit_tests/gun_crafting.dm
@@ -0,0 +1,12 @@
+//Makes sure preinstalled frame parts can be removed an reinstalled
+/datum/unit_test/gun_crafting/Run()
+	var/mob/living/carbon/human/human = allocate(/mob/living/carbon/human)
+	for(var/frame_type in subtypesof(/obj/item/part/gun/frame))
+		var/obj/item/part/gun/frame/frame = new frame_type
+		var/list/frame_parts = frame.installedParts
+		for(var/obj/item/part/installedPart in frame.installedParts)
+			frame.eject_item(installedPart, human)
+			frame.handle_part(installedPart, human)
+		TEST_ASSERT_EQUAL(frame_parts, frame.installedParts, "Frame parts to match there original contents. I assume frame parts were not reinstalled correctly.")
+
+

From 3a2863c4750e45e048950878e2287f75dcec012d Mon Sep 17 00:00:00 2001
From: fallcon <falloutfalconplays@gmail.com>
Date: Wed, 31 Jan 2024 11:27:20 -0600
Subject: [PATCH 31/89] yea

---
 code/modules/guncrafting/frame.dm | 3 ++-
 code/modules/guncrafting/lathe.dm | 3 ++-
 2 files changed, 4 insertions(+), 2 deletions(-)

diff --git a/code/modules/guncrafting/frame.dm b/code/modules/guncrafting/frame.dm
index cbf87de8f778..8c519cf0ee1a 100644
--- a/code/modules/guncrafting/frame.dm
+++ b/code/modules/guncrafting/frame.dm
@@ -155,6 +155,7 @@
 			if(I.gun_part_type && !(I.gun_part_type & get_part_types()))
 				if(insert_item(I, user))
 					to_chat(user, span_notice("You have attached the part to \the [src]."))
+					installedParts += I
 					return
 			else
 				to_chat(user, span_warning("This part does not fit!"))
@@ -176,7 +177,7 @@
 
 /obj/item/part/gun/frame/attack_self(obj/item/I, mob/user)
 	. = ..()
-	if(istype(I, obj/item/part/gun))
+	if(istype(I, /obj/item/part/gun))
 		handle_part(I, user)
 	/*
 	if(!InstalledGrip)
diff --git a/code/modules/guncrafting/lathe.dm b/code/modules/guncrafting/lathe.dm
index f3a6445931a1..7aa5cf5a21cc 100644
--- a/code/modules/guncrafting/lathe.dm
+++ b/code/modules/guncrafting/lathe.dm
@@ -154,7 +154,8 @@
 ///////////
 
 /obj/item/stack/gun_part
-	name = "Gun Part"
+	name = "Gun Parts"
+	singular_name = "Gun Part"
 	desc = "This could fabcricate metal parts."
 	icon = 'icons/obj/guncrafting.dmi'
 	icon_state = "work_piece"

From d4762b3c18c591a4dd0fc6813c0739e61b9a0dc3 Mon Sep 17 00:00:00 2001
From: fallcon <falloutfalconplays@gmail.com>
Date: Wed, 31 Jan 2024 11:34:05 -0600
Subject: [PATCH 32/89] hard to tell if parts are reinstalled without any

---
 code/modules/guncrafting/frame.dm | 10 ++++++++++
 1 file changed, 10 insertions(+)

diff --git a/code/modules/guncrafting/frame.dm b/code/modules/guncrafting/frame.dm
index 8c519cf0ee1a..63bf53c60ef5 100644
--- a/code/modules/guncrafting/frame.dm
+++ b/code/modules/guncrafting/frame.dm
@@ -232,10 +232,20 @@
 /obj/item/part/gun/frame/winchester
 	name = "Winchester Gun Frame"
 	icon_state = "frame_shotgun"
+	installedParts = list(
+		/obj/item/part/gun/modular/grip/wood,
+		/obj/item/part/gun/modular/mechanism/shotgun,
+		/obj/item/part/gun/modular/barrel/shotgun
+		)
 
 /obj/item/part/gun/frame/winchester/mk1
 
 /obj/item/part/gun/frame/m1911
+	installedParts = list(
+		/obj/item/part/gun/modular/grip/wood,
+		/obj/item/part/gun/modular/mechanism,
+		/obj/item/part/gun/modular/barrel
+		)
 
 /obj/item/part/gun/frame/commander
 

From f80aad3364de9711106a74114b5adba45d06a262 Mon Sep 17 00:00:00 2001
From: fallcon <falloutfalconplays@gmail.com>
Date: Wed, 31 Jan 2024 11:39:36 -0600
Subject: [PATCH 33/89] what if wrong?

---
 code/modules/guncrafting/frame.dm | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/code/modules/guncrafting/frame.dm b/code/modules/guncrafting/frame.dm
index 63bf53c60ef5..147fc1cf28e8 100644
--- a/code/modules/guncrafting/frame.dm
+++ b/code/modules/guncrafting/frame.dm
@@ -244,7 +244,7 @@
 	installedParts = list(
 		/obj/item/part/gun/modular/grip/wood,
 		/obj/item/part/gun/modular/mechanism,
-		/obj/item/part/gun/modular/barrel
+		/obj/item/part/gun/modular/barrel/shotgun
 		)
 
 /obj/item/part/gun/frame/commander

From 026d860a263c151eedffd4d4187a370252fa7688 Mon Sep 17 00:00:00 2001
From: fallcon <falloutfalconplays@gmail.com>
Date: Wed, 31 Jan 2024 11:50:32 -0600
Subject: [PATCH 34/89] TEST

---
 code/modules/guncrafting/frame.dm | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)

diff --git a/code/modules/guncrafting/frame.dm b/code/modules/guncrafting/frame.dm
index 147fc1cf28e8..7ae7904e96d6 100644
--- a/code/modules/guncrafting/frame.dm
+++ b/code/modules/guncrafting/frame.dm
@@ -52,6 +52,7 @@
 	user.visible_message(
 		"[user] removes [I] from [src].",
 		span_notice("You remove [I] from [src].")
+		installedParts -= I
 	)
 	return TRUE
 
@@ -244,7 +245,7 @@
 	installedParts = list(
 		/obj/item/part/gun/modular/grip/wood,
 		/obj/item/part/gun/modular/mechanism,
-		/obj/item/part/gun/modular/barrel/shotgun
+		/obj/item/part/gun/modular/barrel
 		)
 
 /obj/item/part/gun/frame/commander

From 750378906f02ce88a8bc2f9928831156dd10238f Mon Sep 17 00:00:00 2001
From: FalloutFalcon <falloutfalconplays@gmail.com>
Date: Wed, 31 Jan 2024 18:52:35 -0600
Subject: [PATCH 35/89] bleh

---
 code/modules/guncrafting/frame.dm  | 45 ++++++++++++++++++++----------
 code/modules/guncrafting/recipe.dm |  2 +-
 2 files changed, 32 insertions(+), 15 deletions(-)

diff --git a/code/modules/guncrafting/frame.dm b/code/modules/guncrafting/frame.dm
index 7ae7904e96d6..883803ed8fec 100644
--- a/code/modules/guncrafting/frame.dm
+++ b/code/modules/guncrafting/frame.dm
@@ -3,7 +3,9 @@
 	desc = "a generic gun frame."
 	icon_state = "frame_olivaw"
 	//var/obj/item/gun/result = /obj/item/gun
+	var/list/preinstalledParts = list()
 	var/list/installedParts = list()
+	var/list/filtered_recipes = list()
 
 	// Currently installed grip
 	//var/obj/item/part/gun/modular/grip/InstalledGrip
@@ -22,9 +24,12 @@
 
 	gun_part_type = GUN_PART_FRAME
 
-/*
-/obj/item/part/gun/frame/Initialize(mapload, dont_spawn_with_parts)
+
+/obj/item/part/gun/frame/Initialize()
 	..()
+	for (var/partType in preinstalledParts)
+		installedParts += new partType(src)
+	/*
 	var/spawn_with_preinstalled_parts = TRUE
 	if(dont_spawn_with_parts)
 		spawn_with_preinstalled_parts = FALSE
@@ -52,8 +57,8 @@
 	user.visible_message(
 		"[user] removes [I] from [src].",
 		span_notice("You remove [I] from [src].")
-		installedParts -= I
 	)
+	installedParts -= I
 	return TRUE
 
 /obj/item/part/gun/frame/proc/insert_item(obj/item/I, mob/living/user)
@@ -78,6 +83,9 @@
 	return TRUE
 
 /obj/item/part/gun/frame/attackby(obj/item/I, mob/living/user, params)
+	. = ..()
+	if(istype(I, /obj/item/part/gun))
+		handle_part(I, user)
 	/*
 	if(istype(I, /obj/item/part/gun/modular/grip))
 		if(InstalledGrip)
@@ -151,8 +159,14 @@
 */
 
 /obj/item/part/gun/frame/proc/handle_part(obj/item/part/gun/I, mob/living/user)
-	for(var/datum/lathe_recipe/gun/recipe in get_current_recipes())
+	get_current_recipes()
+	var/list/valid_recipes = filtered_recipes
+	to_chat(user, span_warning("Recipes [valid_recipes]"))
+	for(var/datum/lathe_recipe/gun/recipe in valid_recipes)
 		if(I.type in recipe.validParts)
+			to_chat(user, span_warning("Recipe [recipe]"))
+			to_chat(user, span_warning("Part [I]"))
+			to_chat(user, span_warning("Part type [recipe.validParts]"))
 			if(I.gun_part_type && !(I.gun_part_type & get_part_types()))
 				if(insert_item(I, user))
 					to_chat(user, span_notice("You have attached the part to \the [src]."))
@@ -161,11 +175,14 @@
 			else
 				to_chat(user, span_warning("This part does not fit!"))
 				return
+			to_chat(user, span_warning("Weird!"))
+
 
 //Finds all recipes that match the current parts
 /obj/item/part/gun/frame/proc/get_current_recipes()
-	var/list/gun_recipes = subtypesof(/datum/lathe_recipe/gun)
-	var/list/filtered_recipes = list()
+	var/list/datum/gun_recipes = subtypesof(/datum/lathe_recipe/gun)
+	filtered_recipes = list()
+	filtered_recipes += /datum/lathe_recipe/gun/winchester
 
 	for(var/datum/lathe_recipe/gun/recipe in gun_recipes)
 		if(istype(recipe, src.type))
@@ -176,10 +193,8 @@
 
 	return filtered_recipes
 
-/obj/item/part/gun/frame/attack_self(obj/item/I, mob/user)
-	. = ..()
-	if(istype(I, /obj/item/part/gun))
-		handle_part(I, user)
+///obj/item/part/gun/frame/attack_self(obj/item/I, mob/user)
+
 	/*
 	if(!InstalledGrip)
 		to_chat(user, span_warning("\the [src] does not have a grip!"))
@@ -211,8 +226,10 @@
 	if(.)
 		for (var/obj/item/part/gun/part in installedParts)
 			. += "<span class='notice'>\the [src] has \a [part] [icon2html(part, user)] installed.</span>"
-		for(var/datum/lathe_recipe/gun/recipe in get_current_recipes())
-			for(var/obj/item/part in recipe.validParts)
+		get_current_recipes()
+		var/list/datum/valid_recipes = filtered_recipes
+		for(var/datum/lathe_recipe/gun/recipe in valid_recipes)
+			for(var/part in recipe.validParts)
 				. += "<span class='notice'>\the [src] could hold \a [part] [icon2html(part, user)].</span>"
 
 /*
@@ -233,7 +250,7 @@
 /obj/item/part/gun/frame/winchester
 	name = "Winchester Gun Frame"
 	icon_state = "frame_shotgun"
-	installedParts = list(
+	preinstalledParts = list(
 		/obj/item/part/gun/modular/grip/wood,
 		/obj/item/part/gun/modular/mechanism/shotgun,
 		/obj/item/part/gun/modular/barrel/shotgun
@@ -242,7 +259,7 @@
 /obj/item/part/gun/frame/winchester/mk1
 
 /obj/item/part/gun/frame/m1911
-	installedParts = list(
+	preinstalledParts = list(
 		/obj/item/part/gun/modular/grip/wood,
 		/obj/item/part/gun/modular/mechanism,
 		/obj/item/part/gun/modular/barrel
diff --git a/code/modules/guncrafting/recipe.dm b/code/modules/guncrafting/recipe.dm
index b0cc8f5afd0d..df5bbc9a7a7e 100644
--- a/code/modules/guncrafting/recipe.dm
+++ b/code/modules/guncrafting/recipe.dm
@@ -14,7 +14,7 @@
 		/obj/item/part/gun/modular/barrel/shotgun
 		)
 
-/datum/lathe_recipe/gun/winchester
+/datum/lathe_recipe/gun/winchester/mk1
 	result = /obj/item/gun/ballistic/shotgun/winchester/mk1
 	validParts = list(
 		/obj/item/part/gun/frame/winchester/mk1,

From b05cf87c2c654dcd64451353e24060bbb240e53e Mon Sep 17 00:00:00 2001
From: fallcon <falloutfalconplays@gmail.com>
Date: Thu, 1 Feb 2024 10:08:51 -0600
Subject: [PATCH 36/89] no bitflags

---
 code/__DEFINES/gun_crafting.dm     |  4 ----
 code/modules/guncrafting/frame.dm  |  2 +-
 code/modules/guncrafting/recipe.dm | 25 ++++++++++++++++++++++++-
 3 files changed, 25 insertions(+), 6 deletions(-)

diff --git a/code/__DEFINES/gun_crafting.dm b/code/__DEFINES/gun_crafting.dm
index a0257209d6f9..e69de29bb2d1 100644
--- a/code/__DEFINES/gun_crafting.dm
+++ b/code/__DEFINES/gun_crafting.dm
@@ -1,4 +0,0 @@
-#define GUN_PART_FRAME (1<<0)
-#define GUN_PART_BARREL (1<<1)
-#define GUN_PART_MECHANISM (1<<2)
-#define GUN_PART_GRIP (1<<3)
diff --git a/code/modules/guncrafting/frame.dm b/code/modules/guncrafting/frame.dm
index 7ae7904e96d6..eae05aba15d7 100644
--- a/code/modules/guncrafting/frame.dm
+++ b/code/modules/guncrafting/frame.dm
@@ -20,7 +20,7 @@
 	// Which barrels does the frame accept?
 	//var/list/validBarrels = list(/obj/item/part/gun/modular/barrel)
 
-	gun_part_type = GUN_PART_FRAME
+	gun_part_type = "gun_frame"
 
 /*
 /obj/item/part/gun/frame/Initialize(mapload, dont_spawn_with_parts)
diff --git a/code/modules/guncrafting/recipe.dm b/code/modules/guncrafting/recipe.dm
index b0cc8f5afd0d..80c675dee61d 100644
--- a/code/modules/guncrafting/recipe.dm
+++ b/code/modules/guncrafting/recipe.dm
@@ -1,5 +1,28 @@
 /datum/lathe_recipe
-	var/obj/item/result = /obj/item/gun
+	var/result
+	var/list/steps = list()
+	var/time = 30 //time in deciseconds
+
+/datum/lathe_recipe/part
+	var/list/reqs = list(/obj/item/stack/sheet/metal = 3)
+
+/datum/lathe_recipe/part/frame
+	result = /obj/item/part/gun/frame
+
+/datum/lathe_recipe/part/frame/winchester
+	result = /obj/item/part/gun/frame/winchester
+
+/datum/lathe_recipe/part/grip/wood
+	result = /obj/item/part/gun/modular/grip/wood
+	reqs = list(/obj/item/stack/sheet/mineral/wood = 3)
+
+/datum/lathe_recipe/part/mechanism/shotgun
+	result = /obj/item/part/gun/modular/mechanism/shotgun
+	reqs = list(/obj/item/stack/sheet/metal = 2,
+			/obj/item/stack/gun_part = 1)
+
+/datum/lathe_recipe/part/barrel/shotgun
+	result = /obj/item/part/gun/modular/barrel/shotgun
 
 /datum/lathe_recipe/gun
 	var/list/validParts = list()

From 2aec984766b853324fa030bcea2868e0dff9e6f0 Mon Sep 17 00:00:00 2001
From: fallcon <falloutfalconplays@gmail.com>
Date: Thu, 1 Feb 2024 10:16:57 -0600
Subject: [PATCH 37/89] shrug

---
 code/__DEFINES/gun_crafting.dm    | 4 ++++
 code/modules/guncrafting/frame.dm | 2 +-
 2 files changed, 5 insertions(+), 1 deletion(-)

diff --git a/code/__DEFINES/gun_crafting.dm b/code/__DEFINES/gun_crafting.dm
index e69de29bb2d1..d4db4d300a77 100644
--- a/code/__DEFINES/gun_crafting.dm
+++ b/code/__DEFINES/gun_crafting.dm
@@ -0,0 +1,4 @@
+#define GUN_PART_FRAME "frame"
+#define GUN_PART_BARREL "barrel"
+#define GUN_PART_GRIP "grip"
+#define GUN_PART_MECHANISM "mechanism"
diff --git a/code/modules/guncrafting/frame.dm b/code/modules/guncrafting/frame.dm
index eae05aba15d7..7ae7904e96d6 100644
--- a/code/modules/guncrafting/frame.dm
+++ b/code/modules/guncrafting/frame.dm
@@ -20,7 +20,7 @@
 	// Which barrels does the frame accept?
 	//var/list/validBarrels = list(/obj/item/part/gun/modular/barrel)
 
-	gun_part_type = "gun_frame"
+	gun_part_type = GUN_PART_FRAME
 
 /*
 /obj/item/part/gun/frame/Initialize(mapload, dont_spawn_with_parts)

From 281debc1c48e9d36842262250334ed6a466fe890 Mon Sep 17 00:00:00 2001
From: FalloutFalcon <falloutfalconplays@gmail.com>
Date: Thu, 1 Feb 2024 20:24:43 -0600
Subject: [PATCH 38/89] yea

---
 code/__HELPERS/global_lists.dm     |  4 +++
 code/_globalvars/lists/objects.dm  |  1 +
 code/modules/guncrafting/frame.dm  | 50 ++++++++++++++++--------------
 code/modules/guncrafting/recipe.dm |  1 +
 4 files changed, 32 insertions(+), 24 deletions(-)

diff --git a/code/__HELPERS/global_lists.dm b/code/__HELPERS/global_lists.dm
index 1048aaa5c861..bb3d176d66e7 100644
--- a/code/__HELPERS/global_lists.dm
+++ b/code/__HELPERS/global_lists.dm
@@ -64,6 +64,10 @@
 		GLOB.surgeries_list += new path()
 	sortList(GLOB.surgeries_list, /proc/cmp_typepaths_asc)
 
+	for(var/path in subtypesof(/datum/lathe_recipe/gun))
+		GLOB.gun_recipe_list += new path()
+	sortList(GLOB.gun_recipe_list, /proc/cmp_typepaths_asc)
+
 	// Hair Gradients - Initialise all /datum/sprite_accessory/hair_gradient into an list indexed by gradient-style name
 	for(var/path in subtypesof(/datum/sprite_accessory/hair_gradient))
 		var/datum/sprite_accessory/hair_gradient/H = new path()
diff --git a/code/_globalvars/lists/objects.dm b/code/_globalvars/lists/objects.dm
index 82258dfdcd43..6f3e2453440e 100644
--- a/code/_globalvars/lists/objects.dm
+++ b/code/_globalvars/lists/objects.dm
@@ -17,6 +17,7 @@ GLOBAL_LIST(chemical_reagents_list)				//list of all /datum/reagent datums index
 GLOBAL_LIST_EMPTY(materials_list)				//list of all /datum/material datums indexed by material id.
 GLOBAL_LIST_EMPTY(tech_list)					//list of all /datum/tech datums indexed by id.
 GLOBAL_LIST_EMPTY(surgeries_list)				//list of all surgeries by name, associated with their path.
+GLOBAL_LIST_EMPTY(gun_recipe_list)
 GLOBAL_LIST_EMPTY(crafting_recipes)				//list of all table craft recipes
 GLOBAL_LIST_EMPTY(rcd_list)					//list of Rapid Construction Devices.
 GLOBAL_LIST_EMPTY(apcs_list)					//list of all Area Power Controller machines, separate from machines for powernet speeeeeeed.
diff --git a/code/modules/guncrafting/frame.dm b/code/modules/guncrafting/frame.dm
index 883803ed8fec..8df623a1181e 100644
--- a/code/modules/guncrafting/frame.dm
+++ b/code/modules/guncrafting/frame.dm
@@ -29,6 +29,7 @@
 	..()
 	for (var/partType in preinstalledParts)
 		installedParts += new partType(src)
+	get_current_recipes()
 	/*
 	var/spawn_with_preinstalled_parts = TRUE
 	if(dont_spawn_with_parts)
@@ -159,40 +160,36 @@
 */
 
 /obj/item/part/gun/frame/proc/handle_part(obj/item/part/gun/I, mob/living/user)
-	get_current_recipes()
-	var/list/valid_recipes = filtered_recipes
-	to_chat(user, span_warning("Recipes [valid_recipes]"))
-	for(var/datum/lathe_recipe/gun/recipe in valid_recipes)
+	for(var/datum/lathe_recipe/gun/recipe in filtered_recipes)
 		if(I.type in recipe.validParts)
-			to_chat(user, span_warning("Recipe [recipe]"))
-			to_chat(user, span_warning("Part [I]"))
-			to_chat(user, span_warning("Part type [recipe.validParts]"))
 			if(I.gun_part_type && !(I.gun_part_type & get_part_types()))
 				if(insert_item(I, user))
 					to_chat(user, span_notice("You have attached the part to \the [src]."))
 					installedParts += I
+					get_current_recipes()
 					return
 			else
 				to_chat(user, span_warning("This part does not fit!"))
 				return
-			to_chat(user, span_warning("Weird!"))
 
 
 //Finds all recipes that match the current parts
 /obj/item/part/gun/frame/proc/get_current_recipes()
-	var/list/datum/gun_recipes = subtypesof(/datum/lathe_recipe/gun)
 	filtered_recipes = list()
-	filtered_recipes += /datum/lathe_recipe/gun/winchester
-
-	for(var/datum/lathe_recipe/gun/recipe in gun_recipes)
-		if(istype(recipe, src.type))
+	for(var/datum/lathe_recipe/gun/recipe in GLOB.gun_recipe_list)
+		if(is_recipe_valid(recipe))
 			filtered_recipes += recipe
-		for(var/obj/item/part/gun/installed_part in installedParts)
-			if(istype(recipe, installed_part.type))
-				filtered_recipes += recipe
-
 	return filtered_recipes
 
+
+//Should return false if
+/obj/item/part/gun/frame/proc/is_recipe_valid(datum/lathe_recipe/gun/recipe)
+	if(!(src.type in recipe.validParts))
+		return FALSE
+	for(var/obj/item/part/gun/installed_part in installedParts)
+		if(!(installed_part.type in recipe.validParts))
+			return FALSE
+	return TRUE
 ///obj/item/part/gun/frame/attack_self(obj/item/I, mob/user)
 
 	/*
@@ -214,6 +211,8 @@
 	return
 */
 
+/obj/item/part/gun/frame/proc/can_be_installed()
+
 /obj/item/part/gun/frame/proc/get_part_types()
 	var/part_types = NONE
 	part_types |= gun_part_type
@@ -225,12 +224,11 @@
 	. = ..()
 	if(.)
 		for (var/obj/item/part/gun/part in installedParts)
-			. += "<span class='notice'>\the [src] has \a [part] [icon2html(part, user)] installed.</span>"
-		get_current_recipes()
-		var/list/datum/valid_recipes = filtered_recipes
-		for(var/datum/lathe_recipe/gun/recipe in valid_recipes)
-			for(var/part in recipe.validParts)
-				. += "<span class='notice'>\the [src] could hold \a [part] [icon2html(part, user)].</span>"
+			. += "<span class='notice'>[src] has \a [part] [icon2html(part, user)] installed.</span>"
+		for(var/datum/lathe_recipe/gun/recipe in filtered_recipes)
+			for(var/obj/part as anything in recipe.validParts)
+				. += "<span class='notice'>[src] could hold \a [initial(part.name)].</span>"
+		. += "<span class='notice'>[src] could hold \a [get_part_types()].</span>"
 
 /*
 		if(InstalledGrip)
@@ -248,7 +246,7 @@
 */
 
 /obj/item/part/gun/frame/winchester
-	name = "Winchester Gun Frame"
+	name = "winchester gun frame"
 	icon_state = "frame_shotgun"
 	preinstalledParts = list(
 		/obj/item/part/gun/modular/grip/wood,
@@ -257,8 +255,10 @@
 		)
 
 /obj/item/part/gun/frame/winchester/mk1
+	name = "winchester mk1 gun frame"
 
 /obj/item/part/gun/frame/m1911
+	name = "m1911 gun frame"
 	preinstalledParts = list(
 		/obj/item/part/gun/modular/grip/wood,
 		/obj/item/part/gun/modular/mechanism,
@@ -266,5 +266,7 @@
 		)
 
 /obj/item/part/gun/frame/commander
+	name = "commander gun frame"
 
 /obj/item/part/gun/frame/boltaction
+	name = "bolt action gun frame"
diff --git a/code/modules/guncrafting/recipe.dm b/code/modules/guncrafting/recipe.dm
index 6ef1c5c86f68..25840add3471 100644
--- a/code/modules/guncrafting/recipe.dm
+++ b/code/modules/guncrafting/recipe.dm
@@ -63,5 +63,6 @@
 		/obj/item/part/gun/modular/mechanism,
 		/obj/item/part/gun/modular/barrel
 		)
+
 /datum/lathe_recipe/gun/boltaction
 	result	= /obj/item/gun/ballistic/rifle/boltaction

From 0eee1212f68f2f0a91b06d4357d3031f055ac33e Mon Sep 17 00:00:00 2001
From: fallcon <falloutfalconplays@gmail.com>
Date: Fri, 2 Feb 2024 17:00:01 -0600
Subject: [PATCH 39/89] yea

---
 code/modules/guncrafting/frame.dm             | 17 +++---
 .../guncrafting}/guncrafting.dm               | 10 +++-
 code/modules/guncrafting/lathe.dm             | 12 -----
 code/modules/guncrafting/recipe.dm            | 54 +++++++++++++++++++
 code/modules/research/designs.dm              |  5 +-
 5 files changed, 74 insertions(+), 24 deletions(-)
 rename code/{datums/components/crafting => modules/guncrafting}/guncrafting.dm (77%)

diff --git a/code/modules/guncrafting/frame.dm b/code/modules/guncrafting/frame.dm
index 8df623a1181e..e5cd6f5fe7cc 100644
--- a/code/modules/guncrafting/frame.dm
+++ b/code/modules/guncrafting/frame.dm
@@ -26,7 +26,7 @@
 
 
 /obj/item/part/gun/frame/Initialize()
-	..()
+	. = ..()
 	for (var/partType in preinstalledParts)
 		installedParts += new partType(src)
 	get_current_recipes()
@@ -162,15 +162,18 @@
 /obj/item/part/gun/frame/proc/handle_part(obj/item/part/gun/I, mob/living/user)
 	for(var/datum/lathe_recipe/gun/recipe in filtered_recipes)
 		if(I.type in recipe.validParts)
-			if(I.gun_part_type && !(I.gun_part_type & get_part_types()))
-				if(insert_item(I, user))
-					to_chat(user, span_notice("You have attached the part to \the [src]."))
-					installedParts += I
-					get_current_recipes()
-					return
+			//if(I.gun_part_type && !(I.gun_part_type & get_part_types()))
+			if(insert_item(I, user))
+				to_chat(user, span_notice("You have attached the part to \the [src]."))
+				installedParts += I
+				get_current_recipes()
+				return
 			else
 				to_chat(user, span_warning("This part does not fit!"))
 				return
+		else
+			to_chat(user, span_warning("This part cannot be installed on this [src]!"))
+			return
 
 
 //Finds all recipes that match the current parts
diff --git a/code/datums/components/crafting/guncrafting.dm b/code/modules/guncrafting/guncrafting.dm
similarity index 77%
rename from code/datums/components/crafting/guncrafting.dm
rename to code/modules/guncrafting/guncrafting.dm
index c26b81bc41eb..db3ea57a8cc2 100644
--- a/code/datums/components/crafting/guncrafting.dm
+++ b/code/modules/guncrafting/guncrafting.dm
@@ -1,5 +1,3 @@
-//Gun crafting parts til they can be moved elsewhere
-
 // PARTS //
 
 /obj/item/weaponcrafting/receiver
@@ -20,3 +18,11 @@
 	desc = "A long piece of Silk that looks like a cable coil."
 	icon = 'icons/obj/improvised.dmi'
 	icon_state = "silkstring"
+
+/obj/item/stack/gun_part
+	name = "Gun Parts"
+	singular_name = "Gun Part"
+	desc = "This could fabcricate metal parts."
+	icon = 'icons/obj/guncrafting.dmi'
+	icon_state = "work_piece"
+	max_amount = 10
diff --git a/code/modules/guncrafting/lathe.dm b/code/modules/guncrafting/lathe.dm
index 7aa5cf5a21cc..34819f7541b6 100644
--- a/code/modules/guncrafting/lathe.dm
+++ b/code/modules/guncrafting/lathe.dm
@@ -148,15 +148,3 @@
 			part_to_build.forceMove(drop_location())
 	*/
 	mode = FALSE
-
-///////////
-// ITEMS //
-///////////
-
-/obj/item/stack/gun_part
-	name = "Gun Parts"
-	singular_name = "Gun Part"
-	desc = "This could fabcricate metal parts."
-	icon = 'icons/obj/guncrafting.dmi'
-	icon_state = "work_piece"
-	max_amount = 10
diff --git a/code/modules/guncrafting/recipe.dm b/code/modules/guncrafting/recipe.dm
index 25840add3471..5542082d5732 100644
--- a/code/modules/guncrafting/recipe.dm
+++ b/code/modules/guncrafting/recipe.dm
@@ -66,3 +66,57 @@
 
 /datum/lathe_recipe/gun/boltaction
 	result	= /obj/item/gun/ballistic/rifle/boltaction
+
+/datum/lathe_recipe/gun/doublebarrel
+	result = /obj/item/gun/ballistic/shotgun/doublebarrel
+	validParts = list(
+		/obj/item/part/gun/frame/doublebarrel,
+		/obj/item/part/gun/modular/grip/wood,
+		/obj/item/part/gun/modular/mechanism/shotgun,
+		/obj/item/part/gun/modular/barrel/shotgun
+		)
+
+/datum/lathe_recipe/gun/derringer
+	result = /obj/item/gun/ballistic/derringer
+	validParts = list(
+		/obj/item/part/gun/frame/derringer,
+		/obj/item/part/gun/modular/grip/wood,
+		/obj/item/part/gun/modular/mechanism,
+		/obj/item/part/gun/modular/barrel
+		)
+
+/datum/lathe_recipe/gun/srmrevolver
+	result = /obj/item/gun/ballistic/revolver/srm
+	validParts = list(
+		/obj/item/part/gun/frame/srmrevolver,
+		/obj/item/part/gun/modular/grip/wood,
+		/obj/item/part/gun/modular/mechanism,
+		/obj/item/part/gun/modular/barrel
+		)
+
+/datum/lathe_recipe/gun/pepperbox
+	result = /obj/item/gun/ballistic/revolver/pepperbox
+	validParts = list(
+		/obj/item/part/gun/frame/pepperbox,
+		/obj/item/part/gun/modular/grip/wood,
+		/obj/item/part/gun/modular/mechanism,
+		/obj/item/part/gun/modular/barrel
+		)
+
+/datum/lathe_recipe/gun/nagantrevolver
+	result = /obj/item/gun/ballistic/revolver/nagant
+	validParts = list(
+		/obj/item/part/gun/frame/nagantrevolver,
+		/obj/item/part/gun/modular/grip/wood,
+		/obj/item/part/gun/modular/mechanism,
+		/obj/item/part/gun/modular/barrel
+		)
+
+/datum/lathe_recipe/gun/nagantrifle
+	result = /obj/item/gun/ballistic/rifle/boltaction/nagantrifle
+	validParts = list(
+		/obj/item/part/gun/frame/nagantrifle,
+		/obj/item/part/gun/modular/grip/wood,
+		/obj/item/part/gun/modular/mechanism,
+		/obj/item/part/gun/modular/barrel
+		)
diff --git a/code/modules/research/designs.dm b/code/modules/research/designs.dm
index ec4038ec8f2b..ab96a25edcf0 100644
--- a/code/modules/research/designs.dm
+++ b/code/modules/research/designs.dm
@@ -145,16 +145,15 @@ other types of metals and chemistry for reagents).
 	. = ..()
 	blueprints[1] = new /datum/design/n762()
 
-/obj/item/disk/design_disk/adv/disposable_gun
+/obj/item/disk/design_disk/disposable_gun
 	name = "design disk - disposable gun"
 	desc = "A design disk containing designs for a cheap and disposable gun."
 	illustration = "gun"
 	max_blueprints = 2
 
-/obj/item/disk/design_disk/adv/disposable_gun/Initialize()
+/obj/item/disk/design_disk/disposable_gun/Initialize()
 	. = ..()
 	blueprints[1] = new /datum/design/disposable_gun()
-	blueprints[2] = new /datum/design/pizza_disposable_gun()
 
 /obj/item/disk/design_disk/cmm_mechs
 	name = "design disk - CMM mecha modifications"

From c52fb7f4b3bce5256e569d8e22c95806c441bbb2 Mon Sep 17 00:00:00 2001
From: FalloutFalcon <falloutfalconplays@gmail.com>
Date: Sun, 4 Feb 2024 16:12:37 -0600
Subject: [PATCH 40/89] wooo so much stuff..

---
 code/modules/guncrafting/frame.dm             | 190 ++++++------------
 code/modules/guncrafting/guncrafting.dm       |  23 +++
 code/modules/guncrafting/part.dm              |  14 +-
 code/modules/guncrafting/recipe.dm            |  52 ++---
 code/modules/guncrafting/tools.dm             |  17 --
 .../boxes_magazines/_box_magazine.dm          |   4 +-
 code/modules/projectiles/guns/ballistic.dm    |  16 +-
 .../projectiles/guns/ballistic/shotgun.dm     |   1 -
 shiptest.dme                                  |   2 +-
 9 files changed, 144 insertions(+), 175 deletions(-)

diff --git a/code/modules/guncrafting/frame.dm b/code/modules/guncrafting/frame.dm
index e5cd6f5fe7cc..94a113f72f94 100644
--- a/code/modules/guncrafting/frame.dm
+++ b/code/modules/guncrafting/frame.dm
@@ -2,26 +2,10 @@
 	name = "gun frame"
 	desc = "a generic gun frame."
 	icon_state = "frame_olivaw"
-	//var/obj/item/gun/result = /obj/item/gun
 	var/list/preinstalledParts = list()
 	var/list/installedParts = list()
 	var/list/filtered_recipes = list()
 
-	// Currently installed grip
-	//var/obj/item/part/gun/modular/grip/InstalledGrip
-	// Which grips does the frame accept?
-	//var/list/validGrips = list(/obj/item/part/gun/modular/grip/wood, /obj/item/part/gun/modular/grip/black)
-
-	// Currently installed mechanism
-	//var/obj/item/part/gun/modular/grip/InstalledMechanism
-	// Which mechanism the frame accepts?
-	//var/list/validMechanisms = list(/obj/item/part/gun/modular/mechanism)
-
-	// Currently installed barrel
-	//var/obj/item/part/gun/modular/barrel/InstalledBarrel
-	// Which barrels does the frame accept?
-	//var/list/validBarrels = list(/obj/item/part/gun/modular/barrel)
-
 	gun_part_type = GUN_PART_FRAME
 
 
@@ -87,29 +71,6 @@
 	. = ..()
 	if(istype(I, /obj/item/part/gun))
 		handle_part(I, user)
-	/*
-	if(istype(I, /obj/item/part/gun/modular/grip))
-		if(InstalledGrip)
-			to_chat(user, span_warning("[src] already has a grip attached!"))
-			return
-		else
-			handle_grip(I, user)
-
-	if(istype(I, /obj/item/part/gun/modular/mechanism))
-		if(InstalledMechanism)
-			to_chat(user, span_warning("[src] already has a mechanism attached!"))
-			return
-		else
-			handle_mechanism(I, user)
-
-	if(istype(I, /obj/item/part/gun/modular/barrel))
-		if(InstalledBarrel)
-			to_chat(user, span_warning("[src] already has a barrel attached!"))
-			return
-		else
-			handle_barrel(I, user)
-		*/
-
 	if(I.tool_behaviour == TOOL_SCREWDRIVER)
 		var/list/possibles = contents.Copy()
 		var/obj/item/part/gun/toremove = input("Which part would you like to remove?","Removing parts") in possibles
@@ -117,63 +78,23 @@
 			return
 		if(I.use_tool(src, user, 40, volume=50))
 			eject_item(toremove, user)
-			/*
-			if(istype(toremove, /obj/item/part/gun/modular/grip))
-				InstalledGrip = null
-			else if(istype(toremove, /obj/item/part/gun/modular/barrel))
-				InstalledBarrel = FALSE
-			else if(istype(toremove, /obj/item/part/gun/modular/mechanism))
-				InstalledMechanism = FALSE
-			*/
-
 	return ..()
-/*
-/obj/item/part/gun/frame/proc/handle_grip(obj/item/I, mob/living/user)
-	if(I.type in validGrips)
-		if(insert_item(I, user))
-			InstalledGrip = I
-			to_chat(user, span_notice("You have attached the grip to \the [src]."))
-			return
-	else
-		to_chat(user, span_warning("This grip does not fit!"))
-		return
-
-/obj/item/part/gun/frame/proc/handle_mechanism(obj/item/I, mob/living/user)
-	if(I.type in validMechanisms)
-		if(insert_item(I, user))
-			InstalledMechanism = I
-			to_chat(user, span_notice("You have attached the mechanism to \the [src]."))
-			return
-	else
-		to_chat(user, span_warning("This mechanism does not fit!"))
-		return
-
-/obj/item/part/gun/frame/proc/handle_barrel(obj/item/I, mob/living/user)
-	if(I.type in validBarrels)
-		if(insert_item(I, user))
-			InstalledBarrel = I
-			to_chat(user, span_notice("You have attached the barrel to \the [src]."))
-			return
-	else
-		to_chat(user, span_warning("This barrel does not fit!"))
-		return
-*/
 
 /obj/item/part/gun/frame/proc/handle_part(obj/item/part/gun/I, mob/living/user)
 	for(var/datum/lathe_recipe/gun/recipe in filtered_recipes)
 		if(I.type in recipe.validParts)
-			//if(I.gun_part_type && !(I.gun_part_type & get_part_types()))
-			if(insert_item(I, user))
-				to_chat(user, span_notice("You have attached the part to \the [src]."))
-				installedParts += I
-				get_current_recipes()
-				return
+			if(I.gun_part_type && !(I.gun_part_type in get_part_types()))
+				if(insert_item(I, user))
+					to_chat(user, span_notice("You have attached the part to \the [src]."))
+					installedParts += I
+					get_current_recipes()
+					return
+				else
+					to_chat(user, span_warning("This part does not fit!"))
 			else
-				to_chat(user, span_warning("This part does not fit!"))
-				return
+				to_chat(user, span_warning("This type of part is already installed!"))
 		else
 			to_chat(user, span_warning("This part cannot be installed on this [src]!"))
-			return
 
 
 //Finds all recipes that match the current parts
@@ -193,31 +114,40 @@
 		if(!(installed_part.type in recipe.validParts))
 			return FALSE
 	return TRUE
-///obj/item/part/gun/frame/attack_self(obj/item/I, mob/user)
 
-	/*
-	if(!InstalledGrip)
-		to_chat(user, span_warning("\the [src] does not have a grip!"))
-		return
-	if(!InstalledMechanism)
-		to_chat(user, span_warning("\the [src] does not have a mechanism!"))
+/obj/item/part/gun/frame/attack_self(mob/user)
+	var/list/choose_options = list()
+	var/list/option_results = list()
+	for(var/datum/lathe_recipe/gun/recipe in filtered_recipes)
+		var/obj/recipe_result = recipe.result
+		var/list/parts_for_craft = list()
+		for(var/obj/item/part/gun/part as anything in recipe.validParts)
+			var/part_type = initial(part.gun_part_type)
+			var/list/installed_types = get_part_types()
+			if(!(part_type in installed_types))
+				parts_for_craft += "	\a [initial(part.name)]"
+		if(length(parts_for_craft) != 0)
+			to_chat(user, span_warning("Parts needed for a [initial(recipe_result.name)]:"))
+			for(var/part in parts_for_craft)
+				to_chat(user, span_warning(part))
+		else
+			to_chat(user, span_notice("You can craft a [initial(recipe_result.name)] with the parts installed."))
+			choose_options += list("Craft [initial(recipe_result.name)]" = image(icon = initial(recipe_result.icon), icon_state = initial(recipe_result.icon_state)))
+			option_results["Craft [initial(recipe_result.name)]"] = recipe_result
+	if(length(choose_options) == 0)
+		to_chat(user, span_warning("No recipes can be crafted with the parts installed."))
 		return
-	if(!InstalledBarrel)
-		to_chat(user, span_warning("\the [src] does not have a barrel!"))
+	var/picked_option = show_radial_menu(user, src, choose_options, radius = 38, require_near = TRUE)
+	if(!picked_option)
 		return
-	*/
-/*
 	var/turf/T = get_turf(src)
-	var/obj/item/gun/newGun = new result(T, 0)
+	var/obj/item/gun/ballistic/pickedGun = option_results[picked_option]
+	var/obj/item/gun/newGun = new pickedGun(T, TRUE)
 	newGun.frame = src
 	src.forceMove(newGun)
-	return
-*/
-
-/obj/item/part/gun/frame/proc/can_be_installed()
 
 /obj/item/part/gun/frame/proc/get_part_types()
-	var/part_types = NONE
+	var/list/part_types = list()
 	part_types |= gun_part_type
 	for(var/obj/item/part/gun/part in installedParts)
 		part_types |= part.gun_part_type
@@ -226,26 +156,28 @@
 /obj/item/part/gun/frame/examine(user, distance)
 	. = ..()
 	if(.)
-		for (var/obj/item/part/gun/part in installedParts)
+		for(var/obj/item/part/gun/part in installedParts)
 			. += "<span class='notice'>[src] has \a [part] [icon2html(part, user)] installed.</span>"
 		for(var/datum/lathe_recipe/gun/recipe in filtered_recipes)
-			for(var/obj/part as anything in recipe.validParts)
-				. += "<span class='notice'>[src] could hold \a [initial(part.name)].</span>"
-		. += "<span class='notice'>[src] could hold \a [get_part_types()].</span>"
-
+			var/obj/recipe_result = recipe.result
+			var/list/parts_for_craft = list()
+			for(var/obj/item/part/gun/part as anything in recipe.validParts)
+				var/part_type = initial(part.gun_part_type)
+				var/list/installed_types = get_part_types()
+				if(!(part_type in installed_types))
+					parts_for_craft += "	\a [initial(part.name)]"
+			if(length(parts_for_craft) != 0)
+				. += "<span class='notice'>Parts needed for a [initial(recipe_result.name)]:</span>"
+				for(var/part in parts_for_craft)
+					. += part
+			else
+				. += "<span class='notice'>You can craft a [initial(recipe_result.name)] with the parts installed.</span>"
 /*
-		if(InstalledGrip)
-			. += "<span class='notice'>\the [src] has \a [InstalledGrip] installed.</span>"
-		else
-			. += "<span class='notice'>\the [src] does not have a grip installed.</span>"
-		if(InstalledMechanism)
-			. += "<span class='notice'>\the [src] has \a [InstalledMechanism] installed.</span>"
-		else
-			. += "<span class='notice'>\the [src] does not have a mechanism installed.</span>"
-		if(InstalledBarrel)
-			. += "<span class='notice'>\the [src] has \a [InstalledBarrel] installed.</span>"
-		else
-			. += "<span class='notice'>\the [src] does not have a barrel installed.</span>"
+		var/part_type_message = ""
+		for(var/part_type in get_part_types())
+			part_type_message += "\a [part_type], "
+		if(part_type_message)
+			. += "<span class='notice'>[src] has " + part_type_message + ".</span>"
 */
 
 /obj/item/part/gun/frame/winchester
@@ -253,8 +185,8 @@
 	icon_state = "frame_shotgun"
 	preinstalledParts = list(
 		/obj/item/part/gun/modular/grip/wood,
-		/obj/item/part/gun/modular/mechanism/shotgun,
-		/obj/item/part/gun/modular/barrel/shotgun
+		/obj/item/part/gun/modular/mechanism/rifle,
+		/obj/item/part/gun/modular/barrel/rifle
 		)
 
 /obj/item/part/gun/frame/winchester/mk1
@@ -264,8 +196,8 @@
 	name = "m1911 gun frame"
 	preinstalledParts = list(
 		/obj/item/part/gun/modular/grip/wood,
-		/obj/item/part/gun/modular/mechanism,
-		/obj/item/part/gun/modular/barrel
+		/obj/item/part/gun/modular/mechanism/pistol,
+		/obj/item/part/gun/modular/barrel/pistol
 		)
 
 /obj/item/part/gun/frame/commander
@@ -273,3 +205,9 @@
 
 /obj/item/part/gun/frame/boltaction
 	name = "bolt action gun frame"
+
+/obj/item/part/gun/frame/revolver
+
+/obj/item/part/gun/frame/tec9
+
+/obj/item/part/gun/frame/shotgun
diff --git a/code/modules/guncrafting/guncrafting.dm b/code/modules/guncrafting/guncrafting.dm
index db3ea57a8cc2..423fb6f1a28a 100644
--- a/code/modules/guncrafting/guncrafting.dm
+++ b/code/modules/guncrafting/guncrafting.dm
@@ -26,3 +26,26 @@
 	icon = 'icons/obj/guncrafting.dmi'
 	icon_state = "work_piece"
 	max_amount = 10
+
+/obj/item/storage/box/parts
+	name = "gunmakers box"
+	desc = "A set of tools and parts to assemble your first weapon"
+
+/obj/item/storage/box/parts/PopulateContents()
+	new /obj/item/tool/hammer(src)
+	new /obj/item/tool/file(src)
+	new /obj/item/tool/saw(src)
+	new /obj/item/part/gun/frame/winchester(src)
+	new /obj/item/part/gun/modular/grip/wood(src)
+	new /obj/item/part/gun/modular/mechanism/shotgun(src)
+	new /obj/item/part/gun/modular/barrel/shotgun(src)
+	new /obj/item/part/gun/frame/winchester(src)
+	new /obj/item/part/gun/modular/grip/wood(src)
+	new /obj/item/part/gun/modular/mechanism/shotgun(src)
+	new /obj/item/part/gun/modular/barrel/shotgun(src)
+	new /obj/item/part/gun/frame(src)
+	new /obj/item/part/gun/frame/m1911(src)
+	new /obj/item/part/gun/modular/grip/wood(src)
+	new /obj/item/part/gun/modular/mechanism(src)
+	new /obj/item/part/gun/modular/barrel(src)
+
diff --git a/code/modules/guncrafting/part.dm b/code/modules/guncrafting/part.dm
index 3c95f5a6390b..7fc06a6cec20 100644
--- a/code/modules/guncrafting/part.dm
+++ b/code/modules/guncrafting/part.dm
@@ -35,9 +35,15 @@
 
 /obj/item/part/gun/modular/mechanism/shotgun
 	name = "generic shotgun mechanism"
-	desc = "All the bits that makes the bullet go bang."
 	icon_state = "mechanism_shotgun"
 
+/obj/item/part/gun/modular/mechanism/rifle
+
+/obj/item/part/gun/modular/mechanism/revolver
+	name = "generic revolver mechanism"
+
+/obj/item/part/gun/modular/mechanism/pistol
+
 /obj/item/part/gun/modular/barrel
 	name = "generic barrel"
 	desc = "A gun barrel, which keeps the bullet going in the right direction."
@@ -48,3 +54,9 @@
 	name = "generic shotgun barrel"
 	desc = "A gun barrel, which keeps the bullet going in the right direction."
 	icon_state = "barrel_30"
+
+/obj/item/part/gun/modular/barrel/rifle
+
+/obj/item/part/gun/modular/barrel/revolver
+
+/obj/item/part/gun/modular/barrel/pistol
diff --git a/code/modules/guncrafting/recipe.dm b/code/modules/guncrafting/recipe.dm
index 5542082d5732..a1e1eb1d810e 100644
--- a/code/modules/guncrafting/recipe.dm
+++ b/code/modules/guncrafting/recipe.dm
@@ -33,8 +33,8 @@
 	validParts = list(
 		/obj/item/part/gun/frame/winchester,
 		/obj/item/part/gun/modular/grip/wood,
-		/obj/item/part/gun/modular/mechanism/shotgun,
-		/obj/item/part/gun/modular/barrel/shotgun
+		/obj/item/part/gun/modular/mechanism/rifle,
+		/obj/item/part/gun/modular/barrel/rifle
 		)
 
 /datum/lathe_recipe/gun/winchester/mk1
@@ -42,8 +42,8 @@
 	validParts = list(
 		/obj/item/part/gun/frame/winchester/mk1,
 		/obj/item/part/gun/modular/grip/wood,
-		/obj/item/part/gun/modular/mechanism/shotgun,
-		/obj/item/part/gun/modular/barrel/shotgun
+		/obj/item/part/gun/modular/mechanism/rifle,
+		/obj/item/part/gun/modular/barrel/rifle
 		)
 
 /datum/lathe_recipe/gun/m1911
@@ -51,26 +51,32 @@
 	validParts = list(
 		/obj/item/part/gun/frame/m1911,
 		/obj/item/part/gun/modular/grip/wood,
-		/obj/item/part/gun/modular/mechanism,
-		/obj/item/part/gun/modular/barrel
+		/obj/item/part/gun/modular/mechanism/pistol,
+		/obj/item/part/gun/modular/barrel/pistol
 		)
 
 /datum/lathe_recipe/gun/tec9
 	result = /obj/item/gun/ballistic/automatic/pistol/tec9
 	validParts = list(
-		/obj/item/part/gun/frame,
-		/obj/item/part/gun/modular/grip,
-		/obj/item/part/gun/modular/mechanism,
-		/obj/item/part/gun/modular/barrel
+		/obj/item/part/gun/frame/tec9,
+		/obj/item/part/gun/modular/grip/black,
+		/obj/item/part/gun/modular/mechanism/pistol,
+		/obj/item/part/gun/modular/barrel/pistol
 		)
 
 /datum/lathe_recipe/gun/boltaction
 	result	= /obj/item/gun/ballistic/rifle/boltaction
+	validParts = list(
+		/obj/item/part/gun/frame/boltaction,
+		/obj/item/part/gun/modular/grip/wood,
+		/obj/item/part/gun/modular/mechanism/rifle,
+		/obj/item/part/gun/modular/barrel/rifle
+		)
 
 /datum/lathe_recipe/gun/doublebarrel
 	result = /obj/item/gun/ballistic/shotgun/doublebarrel
 	validParts = list(
-		/obj/item/part/gun/frame/doublebarrel,
+		/obj/item/part/gun/frame/shotgun,
 		/obj/item/part/gun/modular/grip/wood,
 		/obj/item/part/gun/modular/mechanism/shotgun,
 		/obj/item/part/gun/modular/barrel/shotgun
@@ -79,43 +85,43 @@
 /datum/lathe_recipe/gun/derringer
 	result = /obj/item/gun/ballistic/derringer
 	validParts = list(
-		/obj/item/part/gun/frame/derringer,
+		/obj/item/part/gun/frame/revolver,
 		/obj/item/part/gun/modular/grip/wood,
-		/obj/item/part/gun/modular/mechanism,
-		/obj/item/part/gun/modular/barrel
+		/obj/item/part/gun/modular/mechanism/revolver,
+		/obj/item/part/gun/modular/barrel/revolver
 		)
 
 /datum/lathe_recipe/gun/srmrevolver
 	result = /obj/item/gun/ballistic/revolver/srm
 	validParts = list(
-		/obj/item/part/gun/frame/srmrevolver,
+		/obj/item/part/gun/frame/revolver,
 		/obj/item/part/gun/modular/grip/wood,
-		/obj/item/part/gun/modular/mechanism,
-		/obj/item/part/gun/modular/barrel
+		/obj/item/part/gun/modular/mechanism/revolver,
+		/obj/item/part/gun/modular/barrel/revolver
 		)
 
 /datum/lathe_recipe/gun/pepperbox
 	result = /obj/item/gun/ballistic/revolver/pepperbox
 	validParts = list(
-		/obj/item/part/gun/frame/pepperbox,
+		/obj/item/part/gun/frame/revolver,
 		/obj/item/part/gun/modular/grip/wood,
-		/obj/item/part/gun/modular/mechanism,
-		/obj/item/part/gun/modular/barrel
+		/obj/item/part/gun/modular/mechanism/revolver,
+		/obj/item/part/gun/modular/barrel/revolver
 		)
 
 /datum/lathe_recipe/gun/nagantrevolver
 	result = /obj/item/gun/ballistic/revolver/nagant
 	validParts = list(
-		/obj/item/part/gun/frame/nagantrevolver,
+		/obj/item/part/gun/frame,
 		/obj/item/part/gun/modular/grip/wood,
 		/obj/item/part/gun/modular/mechanism,
 		/obj/item/part/gun/modular/barrel
 		)
 
 /datum/lathe_recipe/gun/nagantrifle
-	result = /obj/item/gun/ballistic/rifle/boltaction/nagantrifle
+	result = /obj/item/gun/ballistic/rifle/boltaction
 	validParts = list(
-		/obj/item/part/gun/frame/nagantrifle,
+		/obj/item/part/gun/frame,
 		/obj/item/part/gun/modular/grip/wood,
 		/obj/item/part/gun/modular/mechanism,
 		/obj/item/part/gun/modular/barrel
diff --git a/code/modules/guncrafting/tools.dm b/code/modules/guncrafting/tools.dm
index 1a6805ce5234..6403005791ea 100644
--- a/code/modules/guncrafting/tools.dm
+++ b/code/modules/guncrafting/tools.dm
@@ -12,20 +12,3 @@
 	name = "saw"
 	icon = 'icons/obj/tools.dmi'
 	icon_state = "oldcutters_map"
-
-/obj/item/storage/box/parts
-	name = "gunmakers box"
-	desc = "A set of tools and parts to assemble your first weapon"
-
-/obj/item/storage/box/parts/PopulateContents()
-	new /obj/item/tool/hammer(src)
-	new /obj/item/tool/file(src)
-	new /obj/item/tool/saw(src)
-	new /obj/item/part/gun/frame/winchester(src)
-	new /obj/item/part/gun/modular/grip/wood(src)
-	new /obj/item/part/gun/modular/mechanism/shotgun(src)
-	new /obj/item/part/gun/modular/barrel/shotgun(src)
-	new /obj/item/part/gun/frame/winchester(src)
-	new /obj/item/part/gun/modular/grip/wood(src)
-	new /obj/item/part/gun/modular/mechanism/shotgun(src)
-	new /obj/item/part/gun/modular/barrel/shotgun(src)
diff --git a/code/modules/projectiles/boxes_magazines/_box_magazine.dm b/code/modules/projectiles/boxes_magazines/_box_magazine.dm
index c3989e7a4952..424906b8a71e 100644
--- a/code/modules/projectiles/boxes_magazines/_box_magazine.dm
+++ b/code/modules/projectiles/boxes_magazines/_box_magazine.dm
@@ -34,8 +34,10 @@
 	///cost of the materials in the magazine/box itself
 	var/list/base_cost
 
-/obj/item/ammo_box/Initialize()
+/obj/item/ammo_box/Initialize(mapload, should_start_empty)
 	. = ..()
+	if(should_start_empty)
+		start_empty = TRUE
 	if (!bullet_cost)
 		for (var/material in custom_materials)
 			var/material_amount = custom_materials[material]
diff --git a/code/modules/projectiles/guns/ballistic.dm b/code/modules/projectiles/guns/ballistic.dm
index a8e2a201c81a..92c7f22b2b43 100644
--- a/code/modules/projectiles/guns/ballistic.dm
+++ b/code/modules/projectiles/guns/ballistic.dm
@@ -93,14 +93,20 @@
 	///If we have the 'snowflake mechanic,' how long should it take to reload?
 	var/tactical_reload_delay  = 1 SECONDS
 
-/obj/item/gun/ballistic/Initialize()
+/obj/item/gun/ballistic/Initialize(mapload, dontspawnwithmag)
 	. = ..()
+	var/no_mag_ammo = FALSE
+	if(dontspawnwithmag)
+		spawnwithmagazine = FALSE
 	if (!spawnwithmagazine)
-		bolt_locked = TRUE
-		update_appearance()
-		return
+		if(internal_magazine)
+			no_mag_ammo = TRUE
+		else
+			bolt_locked = TRUE
+			update_appearance()
+			return
 	if (!magazine)
-		magazine = new mag_type(src)
+		magazine = new mag_type(src, no_mag_ammo)
 	chamber_round(TRUE)
 	update_appearance()
 
diff --git a/code/modules/projectiles/guns/ballistic/shotgun.dm b/code/modules/projectiles/guns/ballistic/shotgun.dm
index de8b923fb967..c4e6ea56f650 100644
--- a/code/modules/projectiles/guns/ballistic/shotgun.dm
+++ b/code/modules/projectiles/guns/ballistic/shotgun.dm
@@ -241,7 +241,6 @@
 	bolt_type = BOLT_TYPE_NO_BOLT
 	can_be_sawn_off  = TRUE
 	pb_knockback = 3 // it's a super shotgun!
-	manufacturer = MANUFACTURER_HUNTERSPRIDE
 
 /obj/item/gun/ballistic/shotgun/doublebarrel/AltClick(mob/user)
 	. = ..()
diff --git a/shiptest.dme b/shiptest.dme
index 73cd4f734c28..071758700aea 100644
--- a/shiptest.dme
+++ b/shiptest.dme
@@ -533,7 +533,6 @@
 #include "code\datums\components\wearertargeting.dm"
 #include "code\datums\components\wet_floor.dm"
 #include "code\datums\components\crafting\crafting.dm"
-#include "code\datums\components\crafting\guncrafting.dm"
 #include "code\datums\components\crafting\recipes.dm"
 #include "code\datums\components\crafting\tailoring.dm"
 #include "code\datums\components\fantasy\_fantasy.dm"
@@ -2163,6 +2162,7 @@
 #include "code\modules\games\kotahi.dm"
 #include "code\modules\games\tarot.dm"
 #include "code\modules\guncrafting\frame.dm"
+#include "code\modules\guncrafting\guncrafting.dm"
 #include "code\modules\guncrafting\lathe.dm"
 #include "code\modules\guncrafting\part.dm"
 #include "code\modules\guncrafting\recipe.dm"

From 3c9125def0f18004125b23fde6cdec0128324e53 Mon Sep 17 00:00:00 2001
From: FalloutFalcon <falloutfalconplays@gmail.com>
Date: Sun, 4 Feb 2024 17:16:03 -0600
Subject: [PATCH 41/89] much clearer

---
 code/modules/guncrafting/frame.dm             |  2 +-
 code/modules/guncrafting/lathe.dm             |  6 +++---
 .../boxes_magazines/_box_magazine.dm          |  4 ++--
 code/modules/projectiles/guns/ballistic.dm    | 20 +++++++------------
 4 files changed, 13 insertions(+), 19 deletions(-)

diff --git a/code/modules/guncrafting/frame.dm b/code/modules/guncrafting/frame.dm
index 94a113f72f94..5e50454febaf 100644
--- a/code/modules/guncrafting/frame.dm
+++ b/code/modules/guncrafting/frame.dm
@@ -142,7 +142,7 @@
 		return
 	var/turf/T = get_turf(src)
 	var/obj/item/gun/ballistic/pickedGun = option_results[picked_option]
-	var/obj/item/gun/newGun = new pickedGun(T, TRUE)
+	var/obj/item/gun/newGun = new pickedGun(T, FALSE, FALSE)
 	newGun.frame = src
 	src.forceMove(newGun)
 
diff --git a/code/modules/guncrafting/lathe.dm b/code/modules/guncrafting/lathe.dm
index 34819f7541b6..303f24b8d69d 100644
--- a/code/modules/guncrafting/lathe.dm
+++ b/code/modules/guncrafting/lathe.dm
@@ -102,7 +102,7 @@
 /obj/structure/lathe/proc/scrap_item(mob/user)
 	to_chat(user, "The [work_piece.name] is broken down into parts.")
 	playsound(src,'sound/items/welder.ogg',50,TRUE)
-	if(istype (work_piece, /obj/item/gun))
+	if(istype(work_piece, /obj/item/gun))
 		var/obj/item/gun/gun_work_piece = work_piece
 		var/obj/item/new_part = new /obj/item/part/gun
 		new_part.forceMove(drop_location())
@@ -121,10 +121,10 @@
 ///////////////
 
 /obj/structure/lathe/proc/fabricate_part(mob/living/carbon/human/user)
-	/*
 	if(istype (work_piece, /obj/item/gun))
 		var/obj/item/gun/gun_work_piece = work_piece
 		var/list/choose_options = list()
+		/*
 		if(gun_work_piece.frame.InstalledGrip)
 			choose_options += list("Grip" = image(icon ='icons/obj/crafts.dmi', icon_state = gun_work_piece.frame.InstalledGrip.icon_state))
 		if(gun_work_piece.frame.InstalledMechanism)
@@ -146,5 +146,5 @@
 				if("Frame")
 					part_to_build = new gun_work_piece.frame.type(src, TRUE)
 			part_to_build.forceMove(drop_location())
-	*/
+		*/
 	mode = FALSE
diff --git a/code/modules/projectiles/boxes_magazines/_box_magazine.dm b/code/modules/projectiles/boxes_magazines/_box_magazine.dm
index 424906b8a71e..38fc25c578a2 100644
--- a/code/modules/projectiles/boxes_magazines/_box_magazine.dm
+++ b/code/modules/projectiles/boxes_magazines/_box_magazine.dm
@@ -34,9 +34,9 @@
 	///cost of the materials in the magazine/box itself
 	var/list/base_cost
 
-/obj/item/ammo_box/Initialize(mapload, should_start_empty)
+/obj/item/ammo_box/Initialize(mapload, init_spawn_with_ammo = TRUE)
 	. = ..()
-	if(should_start_empty)
+	if(!init_spawn_with_ammo)
 		start_empty = TRUE
 	if (!bullet_cost)
 		for (var/material in custom_materials)
diff --git a/code/modules/projectiles/guns/ballistic.dm b/code/modules/projectiles/guns/ballistic.dm
index 92c7f22b2b43..da13be546a7f 100644
--- a/code/modules/projectiles/guns/ballistic.dm
+++ b/code/modules/projectiles/guns/ballistic.dm
@@ -93,21 +93,15 @@
 	///If we have the 'snowflake mechanic,' how long should it take to reload?
 	var/tactical_reload_delay  = 1 SECONDS
 
-/obj/item/gun/ballistic/Initialize(mapload, dontspawnwithmag)
+/obj/item/gun/ballistic/Initialize(mapload, init_spawn_with_mag = TRUE, init_spawn_with_ammo = TRUE)
 	. = ..()
-	var/no_mag_ammo = FALSE
-	if(dontspawnwithmag)
-		spawnwithmagazine = FALSE
-	if (!spawnwithmagazine)
-		if(internal_magazine)
-			no_mag_ammo = TRUE
-		else
-			bolt_locked = TRUE
-			update_appearance()
-			return
+	if ((!spawnwithmagazine || !init_spawn_with_mag) && !internal_magazine)
+		bolt_locked = TRUE
+		update_appearance()
+		return
 	if (!magazine)
-		magazine = new mag_type(src, no_mag_ammo)
-	chamber_round(TRUE)
+		magazine = new mag_type(src, init_spawn_with_ammo)
+	chamber_round()
 	update_appearance()
 
 /obj/item/gun/ballistic/update_icon_state()

From e81474225b324cdb58936123c72a6aa747ee002b Mon Sep 17 00:00:00 2001
From: FalloutFalcon <falloutfalconplays@gmail.com>
Date: Sun, 4 Feb 2024 18:26:33 -0600
Subject: [PATCH 42/89] oops all camelCase

---
 code/modules/guncrafting/frame.dm       | 40 ++++++++++++-------------
 code/modules/guncrafting/lathe.dm       | 33 ++++++++------------
 code/modules/guncrafting/recipe.dm      | 26 ++++++++--------
 code/modules/unit_tests/gun_crafting.dm |  6 ++--
 4 files changed, 48 insertions(+), 57 deletions(-)

diff --git a/code/modules/guncrafting/frame.dm b/code/modules/guncrafting/frame.dm
index 5e50454febaf..cf05f893bfff 100644
--- a/code/modules/guncrafting/frame.dm
+++ b/code/modules/guncrafting/frame.dm
@@ -2,8 +2,8 @@
 	name = "gun frame"
 	desc = "a generic gun frame."
 	icon_state = "frame_olivaw"
-	var/list/preinstalledParts = list()
-	var/list/installedParts = list()
+	var/list/preinstalled_parts = list()
+	var/list/installed_parts = list()
 	var/list/filtered_recipes = list()
 
 	gun_part_type = GUN_PART_FRAME
@@ -11,8 +11,8 @@
 
 /obj/item/part/gun/frame/Initialize()
 	. = ..()
-	for (var/partType in preinstalledParts)
-		installedParts += new partType(src)
+	for (var/part_type in preinstalled_parts)
+		installed_parts += new part_type(src)
 	get_current_recipes()
 	/*
 	var/spawn_with_preinstalled_parts = TRUE
@@ -43,7 +43,7 @@
 		"[user] removes [I] from [src].",
 		span_notice("You remove [I] from [src].")
 	)
-	installedParts -= I
+	installed_parts -= I
 	return TRUE
 
 /obj/item/part/gun/frame/proc/insert_item(obj/item/I, mob/living/user)
@@ -82,11 +82,11 @@
 
 /obj/item/part/gun/frame/proc/handle_part(obj/item/part/gun/I, mob/living/user)
 	for(var/datum/lathe_recipe/gun/recipe in filtered_recipes)
-		if(I.type in recipe.validParts)
+		if(I.type in recipe.valid_parts)
 			if(I.gun_part_type && !(I.gun_part_type in get_part_types()))
 				if(insert_item(I, user))
 					to_chat(user, span_notice("You have attached the part to \the [src]."))
-					installedParts += I
+					installed_parts += I
 					get_current_recipes()
 					return
 				else
@@ -108,10 +108,10 @@
 
 //Should return false if
 /obj/item/part/gun/frame/proc/is_recipe_valid(datum/lathe_recipe/gun/recipe)
-	if(!(src.type in recipe.validParts))
+	if(!(src.type in recipe.valid_parts))
 		return FALSE
-	for(var/obj/item/part/gun/installed_part in installedParts)
-		if(!(installed_part.type in recipe.validParts))
+	for(var/obj/item/part/gun/installed_part in installed_parts)
+		if(!(installed_part.type in recipe.valid_parts))
 			return FALSE
 	return TRUE
 
@@ -121,7 +121,7 @@
 	for(var/datum/lathe_recipe/gun/recipe in filtered_recipes)
 		var/obj/recipe_result = recipe.result
 		var/list/parts_for_craft = list()
-		for(var/obj/item/part/gun/part as anything in recipe.validParts)
+		for(var/obj/item/part/gun/part as anything in recipe.valid_parts)
 			var/part_type = initial(part.gun_part_type)
 			var/list/installed_types = get_part_types()
 			if(!(part_type in installed_types))
@@ -141,27 +141,27 @@
 	if(!picked_option)
 		return
 	var/turf/T = get_turf(src)
-	var/obj/item/gun/ballistic/pickedGun = option_results[picked_option]
-	var/obj/item/gun/newGun = new pickedGun(T, FALSE, FALSE)
-	newGun.frame = src
-	src.forceMove(newGun)
+	var/obj/item/gun/ballistic/picked_gun = option_results[picked_option]
+	var/obj/item/gun/new_gun = new picked_gun(T, FALSE, FALSE)
+	new_gun.frame = src
+	src.forceMove(new_gun)
 
 /obj/item/part/gun/frame/proc/get_part_types()
 	var/list/part_types = list()
 	part_types |= gun_part_type
-	for(var/obj/item/part/gun/part in installedParts)
+	for(var/obj/item/part/gun/part in installed_parts)
 		part_types |= part.gun_part_type
 	return part_types
 
 /obj/item/part/gun/frame/examine(user, distance)
 	. = ..()
 	if(.)
-		for(var/obj/item/part/gun/part in installedParts)
+		for(var/obj/item/part/gun/part in installed_parts)
 			. += "<span class='notice'>[src] has \a [part] [icon2html(part, user)] installed.</span>"
 		for(var/datum/lathe_recipe/gun/recipe in filtered_recipes)
 			var/obj/recipe_result = recipe.result
 			var/list/parts_for_craft = list()
-			for(var/obj/item/part/gun/part as anything in recipe.validParts)
+			for(var/obj/item/part/gun/part as anything in recipe.valid_parts)
 				var/part_type = initial(part.gun_part_type)
 				var/list/installed_types = get_part_types()
 				if(!(part_type in installed_types))
@@ -183,7 +183,7 @@
 /obj/item/part/gun/frame/winchester
 	name = "winchester gun frame"
 	icon_state = "frame_shotgun"
-	preinstalledParts = list(
+	preinstalled_parts = list(
 		/obj/item/part/gun/modular/grip/wood,
 		/obj/item/part/gun/modular/mechanism/rifle,
 		/obj/item/part/gun/modular/barrel/rifle
@@ -194,7 +194,7 @@
 
 /obj/item/part/gun/frame/m1911
 	name = "m1911 gun frame"
-	preinstalledParts = list(
+	preinstalled_parts = list(
 		/obj/item/part/gun/modular/grip/wood,
 		/obj/item/part/gun/modular/mechanism/pistol,
 		/obj/item/part/gun/modular/barrel/pistol
diff --git a/code/modules/guncrafting/lathe.dm b/code/modules/guncrafting/lathe.dm
index 303f24b8d69d..861b49c9ec0c 100644
--- a/code/modules/guncrafting/lathe.dm
+++ b/code/modules/guncrafting/lathe.dm
@@ -124,27 +124,18 @@
 	if(istype (work_piece, /obj/item/gun))
 		var/obj/item/gun/gun_work_piece = work_piece
 		var/list/choose_options = list()
-		/*
-		if(gun_work_piece.frame.InstalledGrip)
-			choose_options += list("Grip" = image(icon ='icons/obj/crafts.dmi', icon_state = gun_work_piece.frame.InstalledGrip.icon_state))
-		if(gun_work_piece.frame.InstalledMechanism)
-			choose_options += list("Mechanism" = image(icon ='icons/obj/crafts.dmi', icon_state = gun_work_piece.frame.InstalledMechanism.icon_state))
-		if(gun_work_piece.frame.InstalledBarrel)
-			choose_options += list("Barrel" = image(icon ='icons/obj/crafts.dmi', icon_state = gun_work_piece.frame.InstalledBarrel.icon_state))
+		var/list/option_results = list()
 		if(gun_work_piece.frame)
-			choose_options += list("Frame" = image(icon ='icons/obj/crafts.dmi', icon_state = gun_work_piece.frame.icon_state))
+			choose_options += list("Craft [gun_work_piece.frame.name]" = image(icon = gun_work_piece.frame.icon , icon_state = gun_work_piece.frame.icon_state))
+			option_results["Craft [gun_work_piece.frame.name]"] = gun_work_piece.frame.type
+			for(var/obj/item/part/gun/gun_part in gun_work_piece.frame.installed_parts)
+				choose_options += list("Craft [gun_part.name]" = image(icon = gun_part.icon, icon_state = gun_part.icon_state))
+				option_results["Craft [gun_part.name]"] = gun_part.type
 		var/choosen_part = show_radial_menu(user, src, choose_options, radius = 38, require_near = TRUE)
-		if(choosen_part)
-			var/obj/part_to_build
-			switch(choosen_part)
-				if("Grip")
-					part_to_build = new gun_work_piece.frame.InstalledGrip.type
-				if("Mechanism")
-					part_to_build = new gun_work_piece.frame.InstalledMechanism.type
-				if("Barrel")
-					part_to_build = new gun_work_piece.frame.InstalledBarrel.type
-				if("Frame")
-					part_to_build = new gun_work_piece.frame.type(src, TRUE)
-			part_to_build.forceMove(drop_location())
-		*/
+		if(!choosen_part)
+			return
+		var/turf/T = get_turf(src)
+		var/obj/item/part/gun/picked_part = option_results[choosen_part]
+		var/obj/item/part/gun/new_part = new picked_part(T)
+		new_part.forceMove(drop_location())
 	mode = FALSE
diff --git a/code/modules/guncrafting/recipe.dm b/code/modules/guncrafting/recipe.dm
index a1e1eb1d810e..1b1dfa7ed5a5 100644
--- a/code/modules/guncrafting/recipe.dm
+++ b/code/modules/guncrafting/recipe.dm
@@ -25,12 +25,12 @@
 	result = /obj/item/part/gun/modular/barrel/shotgun
 
 /datum/lathe_recipe/gun
-	var/list/validParts = list()
-	var/requiredPartTypes = ALL
+	var/list/valid_parts = list()
+	var/required_part_types = ALL
 
 /datum/lathe_recipe/gun/winchester
 	result = /obj/item/gun/ballistic/shotgun/winchester
-	validParts = list(
+	valid_parts = list(
 		/obj/item/part/gun/frame/winchester,
 		/obj/item/part/gun/modular/grip/wood,
 		/obj/item/part/gun/modular/mechanism/rifle,
@@ -39,7 +39,7 @@
 
 /datum/lathe_recipe/gun/winchester/mk1
 	result = /obj/item/gun/ballistic/shotgun/winchester/mk1
-	validParts = list(
+	valid_parts = list(
 		/obj/item/part/gun/frame/winchester/mk1,
 		/obj/item/part/gun/modular/grip/wood,
 		/obj/item/part/gun/modular/mechanism/rifle,
@@ -48,7 +48,7 @@
 
 /datum/lathe_recipe/gun/m1911
 	result = /obj/item/gun/ballistic/automatic/pistol/m1911
-	validParts = list(
+	valid_parts = list(
 		/obj/item/part/gun/frame/m1911,
 		/obj/item/part/gun/modular/grip/wood,
 		/obj/item/part/gun/modular/mechanism/pistol,
@@ -57,7 +57,7 @@
 
 /datum/lathe_recipe/gun/tec9
 	result = /obj/item/gun/ballistic/automatic/pistol/tec9
-	validParts = list(
+	valid_parts = list(
 		/obj/item/part/gun/frame/tec9,
 		/obj/item/part/gun/modular/grip/black,
 		/obj/item/part/gun/modular/mechanism/pistol,
@@ -66,7 +66,7 @@
 
 /datum/lathe_recipe/gun/boltaction
 	result	= /obj/item/gun/ballistic/rifle/boltaction
-	validParts = list(
+	valid_parts = list(
 		/obj/item/part/gun/frame/boltaction,
 		/obj/item/part/gun/modular/grip/wood,
 		/obj/item/part/gun/modular/mechanism/rifle,
@@ -75,7 +75,7 @@
 
 /datum/lathe_recipe/gun/doublebarrel
 	result = /obj/item/gun/ballistic/shotgun/doublebarrel
-	validParts = list(
+	valid_parts = list(
 		/obj/item/part/gun/frame/shotgun,
 		/obj/item/part/gun/modular/grip/wood,
 		/obj/item/part/gun/modular/mechanism/shotgun,
@@ -84,7 +84,7 @@
 
 /datum/lathe_recipe/gun/derringer
 	result = /obj/item/gun/ballistic/derringer
-	validParts = list(
+	valid_parts = list(
 		/obj/item/part/gun/frame/revolver,
 		/obj/item/part/gun/modular/grip/wood,
 		/obj/item/part/gun/modular/mechanism/revolver,
@@ -93,7 +93,7 @@
 
 /datum/lathe_recipe/gun/srmrevolver
 	result = /obj/item/gun/ballistic/revolver/srm
-	validParts = list(
+	valid_parts = list(
 		/obj/item/part/gun/frame/revolver,
 		/obj/item/part/gun/modular/grip/wood,
 		/obj/item/part/gun/modular/mechanism/revolver,
@@ -102,7 +102,7 @@
 
 /datum/lathe_recipe/gun/pepperbox
 	result = /obj/item/gun/ballistic/revolver/pepperbox
-	validParts = list(
+	valid_parts = list(
 		/obj/item/part/gun/frame/revolver,
 		/obj/item/part/gun/modular/grip/wood,
 		/obj/item/part/gun/modular/mechanism/revolver,
@@ -111,7 +111,7 @@
 
 /datum/lathe_recipe/gun/nagantrevolver
 	result = /obj/item/gun/ballistic/revolver/nagant
-	validParts = list(
+	valid_parts = list(
 		/obj/item/part/gun/frame,
 		/obj/item/part/gun/modular/grip/wood,
 		/obj/item/part/gun/modular/mechanism,
@@ -120,7 +120,7 @@
 
 /datum/lathe_recipe/gun/nagantrifle
 	result = /obj/item/gun/ballistic/rifle/boltaction
-	validParts = list(
+	valid_parts = list(
 		/obj/item/part/gun/frame,
 		/obj/item/part/gun/modular/grip/wood,
 		/obj/item/part/gun/modular/mechanism,
diff --git a/code/modules/unit_tests/gun_crafting.dm b/code/modules/unit_tests/gun_crafting.dm
index 0efba76beefa..672e3b68b142 100644
--- a/code/modules/unit_tests/gun_crafting.dm
+++ b/code/modules/unit_tests/gun_crafting.dm
@@ -3,10 +3,10 @@
 	var/mob/living/carbon/human/human = allocate(/mob/living/carbon/human)
 	for(var/frame_type in subtypesof(/obj/item/part/gun/frame))
 		var/obj/item/part/gun/frame/frame = new frame_type
-		var/list/frame_parts = frame.installedParts
-		for(var/obj/item/part/installedPart in frame.installedParts)
+		var/list/frame_parts = frame.installed_parts
+		for(var/obj/item/part/installedPart in frame.installed_parts)
 			frame.eject_item(installedPart, human)
 			frame.handle_part(installedPart, human)
-		TEST_ASSERT_EQUAL(frame_parts, frame.installedParts, "Frame parts to match there original contents. I assume frame parts were not reinstalled correctly.")
+		TEST_ASSERT_EQUAL(frame_parts, frame.installed_parts, "Frame parts to match there original contents. I assume frame parts were not reinstalled correctly.")
 
 

From 422ddb19c4eddc7d0501498b7dec6b4515cef134 Mon Sep 17 00:00:00 2001
From: fallcon <falloutfalconplays@gmail.com>
Date: Mon, 5 Feb 2024 09:54:10 -0600
Subject: [PATCH 43/89] see how this goes

---
 code/modules/unit_tests/gun_crafting.dm | 9 +++++++--
 1 file changed, 7 insertions(+), 2 deletions(-)

diff --git a/code/modules/unit_tests/gun_crafting.dm b/code/modules/unit_tests/gun_crafting.dm
index 672e3b68b142..ced2cdbc1bd4 100644
--- a/code/modules/unit_tests/gun_crafting.dm
+++ b/code/modules/unit_tests/gun_crafting.dm
@@ -1,5 +1,11 @@
 //Makes sure preinstalled frame parts can be removed an reinstalled
 /datum/unit_test/gun_crafting/Run()
+	var/list/guns = typesof(/obj/item/gun)
+	for(var/gunType in guns)
+		var/obj/item/gun/G = new gunType  // Create an instance of the gun
+		if(G.magazine)  // If the gun has a magazine
+			TEST_FAIL("Gun: [G.type], Magazine: [G.magazine.type], Caliber: [G.magazine.caliber]")
+/*
 	var/mob/living/carbon/human/human = allocate(/mob/living/carbon/human)
 	for(var/frame_type in subtypesof(/obj/item/part/gun/frame))
 		var/obj/item/part/gun/frame/frame = new frame_type
@@ -8,5 +14,4 @@
 			frame.eject_item(installedPart, human)
 			frame.handle_part(installedPart, human)
 		TEST_ASSERT_EQUAL(frame_parts, frame.installed_parts, "Frame parts to match there original contents. I assume frame parts were not reinstalled correctly.")
-
-
+*/

From 0ffb50f3aaf988a0cab769680ac53a155573979f Mon Sep 17 00:00:00 2001
From: fallcon <falloutfalconplays@gmail.com>
Date: Mon, 5 Feb 2024 09:59:49 -0600
Subject: [PATCH 44/89] ballistic

---
 code/modules/unit_tests/gun_crafting.dm | 6 +++---
 1 file changed, 3 insertions(+), 3 deletions(-)

diff --git a/code/modules/unit_tests/gun_crafting.dm b/code/modules/unit_tests/gun_crafting.dm
index ced2cdbc1bd4..eaf315fc3370 100644
--- a/code/modules/unit_tests/gun_crafting.dm
+++ b/code/modules/unit_tests/gun_crafting.dm
@@ -1,9 +1,9 @@
 //Makes sure preinstalled frame parts can be removed an reinstalled
 /datum/unit_test/gun_crafting/Run()
-	var/list/guns = typesof(/obj/item/gun)
+	var/list/guns = typesof(/obj/item/gun/ballistic)
 	for(var/gunType in guns)
-		var/obj/item/gun/G = new gunType  // Create an instance of the gun
-		if(G.magazine)  // If the gun has a magazine
+		var/obj/item/gun/ballistic/G = new gunType
+		if(G.magazine)
 			TEST_FAIL("Gun: [G.type], Magazine: [G.magazine.type], Caliber: [G.magazine.caliber]")
 /*
 	var/mob/living/carbon/human/human = allocate(/mob/living/carbon/human)

From e54f627cebcd8a44f7081df91b3474d11f4af111 Mon Sep 17 00:00:00 2001
From: fallcon <falloutfalconplays@gmail.com>
Date: Mon, 5 Feb 2024 10:39:15 -0600
Subject: [PATCH 45/89] cruft guns

---
 .../lavaland_surface_fuckedupandevilclub.dmm  |  4 +-
 .../game/objects/items/storage/uplink_kits.dm |  3 -
 code/modules/antagonists/cult/blood_magic.dm  | 14 +----
 code/modules/antagonists/cult/cult_items.dm   | 41 --------------
 .../antagonists/wizard/equipment/spellbook.dm | 12 ----
 code/modules/cargo/exports/lavaland.dm        |  1 -
 .../living/simple_animal/hostile/stickman.dm  |  2 -
 .../projectiles/ammunition/special/magic.dm   |  3 -
 .../boxes_magazines/internal/rifle.dm         |  7 ---
 .../projectiles/guns/ballistic/pistol.dm      | 24 --------
 .../projectiles/guns/ballistic/revolver.dm    | 24 --------
 .../projectiles/guns/ballistic/rifle.dm       | 56 -------------------
 .../research/designs/weapon_designs.dm        |  8 ---
 .../spells/spell_types/infinite_guns.dm       | 27 ---------
 code/modules/unit_tests/gun_crafting.dm       |  4 +-
 code/modules/uplink/uplink_items.dm           |  8 ---
 shiptest.dme                                  |  1 -
 17 files changed, 4 insertions(+), 235 deletions(-)
 delete mode 100644 code/modules/spells/spell_types/infinite_guns.dm

diff --git a/_maps/RandomRuins/LavaRuins/lavaland_surface_fuckedupandevilclub.dmm b/_maps/RandomRuins/LavaRuins/lavaland_surface_fuckedupandevilclub.dmm
index 98488b286f8d..f8ee293334ce 100644
--- a/_maps/RandomRuins/LavaRuins/lavaland_surface_fuckedupandevilclub.dmm
+++ b/_maps/RandomRuins/LavaRuins/lavaland_surface_fuckedupandevilclub.dmm
@@ -261,9 +261,7 @@
 /area/ruin/unpowered)
 "ro" = (
 /obj/structure/table/wood/poker,
-/obj/item/gun/ballistic/revolver/russian/soul{
-	name = "Nar'Siean revolver"
-	},
+/obj/item/gun/ballistic/revolver,
 /turf/open/floor/plasteel/cult,
 /area/ruin/unpowered)
 "ru" = (
diff --git a/code/game/objects/items/storage/uplink_kits.dm b/code/game/objects/items/storage/uplink_kits.dm
index 6b3658b523df..f767361415f1 100644
--- a/code/game/objects/items/storage/uplink_kits.dm
+++ b/code/game/objects/items/storage/uplink_kits.dm
@@ -526,9 +526,6 @@
 	for(var/i in 1 to 3)
 		new/obj/item/grenade/chem_grenade/ez_clean(src)
 
-/obj/item/storage/box/hug/reverse_revolver/PopulateContents()
-	new /obj/item/gun/ballistic/revolver/reverse(src)
-
 /obj/item/storage/box/syndie_kit/mimery/PopulateContents()
 	new /obj/item/book/granter/spell/mimery_blockade(src)
 	new /obj/item/book/granter/spell/mimery_guns(src)
diff --git a/code/modules/antagonists/cult/blood_magic.dm b/code/modules/antagonists/cult/blood_magic.dm
index 26f0bb1d81ea..6bfccc48524d 100644
--- a/code/modules/antagonists/cult/blood_magic.dm
+++ b/code/modules/antagonists/cult/blood_magic.dm
@@ -812,7 +812,7 @@
 
 /obj/item/melee/blood_magic/manipulator/attack_self(mob/living/user)
 	if(iscultist(user))
-		var/list/options = list("Blood Spear (150)", "Blood Bolt Barrage (300)", "Blood Beam (500)")
+		var/list/options = list("Blood Spear (150)", "Blood Beam (500)")
 		var/choice = input(user, "Choose a greater blood rite...", "Greater Blood Rites") as null|anything in options
 		if(!choice)
 			to_chat(user, "<span class='cultitalic'>You decide against conducting a greater blood rite.</span>")
@@ -835,18 +835,6 @@
 						user.visible_message(
 							"<span class='warning'>A [rite.name] appears at [user]'s feet!</span>", \
 							"<span class='cultitalic'>A [rite.name] materializes at your feet.</span>")
-			if("Blood Bolt Barrage (300)")
-				if(uses < BLOOD_BARRAGE_COST)
-					to_chat(user, "<span class='cultitalic'>You need [BLOOD_BARRAGE_COST] charges to perform this rite.</span>")
-				else
-					var/obj/rite = new /obj/item/gun/ballistic/rifle/boltaction/enchanted/arcane_barrage/blood()
-					uses -= BLOOD_BARRAGE_COST
-					qdel(src)
-					if(user.put_in_hands(rite))
-						to_chat(user, "<span class='cult'><b>Your hands glow with power!</b></span>")
-					else
-						to_chat(user, "<span class='cultitalic'>You need a free hand for this rite!</span>")
-						qdel(rite)
 			if("Blood Beam (500)")
 				if(uses < BLOOD_BEAM_COST)
 					to_chat(user, "<span class='cultitalic'>You need [BLOOD_BEAM_COST] charges to perform this rite.</span>")
diff --git a/code/modules/antagonists/cult/cult_items.dm b/code/modules/antagonists/cult/cult_items.dm
index b09b7d989758..6f2de1c0fdda 100644
--- a/code/modules/antagonists/cult/cult_items.dm
+++ b/code/modules/antagonists/cult/cult_items.dm
@@ -703,47 +703,6 @@
 			L.visible_message("<span class='warning'>An unseen force pulls the blood spear from [L]'s hands!</span>")
 		spear.throw_at(owner, 10, 2, owner)
 
-
-/obj/item/gun/ballistic/rifle/boltaction/enchanted/arcane_barrage/blood
-	name = "blood bolt barrage"
-	desc = "Blood for blood."
-	color = "#ff0000"
-	guns_left = 24
-	mag_type = /obj/item/ammo_box/magazine/internal/boltaction/enchanted/arcane_barrage/blood
-	fire_sound = 'sound/magic/wand_teleport.ogg'
-
-
-/obj/item/ammo_box/magazine/internal/boltaction/enchanted/arcane_barrage/blood
-	ammo_type = /obj/item/ammo_casing/magic/arcane_barrage/blood
-
-/obj/item/ammo_casing/magic/arcane_barrage/blood
-	projectile_type = /obj/projectile/magic/arcane_barrage/blood
-	firing_effect_type = /obj/effect/temp_visual/cult/sparks
-
-/obj/projectile/magic/arcane_barrage/blood
-	name = "blood bolt"
-	icon_state = "mini_leaper"
-	nondirectional_sprite = TRUE
-	damage_type = BRUTE
-	impact_effect_type = /obj/effect/temp_visual/dir_setting/bloodsplatter
-
-/obj/projectile/magic/arcane_barrage/blood/Bump(atom/target)
-	var/turf/T = get_turf(target)
-	playsound(T, 'sound/effects/splat.ogg', 50, TRUE)
-	if(iscultist(target))
-		if(ishuman(target))
-			var/mob/living/carbon/human/H = target
-			if(H.stat != DEAD)
-				H.reagents.add_reagent(/datum/reagent/fuel/unholywater, 4)
-		if(isshade(target) || isconstruct(target))
-			var/mob/living/simple_animal/M = target
-			if(M.health+5 < M.maxHealth)
-				M.adjustHealth(-5)
-		new /obj/effect/temp_visual/cult/sparks(T)
-		qdel(src)
-	else
-		..()
-
 /obj/item/blood_beam
 	name = "\improper magical aura"
 	desc = "Sinister looking aura that distorts the flow of reality around it."
diff --git a/code/modules/antagonists/wizard/equipment/spellbook.dm b/code/modules/antagonists/wizard/equipment/spellbook.dm
index 58e397a64d40..cf85a922dbb6 100644
--- a/code/modules/antagonists/wizard/equipment/spellbook.dm
+++ b/code/modules/antagonists/wizard/equipment/spellbook.dm
@@ -223,18 +223,6 @@
 	. = ..()
 	REMOVE_TRAIT(user, TRAIT_TESLA_SHOCKIMMUNE, "lightning_bolt_spell")
 
-/datum/spellbook_entry/infinite_guns
-	name = "Lesser Summon Guns"
-	spell_type = /obj/effect/proc_holder/spell/targeted/infinite_guns/gun
-	cost = 3
-	no_coexistance_typecache = /obj/effect/proc_holder/spell/targeted/infinite_guns/arcane_barrage
-
-/datum/spellbook_entry/arcane_barrage
-	name = "Arcane Barrage"
-	spell_type = /obj/effect/proc_holder/spell/targeted/infinite_guns/arcane_barrage
-	cost = 3
-	no_coexistance_typecache = /obj/effect/proc_holder/spell/targeted/infinite_guns/gun
-
 /datum/spellbook_entry/barnyard
 	name = "Barnyard Curse"
 	spell_type = /obj/effect/proc_holder/spell/pointed/barnyardcurse
diff --git a/code/modules/cargo/exports/lavaland.dm b/code/modules/cargo/exports/lavaland.dm
index b6920bb419bf..804f1fcb5e59 100644
--- a/code/modules/cargo/exports/lavaland.dm
+++ b/code/modules/cargo/exports/lavaland.dm
@@ -25,7 +25,6 @@
 						/obj/item/clothing/shoes/clown_shoes/banana_shoes,
 						/obj/item/gun/magic/staff/honk,
 						/obj/item/kitchen/knife/envy,
-						/obj/item/gun/ballistic/revolver/russian/soul,
 						/obj/item/veilrender/vealrender,
 						/obj/item/nullrod/scythe/talking/necro,
 						/obj/item/clothing/suit/armor/ascetic)
diff --git a/code/modules/mob/living/simple_animal/hostile/stickman.dm b/code/modules/mob/living/simple_animal/hostile/stickman.dm
index 1eb03b07650c..1f3f176c10ec 100644
--- a/code/modules/mob/living/simple_animal/hostile/stickman.dm
+++ b/code/modules/mob/living/simple_animal/hostile/stickman.dm
@@ -39,8 +39,6 @@
 	icon_living = "stickmanranged"
 	casingtype = /obj/item/ammo_casing/c45
 	projectilesound = 'sound/misc/bang.ogg'
-	loot = list(/obj/item/gun/ballistic/automatic/pistol/stickman)
-
 
 /mob/living/simple_animal/hostile/stickman/dog
 	name = "Angry Stick Dog"
diff --git a/code/modules/projectiles/ammunition/special/magic.dm b/code/modules/projectiles/ammunition/special/magic.dm
index e38df896bed1..4d9aae44329d 100644
--- a/code/modules/projectiles/ammunition/special/magic.dm
+++ b/code/modules/projectiles/ammunition/special/magic.dm
@@ -39,9 +39,6 @@
 /obj/item/ammo_casing/magic/spellblade
 	projectile_type = /obj/projectile/magic/spellblade
 
-/obj/item/ammo_casing/magic/arcane_barrage
-	projectile_type = /obj/projectile/magic/arcane_barrage
-
 /obj/item/ammo_casing/magic/honk
 	projectile_type = /obj/projectile/bullet/honker
 
diff --git a/code/modules/projectiles/boxes_magazines/internal/rifle.dm b/code/modules/projectiles/boxes_magazines/internal/rifle.dm
index b85b223c254b..e410fb94129d 100644
--- a/code/modules/projectiles/boxes_magazines/internal/rifle.dm
+++ b/code/modules/projectiles/boxes_magazines/internal/rifle.dm
@@ -6,13 +6,6 @@
 	max_ammo = 5
 	instant_load = TRUE
 
-/obj/item/ammo_box/magazine/internal/boltaction/enchanted
-	max_ammo = 1
-	ammo_type = /obj/item/ammo_casing/a762_54
-
-/obj/item/ammo_box/magazine/internal/boltaction/enchanted/arcane_barrage
-	ammo_type = /obj/item/ammo_casing/magic/arcane_barrage
-
 /obj/item/ammo_box/magazine/internal/boltaction/solgov
 	name = "SSG-669C internal magazine"
 	ammo_type = /obj/item/ammo_casing/caseless/a858
diff --git a/code/modules/projectiles/guns/ballistic/pistol.dm b/code/modules/projectiles/guns/ballistic/pistol.dm
index 97974ff341fb..0fe9c2c4855f 100644
--- a/code/modules/projectiles/guns/ballistic/pistol.dm
+++ b/code/modules/projectiles/guns/ballistic/pistol.dm
@@ -107,23 +107,6 @@
 	fire_delay = 2
 	actions_types = list(/datum/action/item_action/toggle_firemode)
 
-/obj/item/gun/ballistic/automatic/pistol/stickman
-	name = "flat gun"
-	desc = "A 2 dimensional gun.. what?"
-	icon_state = "flatgun"
-	manufacturer = MANUFACTURER_NONE
-
-/obj/item/gun/ballistic/automatic/pistol/stickman/pickup(mob/living/user)
-	SHOULD_CALL_PARENT(0)
-	to_chat(user, "<span class='notice'>As you try to pick up [src], it slips out of your grip..</span>")
-	if(prob(50))
-		to_chat(user, "<span class='notice'>..and vanishes from your vision! Where the hell did it go?</span>")
-		qdel(src)
-		user.update_icons()
-	else
-		to_chat(user, "<span class='notice'>..and falls into view. Whew, that was a close one.</span>")
-		user.dropItemToGround(src)
-
 /obj/item/gun/ballistic/automatic/pistol/commander
 	name = "\improper Commander"
 	desc = "A classic handgun in a tasteful black and stainless steel color scheme. An enamel Nanotrasen logo is set into the grips. Chambered in 9mm."
@@ -265,13 +248,6 @@
 	to_chat(user, "<span class='warning'>Theres no magazine to replace!</span>")
 	return
 
-/obj/item/gun/ballistic/automatic/pistol/disposable/pizza
-	name = "pizza disposable gun"
-	desc = "How horrible. Whoever you point at with this won't be very cheesed to meet you." //this is a warcrime against italians // IF YOU'RE GOING TO DO US DIRTY SPELL IT RIGHT
-	icon_state = "disposable_pizza"
-	random_icon = FALSE
-	custom_materials = list(/datum/material/pizza=2000)
-
 //not technically a pistol but whatever
 /obj/item/gun/ballistic/derringer
 	name = ".38 Derringer"
diff --git a/code/modules/projectiles/guns/ballistic/revolver.dm b/code/modules/projectiles/guns/ballistic/revolver.dm
index 454a790728d2..5799df8dd3b8 100644
--- a/code/modules/projectiles/guns/ballistic/revolver.dm
+++ b/code/modules/projectiles/guns/ballistic/revolver.dm
@@ -305,30 +305,6 @@
 	user.apply_damage(300, BRUTE, affecting)
 	user.visible_message("<span class='danger'>[user.name] fires [src] at [user.p_their()] head!</span>", "<span class='userdanger'>You fire [src] at your head!</span>", "<span class='hear'>You hear a gunshot!</span>")
 
-/obj/item/gun/ballistic/revolver/russian/soul
-	name = "cursed Russian revolver"
-	desc = "To play with this revolver requires wagering your very soul."
-
-/obj/item/gun/ballistic/revolver/russian/soul/shoot_self(mob/living/user)
-	..()
-	var/obj/item/soulstone/anybody/revolver/SS = new /obj/item/soulstone/anybody/revolver(get_turf(src))
-	if(!SS.transfer_soul("FORCE", user)) //Something went wrong
-		qdel(SS)
-		return
-	user.visible_message("<span class='danger'>[user.name]'s soul is captured by \the [src]!</span>", "<span class='userdanger'>You've lost the gamble! Your soul is forfeit!</span>")
-
-/obj/item/gun/ballistic/revolver/reverse //Fires directly at its user... unless the user is a clown, of course.
-	clumsy_check = 0
-
-/obj/item/gun/ballistic/revolver/reverse/can_trigger_gun(mob/living/user)
-	if((HAS_TRAIT(user, TRAIT_CLUMSY)) || (user.mind && user.mind.assigned_role == "Clown"))
-		return ..()
-	if(process_fire(user, user, FALSE, null, BODY_ZONE_HEAD))
-		user.visible_message("<span class='warning'>[user] somehow manages to shoot [user.p_them()]self in the face!</span>", "<span class='userdanger'>You somehow shoot yourself in the face! How the hell?!</span>")
-		user.emote("scream")
-		user.drop_all_held_items()
-		user.Paralyze(80)
-
 /obj/item/gun/ballistic/revolver/srm
 	name = "SRM Standard Issue .357 Revolver" //should have used the pepperbox...
 	desc = "A sturdy, powerful, and reliable revolver utilized by the Saint-Roumain Militia."
diff --git a/code/modules/projectiles/guns/ballistic/rifle.dm b/code/modules/projectiles/guns/ballistic/rifle.dm
index 6506edc4bb1d..b772b7803185 100644
--- a/code/modules/projectiles/guns/ballistic/rifle.dm
+++ b/code/modules/projectiles/guns/ballistic/rifle.dm
@@ -53,10 +53,6 @@
 	. = ..()
 	. += "The bolt is [bolt_locked ? "open" : "closed"]."
 
-///////////////////////
-// BOLT ACTION RIFLE //
-///////////////////////
-
 /obj/item/gun/ballistic/rifle/boltaction
 	name = "\improper Illestren Hunting Rifle"
 	desc = "One of Hunter's Pride most successful firearms. The bolt-action is popular among colonists, pirates, snipers, and countless more. Chambered in 7.62x54."
@@ -119,58 +115,6 @@
 
 	manufacturer = MANUFACTURER_HUNTERSPRIDE
 
-/obj/item/gun/ballistic/rifle/boltaction/enchanted
-	name = "enchanted bolt-action rifle"
-	desc = "Careful not to lose your head."
-	var/guns_left = 30
-	mag_type = /obj/item/ammo_box/magazine/internal/boltaction/enchanted
-	can_be_sawn_off = FALSE
-	manufacturer = MANUFACTURER_NONE
-
-/obj/item/gun/ballistic/rifle/boltaction/enchanted/arcane_barrage
-	name = "arcane barrage"
-	desc = "Pew Pew Pew."
-	fire_sound = 'sound/weapons/emitter.ogg'
-	pin = /obj/item/firing_pin/magic
-	icon = 'icons/obj/guns/projectile.dmi'
-	lefthand_file = 'icons/mob/inhands/weapons/guns_lefthand.dmi'
-	righthand_file = 'icons/mob/inhands/weapons/guns_righthand.dmi'
-	icon_state = "arcane_barrage"
-	item_state = "arcane_barrage"
-	slot_flags = null
-	can_bayonet = FALSE
-	item_flags = NEEDS_PERMIT | DROPDEL | ABSTRACT | NOBLUDGEON
-	flags_1 = NONE
-	trigger_guard = TRIGGER_GUARD_ALLOW_ALL
-
-	mag_type = /obj/item/ammo_box/magazine/internal/boltaction/enchanted/arcane_barrage
-
-/obj/item/gun/ballistic/rifle/boltaction/enchanted/dropped()
-	. = ..()
-	guns_left = 0
-
-/obj/item/gun/ballistic/rifle/boltaction/enchanted/proc/discard_gun(mob/living/user)
-	user.throw_item(pick(oview(7,get_turf(user))))
-
-/obj/item/gun/ballistic/rifle/boltaction/enchanted/arcane_barrage/discard_gun(mob/living/user)
-	qdel(src)
-
-/obj/item/gun/ballistic/rifle/boltaction/enchanted/attack_self()
-	return
-
-/obj/item/gun/ballistic/rifle/boltaction/enchanted/process_fire(atom/target, mob/living/user, message = TRUE, params = null, zone_override = "", bonus_spread = 0)
-	. = ..()
-	if(!.)
-		return
-	if(guns_left)
-		var/obj/item/gun/ballistic/rifle/boltaction/enchanted/gun = new type
-		gun.guns_left = guns_left - 1
-		discard_gun(user)
-		user.swap_hand()
-		user.put_in_hands(gun)
-	else
-		user.dropItemToGround(src, TRUE)
-
 /obj/item/gun/ballistic/rifle/boltaction/polymer
 	name = "polymer survivor rifle"
 	desc = "A bolt-action rifle made of scrap, desperation, and luck. Likely to shatter at any moment. Chambered in .300 Blackout."
diff --git a/code/modules/research/designs/weapon_designs.dm b/code/modules/research/designs/weapon_designs.dm
index 2ac4359e2bf8..b3252b9d86ca 100644
--- a/code/modules/research/designs/weapon_designs.dm
+++ b/code/modules/research/designs/weapon_designs.dm
@@ -679,14 +679,6 @@
 	build_path = /obj/item/gun/ballistic/automatic/pistol/disposable
 	category = list("Imported")
 
-/datum/design/pizza_disposable_gun
-	name = "Pizza Disposable Gun"
-	id = "disposable_pizza"
-	build_type = AUTOLATHE
-	materials = list(/datum/material/pizza = 4000)
-	build_path = /obj/item/gun/ballistic/automatic/pistol/disposable/pizza
-	category = list("Imported")
-
 //SRM Ballistics
 /datum/design/doublebarrel
 	name = "Double Barrel Shotgun"
diff --git a/code/modules/spells/spell_types/infinite_guns.dm b/code/modules/spells/spell_types/infinite_guns.dm
deleted file mode 100644
index d3361284814a..000000000000
--- a/code/modules/spells/spell_types/infinite_guns.dm
+++ /dev/null
@@ -1,27 +0,0 @@
-/obj/effect/proc_holder/spell/targeted/infinite_guns
-	name = "Lesser Summon Guns"
-	desc = "Why reload when you have infinite guns? Summons an unending stream of bolt action rifles that deal little damage, but will knock targets down. Requires both hands free to use. Learning this spell makes you unable to learn Arcane Barrage."
-	invocation_type = "none"
-	include_user = TRUE
-	range = -1
-
-	school = "conjuration"
-	charge_max = 750
-	clothes_req = TRUE
-	cooldown_min = 10 //Gun wizard
-	action_icon_state = "bolt_action"
-	var/summon_path = /obj/item/gun/ballistic/rifle/boltaction/enchanted
-
-/obj/effect/proc_holder/spell/targeted/infinite_guns/cast(list/targets, mob/user = usr)
-	for(var/mob/living/carbon/C in targets)
-		C.drop_all_held_items()
-		var/GUN = new summon_path
-		C.put_in_hands(GUN)
-
-/obj/effect/proc_holder/spell/targeted/infinite_guns/gun
-
-/obj/effect/proc_holder/spell/targeted/infinite_guns/arcane_barrage
-	name = "Arcane Barrage"
-	desc = "Fire a torrent of arcane energy at your foes with this (powerful) spell. Deals much more damage than Lesser Summon Guns, but won't knock targets down. Requires both hands free to use. Learning this spell makes you unable to learn Lesser Summon Gun."
-	action_icon_state = "arcane_barrage"
-	summon_path = /obj/item/gun/ballistic/rifle/boltaction/enchanted/arcane_barrage
diff --git a/code/modules/unit_tests/gun_crafting.dm b/code/modules/unit_tests/gun_crafting.dm
index eaf315fc3370..3dc74430681c 100644
--- a/code/modules/unit_tests/gun_crafting.dm
+++ b/code/modules/unit_tests/gun_crafting.dm
@@ -1,11 +1,12 @@
 //Makes sure preinstalled frame parts can be removed an reinstalled
 /datum/unit_test/gun_crafting/Run()
+/*
 	var/list/guns = typesof(/obj/item/gun/ballistic)
 	for(var/gunType in guns)
 		var/obj/item/gun/ballistic/G = new gunType
 		if(G.magazine)
 			TEST_FAIL("Gun: [G.type], Magazine: [G.magazine.type], Caliber: [G.magazine.caliber]")
-/*
+*/
 	var/mob/living/carbon/human/human = allocate(/mob/living/carbon/human)
 	for(var/frame_type in subtypesof(/obj/item/part/gun/frame))
 		var/obj/item/part/gun/frame/frame = new frame_type
@@ -14,4 +15,3 @@
 			frame.eject_item(installedPart, human)
 			frame.handle_part(installedPart, human)
 		TEST_ASSERT_EQUAL(frame_parts, frame.installed_parts, "Frame parts to match there original contents. I assume frame parts were not reinstalled correctly.")
-*/
diff --git a/code/modules/uplink/uplink_items.dm b/code/modules/uplink/uplink_items.dm
index 53b49ab30f0b..40b382faf358 100644
--- a/code/modules/uplink/uplink_items.dm
+++ b/code/modules/uplink/uplink_items.dm
@@ -1952,14 +1952,6 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item))
 	item = /obj/item/reverse_bear_trap
 	restricted_roles = list("Clown")
 
-/datum/uplink_item/role_restricted/reverse_revolver
-	name = "Reverse Revolver"
-	desc = "A revolver that always fires at its user. \"Accidentally\" drop your weapon, then watch as the greedy corporate pigs blow their own brains all over the wall. \
-	The revolver itself is actually real. Only clumsy people, and clowns, can fire it normally. Comes in a box of hugs. Honk."
-	cost = 14
-	item = /obj/item/storage/box/hug/reverse_revolver
-	restricted_roles = list("Clown")
-
 /datum/uplink_item/role_restricted/clownpin
 	name = "Ultra Hilarious Firing Pin"
 	desc = "A firing pin that, when inserted into a gun, makes that gun only usable by clowns and clumsy people and makes that gun honk whenever anyone tries to fire it."
diff --git a/shiptest.dme b/shiptest.dme
index f1c0517dbdd3..e4eb0b858cd7 100644
--- a/shiptest.dme
+++ b/shiptest.dme
@@ -3278,7 +3278,6 @@
 #include "code\modules\spells\spell_types\forcewall.dm"
 #include "code\modules\spells\spell_types\genetic.dm"
 #include "code\modules\spells\spell_types\godhand.dm"
-#include "code\modules\spells\spell_types\infinite_guns.dm"
 #include "code\modules\spells\spell_types\inflict_handler.dm"
 #include "code\modules\spells\spell_types\knock.dm"
 #include "code\modules\spells\spell_types\lichdom.dm"

From 30277b30f065dbb19c7f15427f5d43fcac3bad28 Mon Sep 17 00:00:00 2001
From: fallcon <falloutfalconplays@gmail.com>
Date: Mon, 5 Feb 2024 12:28:05 -0600
Subject: [PATCH 46/89] kills pins

---
 .../BeachRuins/beach_ancient_ruin.dmm         |   5 +-
 .../icemoon_surface_corporate_rejects.dmm     |   1 -
 .../RandomRuins/JungleRuins/jungle_demon.dmm  |   2 +-
 .../RockRuins/rockplanet_budgetcuts.dmm       |   3 -
 .../RockRuins/rockplanet_harmfactory.dmm      |   2 +-
 .../RandomRuins/SpaceRuins/provinggrounds.dmm |   2 +-
 .../SpaceRuins/singularity_lab.dmm            |   4 +-
 .../WasteRuins/wasteplanet_pandora.dmm        |   2 +-
 _maps/map_files/generic/CentCom.dmm           |   2 +-
 .../independent/independent_halftrack.dmm     |  12 +-
 .../shuttles/independent/independent_nemo.dmm |   1 -
 .../minutemen/minutemen_asclepius.dmm         |   1 -
 .../shuttles/minutemen/minutemen_cepheus.dmm  |   4 -
 .../shuttles/nanotrasen/nanotrasen_heron.dmm  |   6 +-
 _maps/shuttles/pirate/pirate_noderider.dmm    |   2 +-
 .../syndicate/syndicate_gorlex_komodo.dmm     |   4 +-
 .../syndicate/syndicate_luxembourg.dmm        |   2 +-
 code/game/gamemodes/clown_ops/clown_ops.dm    |   1 -
 code/game/objects/items/storage/boxes.dm      |  29 --
 .../game/objects/items/storage/uplink_kits.dm |  13 +-
 code/game/objects/structures/salvaging.dm     |   4 +-
 .../abductor/equipment/abduction_gear.dm      |  11 -
 .../awaymissions/mission_code/snowdin.dm      |   2 +-
 .../clothing/outfits/ert/nanotrasen_ert.dm    |   8 +-
 code/modules/clothing/outfits/standard.dm     |   2 +-
 code/modules/mining/abandoned_crates.dm       |   6 +-
 .../hostile/mining_mobs/hivelord.dm           |   2 +-
 code/modules/projectiles/gun.dm               |  71 ----
 .../projectiles/guns/ballistic/automatic.dm   |   1 -
 .../projectiles/guns/ballistic/launchers.dm   |   9 -
 .../projectiles/guns/ballistic/revolver.dm    |   1 -
 .../projectiles/guns/ballistic/rifle.dm       |   1 -
 .../projectiles/guns/ballistic/shotgun.dm     |   9 -
 .../modules/projectiles/guns/ballistic/smg.dm |  14 +-
 .../modules/projectiles/guns/ballistic/toy.dm |  25 +-
 .../projectiles/guns/energy/energy_gun.dm     |   3 -
 code/modules/projectiles/guns/energy/laser.dm |   6 -
 code/modules/projectiles/guns/energy/pulse.dm |  26 --
 .../projectiles/guns/energy/special.dm        |   5 -
 .../projectiles/guns/misc/beam_rifle.dm       |   1 -
 code/modules/projectiles/pins.dm              | 343 ------------------
 code/modules/vending/liberation.dm            |   2 +-
 code/modules/vending/liberation_toy.dm        |  10 +-
 code/modules/vending/security.dm              |   6 +-
 code/modules/vending/toys.dm                  |  10 +-
 shiptest.dme                                  |   1 -
 46 files changed, 53 insertions(+), 624 deletions(-)
 delete mode 100644 code/modules/projectiles/pins.dm

diff --git a/_maps/RandomRuins/BeachRuins/beach_ancient_ruin.dmm b/_maps/RandomRuins/BeachRuins/beach_ancient_ruin.dmm
index b67667e26c69..be52f6a67f46 100644
--- a/_maps/RandomRuins/BeachRuins/beach_ancient_ruin.dmm
+++ b/_maps/RandomRuins/BeachRuins/beach_ancient_ruin.dmm
@@ -374,11 +374,8 @@
 	},
 /obj/item/gun/energy/lasercannon{
 	pixel_y = 5;
-	pin = /obj/item/firing_pin
-	},
-/obj/item/gun/energy/lasercannon{
-	pin = /obj/item/firing_pin
 	},
+/obj/item/gun/energy/lasercannon,
 /obj/effect/turf_decal/industrial/hatch,
 /turf/open/floor/plasteel/mono,
 /area/ruin/beach/complex)
diff --git a/_maps/RandomRuins/IceRuins/icemoon_surface_corporate_rejects.dmm b/_maps/RandomRuins/IceRuins/icemoon_surface_corporate_rejects.dmm
index d518df47dc6e..e9e2fc7531a6 100644
--- a/_maps/RandomRuins/IceRuins/icemoon_surface_corporate_rejects.dmm
+++ b/_maps/RandomRuins/IceRuins/icemoon_surface_corporate_rejects.dmm
@@ -1327,7 +1327,6 @@
 "En" = (
 /obj/item/gun/ballistic/automatic/smg/proto,
 /obj/structure/rack,
-/obj/item/firing_pin,
 /turf/open/floor/vault,
 /area/ruin/unpowered/corprejectvault)
 "Er" = (
diff --git a/_maps/RandomRuins/JungleRuins/jungle_demon.dmm b/_maps/RandomRuins/JungleRuins/jungle_demon.dmm
index adbb037af38c..006770d3b37c 100644
--- a/_maps/RandomRuins/JungleRuins/jungle_demon.dmm
+++ b/_maps/RandomRuins/JungleRuins/jungle_demon.dmm
@@ -296,7 +296,7 @@
 /area/ruin/powered)
 "yM" = (
 /obj/structure/table/reinforced,
-/obj/item/gun/ballistic/shotgun/bulldog/unrestricted,
+/obj/item/gun/ballistic/shotgun/bulldog,
 /turf/open/floor/plasteel/dark,
 /area/ruin/powered)
 "AB" = (
diff --git a/_maps/RandomRuins/RockRuins/rockplanet_budgetcuts.dmm b/_maps/RandomRuins/RockRuins/rockplanet_budgetcuts.dmm
index 9cf2b5a40bae..7de5ce9c1b05 100644
--- a/_maps/RandomRuins/RockRuins/rockplanet_budgetcuts.dmm
+++ b/_maps/RandomRuins/RockRuins/rockplanet_budgetcuts.dmm
@@ -2602,9 +2602,6 @@
 /obj/structure/railing{
 	dir = 4
 	},
-/obj/item/firing_pin{
-	pixel_y = 6
-	},
 /turf/open/floor/plasteel,
 /area/ruin/powered)
 "Tl" = (
diff --git a/_maps/RandomRuins/RockRuins/rockplanet_harmfactory.dmm b/_maps/RandomRuins/RockRuins/rockplanet_harmfactory.dmm
index 9b5adb277fa8..48f7614da429 100644
--- a/_maps/RandomRuins/RockRuins/rockplanet_harmfactory.dmm
+++ b/_maps/RandomRuins/RockRuins/rockplanet_harmfactory.dmm
@@ -251,7 +251,7 @@
 /area/ruin/powered)
 "ga" = (
 /obj/structure/table/wood/reinforced,
-/obj/item/gun/ballistic/automatic/smg/c20r/toy/unrestricted/riot{
+/obj/item/gun/ballistic/automatic/smg/c20r/toy/riot{
 	pixel_x = 5;
 	pixel_y = 7
 	},
diff --git a/_maps/RandomRuins/SpaceRuins/provinggrounds.dmm b/_maps/RandomRuins/SpaceRuins/provinggrounds.dmm
index c43ba0812698..842385176784 100644
--- a/_maps/RandomRuins/SpaceRuins/provinggrounds.dmm
+++ b/_maps/RandomRuins/SpaceRuins/provinggrounds.dmm
@@ -1924,7 +1924,7 @@
 "XA" = (
 /obj/structure/rack,
 /obj/item/ammo_box/foambox/riot,
-/obj/item/gun/ballistic/automatic/toy/pistol/riot/unrestricted,
+/obj/item/gun/ballistic/automatic/toy/pistol/riot,
 /obj/structure/cable{
 	icon_state = "1-2"
 	},
diff --git a/_maps/RandomRuins/SpaceRuins/singularity_lab.dmm b/_maps/RandomRuins/SpaceRuins/singularity_lab.dmm
index 486cbbce85fd..3b39d4b1025d 100644
--- a/_maps/RandomRuins/SpaceRuins/singularity_lab.dmm
+++ b/_maps/RandomRuins/SpaceRuins/singularity_lab.dmm
@@ -9132,7 +9132,7 @@
 /obj/item/clothing/under/rank/rnd/scientist,
 /obj/item/clothing/shoes/sneakers/white,
 /obj/effect/gibspawner,
-/obj/item/gun/energy/lasercannon/unrestricted{
+/obj/item/gun/energy/lasercannon{
 	desc = "An advanced laser cannon, a laser etched inscription in the handle states 'NT-LS-1013'. The casing is made of a lightweight alloy.";
 	icon_state = "pulse";
 	name = "NT-LS-1013"
@@ -10940,7 +10940,7 @@
 "PZ" = (
 /obj/effect/turf_decal/box,
 /obj/machinery/light/directional/north,
-/obj/item/gun/energy/lasercannon/unrestricted{
+/obj/item/gun/energy/lasercannon{
 	desc = "An advanced laser cannon, a laser etched inscription in the handle states 'NT-LS-1013'. The casing is made of a lightweight alloy.";
 	icon_state = "pulse";
 	name = "NT-LS-1013"
diff --git a/_maps/RandomRuins/WasteRuins/wasteplanet_pandora.dmm b/_maps/RandomRuins/WasteRuins/wasteplanet_pandora.dmm
index 83249514118f..8a63378ced3c 100644
--- a/_maps/RandomRuins/WasteRuins/wasteplanet_pandora.dmm
+++ b/_maps/RandomRuins/WasteRuins/wasteplanet_pandora.dmm
@@ -798,7 +798,7 @@
 /turf/open/floor/wood/waste,
 /area/ruin/wasteplanet)
 "Fn" = (
-/obj/item/gun/ballistic/automatic/smg/proto/unrestricted{
+/obj/item/gun/ballistic/automatic/smg/proto{
 	pixel_y = -18
 	},
 /obj/item/ammo_casing/spent{
diff --git a/_maps/map_files/generic/CentCom.dmm b/_maps/map_files/generic/CentCom.dmm
index e2b1ff97158c..bb0626e5c681 100644
--- a/_maps/map_files/generic/CentCom.dmm
+++ b/_maps/map_files/generic/CentCom.dmm
@@ -5333,7 +5333,7 @@
 /turf/open/floor/plasteel,
 /area/centcom/control)
 "aUp" = (
-/obj/item/gun/energy/pulse/carbine/loyalpin,
+/obj/item/gun/energy/pulse/carbine,
 /obj/item/flashlight/seclite,
 /obj/structure/table/reinforced,
 /obj/machinery/airalarm/directional/south,
diff --git a/_maps/shuttles/independent/independent_halftrack.dmm b/_maps/shuttles/independent/independent_halftrack.dmm
index f82d26ffd66d..bddb6a328e74 100644
--- a/_maps/shuttles/independent/independent_halftrack.dmm
+++ b/_maps/shuttles/independent/independent_halftrack.dmm
@@ -218,8 +218,8 @@
 /area/ship/maintenance/port)
 "fT" = (
 /obj/structure/closet/secure_closet/security,
-/obj/item/gun/ballistic/shotgun/bulldog/unrestricted,
-/obj/item/gun/ballistic/shotgun/bulldog/unrestricted,
+/obj/item/gun/ballistic/shotgun/bulldog,
+/obj/item/gun/ballistic/shotgun/bulldog,
 /obj/item/gun/ballistic/automatic/hmg/l6_saw,
 /obj/item/gun/ballistic/automatic/hmg/l6_saw,
 /obj/item/ammo_box/magazine/m12g/slug,
@@ -1600,18 +1600,18 @@
 	pixel_x = 28;
 	name = "foam gun cabinet"
 	},
-/obj/item/gun/ballistic/automatic/toy/pistol/unrestricted,
-/obj/item/gun/ballistic/automatic/hmg/l6_saw/toy/unrestricted,
+/obj/item/gun/ballistic/automatic/toy/pistol,
+/obj/item/gun/ballistic/automatic/hmg/l6_saw/toy,
 /obj/item/ammo_box/magazine/toy/m762,
 /obj/item/ammo_box/magazine/toy/m762,
 /obj/item/ammo_box/magazine/toy/m762,
-/obj/item/gun/ballistic/automatic/smg/c20r/toy/unrestricted,
+/obj/item/gun/ballistic/automatic/smg/c20r/toy,
 /obj/item/ammo_box/magazine/toy/smg,
 /obj/item/ammo_box/magazine/toy/smg,
 /obj/item/ammo_box/magazine/toy/smg,
 /obj/item/ammo_box/foambox,
 /obj/item/ammo_box/foambox,
-/obj/item/gun/ballistic/shotgun/toy/unrestricted,
+/obj/item/gun/ballistic/shotgun/toy,
 /turf/open/floor/plasteel/dark,
 /area/ship/security/range)
 "Ob" = (
diff --git a/_maps/shuttles/independent/independent_nemo.dmm b/_maps/shuttles/independent/independent_nemo.dmm
index f693cbcbdc27..87a57d6041cd 100644
--- a/_maps/shuttles/independent/independent_nemo.dmm
+++ b/_maps/shuttles/independent/independent_nemo.dmm
@@ -2176,7 +2176,6 @@
 	pixel_x = -32;
 	req_access = list(30)
 	},
-/obj/item/firing_pin,
 /obj/item/kitchen/knife/hunting,
 /obj/item/gun/ballistic/shotgun/contender,
 /obj/item/ammo_box/a4570,
diff --git a/_maps/shuttles/minutemen/minutemen_asclepius.dmm b/_maps/shuttles/minutemen/minutemen_asclepius.dmm
index b2d763063f39..266c08c80661 100644
--- a/_maps/shuttles/minutemen/minutemen_asclepius.dmm
+++ b/_maps/shuttles/minutemen/minutemen_asclepius.dmm
@@ -10,7 +10,6 @@
 	dir = 8
 	},
 /obj/item/camera,
-/obj/item/firing_pin,
 /obj/item/folder/red,
 /obj/item/taperecorder,
 /turf/open/floor/carpet/red,
diff --git a/_maps/shuttles/minutemen/minutemen_cepheus.dmm b/_maps/shuttles/minutemen/minutemen_cepheus.dmm
index 9686aff53035..8337fd01738a 100644
--- a/_maps/shuttles/minutemen/minutemen_cepheus.dmm
+++ b/_maps/shuttles/minutemen/minutemen_cepheus.dmm
@@ -1411,10 +1411,6 @@
 	pixel_x = 8;
 	pixel_y = -22
 	},
-/obj/item/firing_pin{
-	pixel_x = 3;
-	pixel_y = -7
-	},
 /turf/open/floor/plasteel/tech,
 /area/ship/security)
 "qk" = (
diff --git a/_maps/shuttles/nanotrasen/nanotrasen_heron.dmm b/_maps/shuttles/nanotrasen/nanotrasen_heron.dmm
index 669e1df22ab8..d93acd364776 100644
--- a/_maps/shuttles/nanotrasen/nanotrasen_heron.dmm
+++ b/_maps/shuttles/nanotrasen/nanotrasen_heron.dmm
@@ -3383,13 +3383,13 @@
 "mt" = (
 /obj/structure/window/reinforced/spawner,
 /obj/structure/rack,
-/obj/item/gun/ballistic/automatic/smg/proto/unrestricted{
+/obj/item/gun/ballistic/automatic/smg/proto{
 	pixel_y = 3
 	},
-/obj/item/gun/ballistic/automatic/smg/proto/unrestricted{
+/obj/item/gun/ballistic/automatic/smg/proto{
 	pixel_y = -2
 	},
-/obj/item/gun/ballistic/automatic/smg/proto/unrestricted{
+/obj/item/gun/ballistic/automatic/smg/proto{
 	pixel_y = -7
 	},
 /turf/open/floor/plasteel/tech,
diff --git a/_maps/shuttles/pirate/pirate_noderider.dmm b/_maps/shuttles/pirate/pirate_noderider.dmm
index e9a28b74cfde..c10e072892df 100644
--- a/_maps/shuttles/pirate/pirate_noderider.dmm
+++ b/_maps/shuttles/pirate/pirate_noderider.dmm
@@ -1037,7 +1037,7 @@
 /obj/item/gun/energy/laser/iot,
 /obj/item/gun/energy/laser/iot,
 /obj/item/gun/energy/e_gun/smg,
-/obj/item/gun/energy/lasercannon/unrestricted,
+/obj/item/gun/energy/lasercannon,
 /obj/item/melee/baton/loaded,
 /obj/item/melee/baton/loaded,
 /turf/open/floor/plasteel/tech,
diff --git a/_maps/shuttles/syndicate/syndicate_gorlex_komodo.dmm b/_maps/shuttles/syndicate/syndicate_gorlex_komodo.dmm
index 3da232da75dc..68ee81cb02f2 100644
--- a/_maps/shuttles/syndicate/syndicate_gorlex_komodo.dmm
+++ b/_maps/shuttles/syndicate/syndicate_gorlex_komodo.dmm
@@ -981,8 +981,8 @@
 /obj/structure/railing{
 	dir = 4
 	},
-/obj/item/gun/ballistic/automatic/smg/c20r/unrestricted,
-/obj/item/gun/ballistic/shotgun/bulldog/unrestricted,
+/obj/item/gun/ballistic/automatic/smg/c20r,
+/obj/item/gun/ballistic/shotgun/bulldog,
 /turf/open/floor/pod/dark,
 /area/ship/security/armory)
 "jh" = (
diff --git a/_maps/shuttles/syndicate/syndicate_luxembourg.dmm b/_maps/shuttles/syndicate/syndicate_luxembourg.dmm
index 6dde77123cba..cff4c84386e0 100644
--- a/_maps/shuttles/syndicate/syndicate_luxembourg.dmm
+++ b/_maps/shuttles/syndicate/syndicate_luxembourg.dmm
@@ -831,7 +831,7 @@
 /obj/structure/closet/crate/wooden/toy,
 /obj/item/ammo_box/magazine/toy/smgm45/riot,
 /obj/item/ammo_box/magazine/toy/smgm45/riot,
-/obj/item/gun/ballistic/automatic/smg/c20r/toy/unrestricted/riot,
+/obj/item/gun/ballistic/automatic/smg/c20r/toy/riot,
 /obj/item/soap/syndie,
 /obj/item/soap/syndie,
 /obj/item/soap/syndie,
diff --git a/code/game/gamemodes/clown_ops/clown_ops.dm b/code/game/gamemodes/clown_ops/clown_ops.dm
index 5017b1d38c06..23500e032ee5 100644
--- a/code/game/gamemodes/clown_ops/clown_ops.dm
+++ b/code/game/gamemodes/clown_ops/clown_ops.dm
@@ -40,7 +40,6 @@
 	backpack_contents = list(/obj/item/storage/box/survival/syndie=1,\
 		/obj/item/kitchen/knife/combat/survival,
 		/obj/item/dnainjector/clumsymut, //in case you want to be clumsy for the memes
-		/obj/item/storage/box/syndie_kit/clownpins, //for any guns that you get your grubby little clown op mitts on
 		/obj/item/reagent_containers/spray/waterflower/lube)
 	implants = list(/obj/item/implant/sad_trombone)
 
diff --git a/code/game/objects/items/storage/boxes.dm b/code/game/objects/items/storage/boxes.dm
index 7b1710cd8960..7ac8e822eeaf 100644
--- a/code/game/objects/items/storage/boxes.dm
+++ b/code/game/objects/items/storage/boxes.dm
@@ -607,35 +607,6 @@
 	for(var/i in 1 to 6)
 		new /obj/item/cartridge/security(src)
 
-/obj/item/storage/box/firingpins
-	name = "box of standard firing pins"
-	desc = "A box full of standard firing pins, to allow newly-developed firearms to operate."
-	icon_state = "secbox"
-	illustration = "firingpin"
-
-/obj/item/storage/box/firingpins/PopulateContents()
-	for(var/i in 1 to 5)
-		new /obj/item/firing_pin(src)
-
-/obj/item/storage/box/firingpins/paywall
-	name = "box of paywall firing pins"
-	desc = "A box full of paywall firing pins, to allow newly-developed firearms to operate behind a custom-set paywall."
-	illustration = "firingpin"
-
-/obj/item/storage/box/firingpins/paywall/PopulateContents()
-	for(var/i in 1 to 5)
-		new /obj/item/firing_pin/paywall(src)
-
-/obj/item/storage/box/lasertagpins
-	name = "box of laser tag firing pins"
-	desc = "A box full of laser tag firing pins, to allow newly-developed firearms to require wearing brightly coloured plastic armor before being able to be used."
-	illustration = "firingpin"
-
-/obj/item/storage/box/lasertagpins/PopulateContents()
-	for(var/i in 1 to 3)
-		new /obj/item/firing_pin/tag/red(src)
-		new /obj/item/firing_pin/tag/blue(src)
-
 /obj/item/storage/box/handcuffs
 	name = "box of spare handcuffs"
 	desc = "A box full of handcuffs."
diff --git a/code/game/objects/items/storage/uplink_kits.dm b/code/game/objects/items/storage/uplink_kits.dm
index 6b3658b523df..cc070ba21d5c 100644
--- a/code/game/objects/items/storage/uplink_kits.dm
+++ b/code/game/objects/items/storage/uplink_kits.dm
@@ -108,7 +108,7 @@
 
 		if("metaops")
 			new /obj/item/clothing/suit/space/hardsuit/syndi(src) // 8 tc
-			new /obj/item/gun/ballistic/shotgun/bulldog/unrestricted(src) // 8 tc
+			new /obj/item/gun/ballistic/shotgun/bulldog(src) // 8 tc
 			new /obj/item/implanter/explosive(src) // 2 tc
 			new /obj/item/ammo_box/magazine/m12g(src) // 2 tc
 			new /obj/item/ammo_box/magazine/m12g(src) // 2 tc
@@ -165,7 +165,7 @@
 			new /obj/item/assembly/signaler(src) // 0 tc
 			new /obj/item/storage/toolbox/syndicate(src) // 1 tc
 			new /obj/item/pen/edagger(src)
-			new /obj/item/gun/energy/decloner/unrestricted(src)
+			new /obj/item/gun/energy/decloner(src)
 
 		if("bee")
 			new /obj/item/paper/fluff/bee_objectives(src) // 0 tc (motivation)
@@ -306,7 +306,7 @@
 		/obj/item/storage/box/syndie_kit/imp_radio,
 		/obj/item/storage/box/syndie_kit/imp_uplink,
 		/obj/item/clothing/gloves/krav_maga/combatglovesplus,
-		/obj/item/gun/ballistic/automatic/smg/c20r/toy/unrestricted/riot,
+		/obj/item/gun/ballistic/automatic/smg/c20r/toy/riot,
 		/obj/item/reagent_containers/hypospray/medipen/stimulants,
 		/obj/item/storage/box/syndie_kit/imp_freedom,
 		/obj/item/toy/eightball/haunted
@@ -370,13 +370,6 @@
 	for(var/i in 1 to 7)
 		new /obj/item/reagent_containers/syringe/bioterror(src)
 
-/obj/item/storage/box/syndie_kit/clownpins
-	name = "ultra hilarious firing pin box"
-
-/obj/item/storage/box/syndie_kit/clownpins/PopulateContents()
-	for(var/i in 1 to 7)
-		new /obj/item/firing_pin/clown/ultra(src)
-
 /obj/item/storage/box/syndie_kit/imp_adrenal
 	name = "adrenal implant box"
 
diff --git a/code/game/objects/structures/salvaging.dm b/code/game/objects/structures/salvaging.dm
index 3d90a25a1013..1a2cdcba9925 100644
--- a/code/game/objects/structures/salvaging.dm
+++ b/code/game/objects/structures/salvaging.dm
@@ -584,8 +584,8 @@
 		)
 /obj/effect/spawner/lootdrop/random_gun_protolathe_lootdrop
 	loot = list(
-			/obj/item/gun/energy/lasercannon/unrestricted = 1,
-			/obj/item/gun/ballistic/automatic/smg/proto/unrestricted = 1,
+			/obj/item/gun/energy/lasercannon = 1,
+			/obj/item/gun/ballistic/automatic/smg/proto = 1,
 			/obj/item/gun/energy/temperature/security = 1,
 		)
 /obj/effect/spawner/lootdrop/random_ammo_protolathe_lootdrop
diff --git a/code/modules/antagonists/abductor/equipment/abduction_gear.dm b/code/modules/antagonists/abductor/equipment/abduction_gear.dm
index 9a5b95d21184..5efddfb3cf8c 100644
--- a/code/modules/antagonists/abductor/equipment/abduction_gear.dm
+++ b/code/modules/antagonists/abductor/equipment/abduction_gear.dm
@@ -369,21 +369,10 @@
 		to_chat(user, "<span class='notice'>You send the message to your target.</span>")
 		log_directed_talk(user, L, message, LOG_SAY, "abductor whisper")
 
-
-/obj/item/firing_pin/abductor
-	name = "alien firing pin"
-	icon_state = "firing_pin_ayy"
-	desc = "This firing pin is slimy and warm; you can swear you feel it constantly trying to mentally probe you."
-	fail_message = "<span class='abductor'>Firing error, please contact Command.</span>"
-
-/obj/item/firing_pin/abductor/pin_auth(mob/living/user)
-	. = isabductor(user)
-
 /obj/item/gun/energy/alien
 	name = "alien pistol"
 	desc = "A complicated gun that fires bursts of high-intensity radiation."
 	ammo_type = list(/obj/item/ammo_casing/energy/declone)
-	pin = /obj/item/firing_pin/abductor
 	icon_state = "alienpistol"
 	item_state = "alienpistol"
 	trigger_guard = TRIGGER_GUARD_ALLOW_ALL
diff --git a/code/modules/awaymissions/mission_code/snowdin.dm b/code/modules/awaymissions/mission_code/snowdin.dm
index f5cfc93c6eee..c8214de7c65f 100644
--- a/code/modules/awaymissions/mission_code/snowdin.dm
+++ b/code/modules/awaymissions/mission_code/snowdin.dm
@@ -513,7 +513,7 @@
 				/obj/item/organ/brain/alien = 17,
 				/obj/item/dualsaber = 15,
 				/obj/item/organ/heart/demon = 7,
-				/obj/item/gun/ballistic/automatic/smg/c20r/unrestricted = 16,
+				/obj/item/gun/ballistic/automatic/smg/c20r = 16,
 				/obj/item/gun/magic/wand/resurrection/inert = 15,
 				/obj/item/gun/magic/wand/resurrection = 10,
 				/obj/item/uplink/old = 2,
diff --git a/code/modules/clothing/outfits/ert/nanotrasen_ert.dm b/code/modules/clothing/outfits/ert/nanotrasen_ert.dm
index 2d397b8de828..6864bd6677eb 100644
--- a/code/modules/clothing/outfits/ert/nanotrasen_ert.dm
+++ b/code/modules/clothing/outfits/ert/nanotrasen_ert.dm
@@ -47,7 +47,7 @@
 	glasses = /obj/item/clothing/glasses/thermal/eyepatch
 	backpack_contents = list(/obj/item/storage/box/survival/engineer=1,\
 		/obj/item/melee/baton/loaded=1,\
-		/obj/item/gun/energy/pulse/pistol/loyalpin=1)
+		/obj/item/gun/energy/pulse/pistol=1)
 	l_pocket = /obj/item/melee/transforming/energy/sword/saber
 
 /datum/outfit/centcom/ert/security
@@ -77,7 +77,7 @@
 /datum/outfit/centcom/ert/security/alert
 	name = "ERT Security - High Alert"
 
-	suit_store = /obj/item/gun/energy/pulse/carbine/loyalpin
+	suit_store = /obj/item/gun/energy/pulse/carbine
 	mask = /obj/item/clothing/mask/gas/sechailer/swat
 	backpack_contents = list(/obj/item/storage/box/survival/engineer=1,\
 		/obj/item/storage/box/handcuffs=1,\
@@ -114,7 +114,7 @@
 	mask = /obj/item/clothing/mask/gas/sechailer/swat
 	backpack_contents = list(/obj/item/storage/box/survival/engineer=1,\
 		/obj/item/melee/baton/loaded=1,\
-		/obj/item/gun/energy/pulse/pistol/loyalpin=1,\
+		/obj/item/gun/energy/pulse/pistol=1,\
 		/obj/item/reagent_containers/hypospray/combat/nanites=1,\
 		/obj/item/gun/medbeam=1)
 
@@ -150,7 +150,7 @@
 	mask = /obj/item/clothing/mask/gas/sechailer/swat
 	backpack_contents = list(/obj/item/storage/box/survival/engineer=1,\
 		/obj/item/melee/baton/loaded=1,\
-		/obj/item/gun/energy/pulse/pistol/loyalpin=1,\
+		/obj/item/gun/energy/pulse/pistol=1,\
 		/obj/item/construction/rcd/combat=1)
 
 // official
diff --git a/code/modules/clothing/outfits/standard.dm b/code/modules/clothing/outfits/standard.dm
index 72127bbaf7df..55587dedac5b 100644
--- a/code/modules/clothing/outfits/standard.dm
+++ b/code/modules/clothing/outfits/standard.dm
@@ -162,7 +162,7 @@
 	r_pocket = /obj/item/shield/energy
 	suit_store = /obj/item/tank/internals/emergency_oxygen/double
 	belt = /obj/item/gun/ballistic/revolver/mateba
-	r_hand = /obj/item/gun/energy/pulse/loyalpin
+	r_hand = /obj/item/gun/energy/pulse
 	id = /obj/item/card/id/ert/deathsquad
 	ears = /obj/item/radio/headset/headset_cent/alt
 
diff --git a/code/modules/mining/abandoned_crates.dm b/code/modules/mining/abandoned_crates.dm
index 140b87c1707f..b6058b596444 100644
--- a/code/modules/mining/abandoned_crates.dm
+++ b/code/modules/mining/abandoned_crates.dm
@@ -229,9 +229,9 @@
 			for(var/i in 1 to 4)
 				new /obj/item/clothing/mask/balaclava(src)
 			new /obj/item/gun/ballistic/shotgun/toy(src)
-			new /obj/item/gun/ballistic/automatic/toy/pistol/unrestricted(src)
-			new /obj/item/gun/ballistic/automatic/toy/unrestricted(src)
-			new /obj/item/gun/ballistic/automatic/hmg/l6_saw/toy/unrestricted(src)
+			new /obj/item/gun/ballistic/automatic/toy/pistol(src)
+			new /obj/item/gun/ballistic/automatic/toy(src)
+			new /obj/item/gun/ballistic/automatic/hmg/l6_saw/toy(src)
 			new /obj/item/ammo_box/foambox(src)
 		if(98)
 			for(var/i in 1 to 3)
diff --git a/code/modules/mob/living/simple_animal/hostile/mining_mobs/hivelord.dm b/code/modules/mob/living/simple_animal/hostile/mining_mobs/hivelord.dm
index 474c9c5d9ca6..bea421014108 100644
--- a/code/modules/mob/living/simple_animal/hostile/mining_mobs/hivelord.dm
+++ b/code/modules/mob/living/simple_animal/hostile/mining_mobs/hivelord.dm
@@ -744,7 +744,7 @@
 			else
 				back = pickweight(list(
 					/obj/item/energyhalberd = 5,
-					/obj/item/gun/ballistic/rocketlauncher/unrestricted = 5
+					/obj/item/gun/ballistic/rocketlauncher = 5
 					)
 				)
 			if(prob(25))
diff --git a/code/modules/projectiles/gun.dm b/code/modules/projectiles/gun.dm
index b64e76d1f075..4402a88ead17 100644
--- a/code/modules/projectiles/gun.dm
+++ b/code/modules/projectiles/gun.dm
@@ -1,6 +1,5 @@
 
 #define DUALWIELD_PENALTY_EXTRA_MULTIPLIER 1.6
-#define FIRING_PIN_REMOVAL_DELAY 50
 
 #define MANUFACTURER_NONE null
 #define MANUFACTURER_SHARPLITE "the Sharplite Defense logo"
@@ -49,7 +48,6 @@
 	var/suppressed_sound = 'sound/weapons/gun/general/heavy_shot_suppressed.ogg'
 	var/suppressed_volume = 60
 	var/can_unsuppress = TRUE
-	var/clumsy_check = TRUE
 	var/obj/item/ammo_casing/chambered = null
 	trigger_guard = TRIGGER_GUARD_NORMAL	//trigger guard on the weapon, hulks can't fire them with their big meaty fingers
 	var/sawn_desc = null					//description change if weapon is sawn-off
@@ -68,7 +66,6 @@
 	righthand_file = 'icons/mob/inhands/weapons/guns_righthand.dmi'
 
 	var/list/attachment_options = list()	//This.. works for now.. gun refactor soon
-	var/obj/item/firing_pin/pin = /obj/item/firing_pin //standard firing pin for most guns
 
 	var/can_flashlight = FALSE //if a flashlight can be added or removed if it already has one.
 	var/obj/item/flashlight/seclite/gun_light
@@ -138,8 +135,6 @@
 	. = ..()
 	RegisterSignal(src, COMSIG_TWOHANDED_WIELD, PROC_REF(on_wield))
 	RegisterSignal(src, COMSIG_TWOHANDED_UNWIELD, PROC_REF(on_unwield))
-	if(pin)
-		pin = new pin(src)
 	if(gun_light)
 		alight = new(src)
 	muzzle_flash = new(src, muzzleflash_iconstate)
@@ -173,8 +168,6 @@
 	user.remove_movespeed_modifier(/datum/movespeed_modifier/gun)
 
 /obj/item/gun/Destroy()
-	if(isobj(pin)) //Can still be the initial path, then we skip
-		QDEL_NULL(pin)
 	if(gun_light)
 		QDEL_NULL(gun_light)
 	if(bayonet)
@@ -190,8 +183,6 @@
 	return ..()
 
 /obj/item/gun/handle_atom_del(atom/A)
-	if(A == pin)
-		pin = null
 	if(A == chambered)
 		chambered = null
 		update_appearance()
@@ -203,12 +194,6 @@
 
 /obj/item/gun/examine(mob/user)
 	. = ..()
-	if(pin)
-		. += "It has \a [pin] installed."
-		. += "<span class='info'>[pin] looks like it could be removed with some <b>tools</b>.</span>"
-	else
-		. += "It doesn't have a <b>firing pin</b> installed, and won't fire."
-
 	if(gun_light)
 		. += "It has \a [gun_light] [can_flashlight ? "" : "permanently "]mounted on it."
 		if(can_flashlight) //if it has a light and this is false, the light is permanent.
@@ -361,22 +346,6 @@
 				user.dropItemToGround(src, TRUE)
 				return TRUE
 
-/obj/item/gun/can_trigger_gun(mob/living/user)
-	. = ..()
-	if(!handle_pins(user))
-		return FALSE
-
-/obj/item/gun/proc/handle_pins(mob/living/user)
-	if(pin)
-		if(pin.pin_auth(user) || (pin.obj_flags & EMAGGED))
-			return TRUE
-		else
-			pin.auth_fail(user)
-			return FALSE
-	else
-		to_chat(user, "<span class='warning'>[src]'s trigger is locked. This weapon doesn't have a firing pin installed!</span>")
-	return FALSE
-
 /obj/item/gun/proc/recharge_newshot()
 	return
 
@@ -571,40 +540,6 @@
 	else if(picked_option == "Knife")
 		return remove_gun_attachment(user, I, bayonet, "unfix")
 
-/obj/item/gun/welder_act(mob/living/user, obj/item/I)
-	. = ..()
-	if(.)
-		return
-	if(!user.canUseTopic(src, BE_CLOSE, FALSE, NO_TK))
-		return
-	if(pin && user.is_holding(src))
-		user.visible_message("<span class='warning'>[user] attempts to remove [pin] from [src] with [I].</span>",
-		"<span class='notice'>You attempt to remove [pin] from [src]. (It will take [DisplayTimeText(FIRING_PIN_REMOVAL_DELAY)].)</span>", null, 3)
-		if(I.use_tool(src, user, FIRING_PIN_REMOVAL_DELAY, 5, volume = 50))
-			if(!pin) //check to see if the pin is still there, or we can spam messages by clicking multiple times during the tool delay
-				return
-			user.visible_message("<span class='notice'>[pin] is spliced out of [src] by [user], melting part of the pin in the process.</span>",
-								"<span class='warning'>You splice [pin] out of [src] with [I], melting part of the pin in the process.</span>", null, 3)
-			QDEL_NULL(pin)
-			return TRUE
-
-/obj/item/gun/wirecutter_act(mob/living/user, obj/item/I)
-	. = ..()
-	if(.)
-		return
-	if(!user.canUseTopic(src, BE_CLOSE, FALSE, NO_TK))
-		return
-	if(pin && user.is_holding(src))
-		user.visible_message("<span class='warning'>[user] attempts to remove [pin] from [src] with [I].</span>",
-		"<span class='notice'>You attempt to remove [pin] from [src]. (It will take [DisplayTimeText(FIRING_PIN_REMOVAL_DELAY)].)</span>", null, 3)
-		if(I.use_tool(src, user, FIRING_PIN_REMOVAL_DELAY, volume = 50))
-			if(!pin) //check to see if the pin is still there, or we can spam messages by clicking multiple times during the tool delay
-				return
-			user.visible_message("<span class='notice'>[pin] is ripped out of [src] by [user], mangling the pin in the process.</span>",
-								"<span class='warning'>You rip [pin] out of [src] with [I], mangling the pin in the process.</span>", null, 3)
-			QDEL_NULL(pin)
-			return TRUE
-
 /obj/item/gun/proc/remove_gun_attachment(mob/living/user, obj/item/tool_item, obj/item/item_to_remove, removal_verb)
 	if(tool_item)
 		tool_item.play_tool_sound(src)
@@ -772,11 +707,6 @@
 
 	process_fire(target, user, TRUE, params, BODY_ZONE_HEAD)
 
-/obj/item/gun/proc/unlock() //used in summon guns and as a convience for admins
-	if(pin)
-		qdel(pin)
-	pin = new /obj/item/firing_pin
-
 //Happens before the actual projectile creation
 /obj/item/gun/proc/before_firing(atom/target,mob/user)
 	return
@@ -942,5 +872,4 @@
 		azoom = new()
 		azoom.gun = src
 
-#undef FIRING_PIN_REMOVAL_DELAY
 #undef DUALWIELD_PENALTY_EXTRA_MULTIPLIER
diff --git a/code/modules/projectiles/guns/ballistic/automatic.dm b/code/modules/projectiles/guns/ballistic/automatic.dm
index 841e36927cb5..2b4741d5593a 100644
--- a/code/modules/projectiles/guns/ballistic/automatic.dm
+++ b/code/modules/projectiles/guns/ballistic/automatic.dm
@@ -91,7 +91,6 @@
 	desc = "A heavily-modified .50 BMG anti-material rifle utilized by Syndicate agents. Requires both hands to fire."
 	can_suppress = TRUE
 	can_unsuppress = TRUE
-	pin = /obj/item/firing_pin/implant/pindicate
 
 // Old Semi-Auto Rifle //
 
diff --git a/code/modules/projectiles/guns/ballistic/launchers.dm b/code/modules/projectiles/guns/ballistic/launchers.dm
index c7d73c5459bc..061f256229a1 100644
--- a/code/modules/projectiles/guns/ballistic/launchers.dm
+++ b/code/modules/projectiles/guns/ballistic/launchers.dm
@@ -9,13 +9,9 @@
 	mag_type = /obj/item/ammo_box/magazine/internal/grenadelauncher
 	fire_sound = 'sound/weapons/gun/general/grenade_launch.ogg'
 	w_class = WEIGHT_CLASS_NORMAL
-	pin = /obj/item/firing_pin/implant/pindicate
 	bolt_type = BOLT_TYPE_NO_BOLT
 	fire_delay = 10
 
-/obj/item/gun/ballistic/revolver/grenadelauncher/unrestricted
-	pin = /obj/item/firing_pin
-
 /obj/item/gun/ballistic/revolver/grenadelauncher/attackby(obj/item/A, mob/user, params)
 	..()
 	if(istype(A, /obj/item/ammo_box) || istype(A, /obj/item/ammo_casing))
@@ -27,7 +23,6 @@
 	icon = 'icons/mecha/mecha_equipment.dmi'
 	icon_state = "mecha_grenadelnchr"
 	mag_type = /obj/item/ammo_box/magazine/internal/cylinder/grenademulti
-	pin = /obj/item/firing_pin
 
 /obj/item/gun/ballistic/revolver/grenadelauncher/cyborg/attack_self()
 	return
@@ -53,7 +48,6 @@
 	load_sound = 'sound/weapons/gun/general/rocket_load.ogg'
 	w_class = WEIGHT_CLASS_BULKY
 	can_suppress = FALSE
-	pin = /obj/item/firing_pin
 	burst_size = 1
 	fire_delay = 0
 	casing_ejector = FALSE
@@ -65,9 +59,6 @@
 	tac_reloads = FALSE
 	manufacturer = MANUFACTURER_SCARBOROUGH
 
-/obj/item/gun/ballistic/rocketlauncher/unrestricted
-	pin = /obj/item/firing_pin
-
 /obj/item/gun/ballistic/rocketlauncher/afterattack()
 	. = ..()
 	magazine.get_round(FALSE) //Hack to clear the mag after it's fired
diff --git a/code/modules/projectiles/guns/ballistic/revolver.dm b/code/modules/projectiles/guns/ballistic/revolver.dm
index 454a790728d2..57b088fc16b7 100644
--- a/code/modules/projectiles/guns/ballistic/revolver.dm
+++ b/code/modules/projectiles/guns/ballistic/revolver.dm
@@ -197,7 +197,6 @@
 	icon_state = "goldrevolver"
 	fire_sound = 'sound/weapons/resonator_blast.ogg'
 	recoil = 8
-	pin = /obj/item/firing_pin
 	manufacturer = MANUFACTURER_NONE
 
 /obj/item/gun/ballistic/revolver/nagant
diff --git a/code/modules/projectiles/guns/ballistic/rifle.dm b/code/modules/projectiles/guns/ballistic/rifle.dm
index 6506edc4bb1d..2edda6bb9ecd 100644
--- a/code/modules/projectiles/guns/ballistic/rifle.dm
+++ b/code/modules/projectiles/guns/ballistic/rifle.dm
@@ -131,7 +131,6 @@
 	name = "arcane barrage"
 	desc = "Pew Pew Pew."
 	fire_sound = 'sound/weapons/emitter.ogg'
-	pin = /obj/item/firing_pin/magic
 	icon = 'icons/obj/guns/projectile.dmi'
 	lefthand_file = 'icons/mob/inhands/weapons/guns_lefthand.dmi'
 	righthand_file = 'icons/mob/inhands/weapons/guns_righthand.dmi'
diff --git a/code/modules/projectiles/guns/ballistic/shotgun.dm b/code/modules/projectiles/guns/ballistic/shotgun.dm
index 8d4390398075..a96ef808e695 100644
--- a/code/modules/projectiles/guns/ballistic/shotgun.dm
+++ b/code/modules/projectiles/guns/ballistic/shotgun.dm
@@ -115,9 +115,6 @@
 	var/obj/item/ammo_box/magazine/internal/shot/alternate_magazine
 	semi_auto = TRUE
 
-/obj/item/gun/ballistic/shotgun/automatic/dual_tube/mindshield
-	pin = /obj/item/firing_pin/implant/mindshield
-
 /obj/item/gun/ballistic/shotgun/automatic/dual_tube/examine(mob/user)
 	. = ..()
 	. += "<span class='notice'>Alt-click to pump it.</span>"
@@ -167,7 +164,6 @@
 	can_suppress = FALSE
 	burst_size = 1
 	fire_delay = 0
-	pin = /obj/item/firing_pin/implant/pindicate
 	fire_sound = 'sound/weapons/gun/shotgun/shot.ogg'
 	actions_types = list()
 	mag_display = TRUE
@@ -188,16 +184,12 @@
 	wield_slowdown = 0.6
 	wield_delay = 0.65 SECONDS
 
-/obj/item/gun/ballistic/shotgun/bulldog/unrestricted
-	pin = /obj/item/firing_pin
-
 /obj/item/gun/ballistic/shotgun/bulldog/inteq
 	name = "\improper Mastiff Shotgun"
 	desc = "A variation of the Bulldog, seized from Syndicate armories by deserting troopers then modified to IRMG's standards."
 	icon_state = "bulldog-inteq"
 	item_state = "bulldog-inteq"
 	mag_type = /obj/item/ammo_box/magazine/m12g
-	pin = /obj/item/firing_pin
 	manufacturer = MANUFACTURER_INTEQ
 
 /obj/item/gun/ballistic/shotgun/bulldog/minutemen
@@ -207,7 +199,6 @@
 	mag_type = /obj/item/ammo_box/magazine/cm15_mag
 	icon_state = "cm15"
 	item_state = "cm15"
-	pin = /obj/item/firing_pin
 	empty_alarm = FALSE
 	empty_indicator = FALSE
 	special_mags = FALSE
diff --git a/code/modules/projectiles/guns/ballistic/smg.dm b/code/modules/projectiles/guns/ballistic/smg.dm
index 7efd0a579925..696a934e71c4 100644
--- a/code/modules/projectiles/guns/ballistic/smg.dm
+++ b/code/modules/projectiles/guns/ballistic/smg.dm
@@ -27,9 +27,6 @@
 	. = ..()
 	AddComponent(/datum/component/automatic_fire, 0.15 SECONDS)
 
-/obj/item/gun/ballistic/automatic/smg/proto/unrestricted
-	pin = /obj/item/firing_pin
-
 /obj/item/gun/ballistic/automatic/smg/c20r
 	name = "\improper C-20r SMG"
 	desc = "A bullpup .45 SMG, designated 'C-20r'. Has a 'Scarborough Arms - Per falcis, per pravitas' buttstamp."
@@ -49,9 +46,6 @@
 	. = ..()
 	AddComponent(/datum/component/automatic_fire, 0.15 SECONDS)
 
-/obj/item/gun/ballistic/automatic/smg/c20r/unrestricted
-	pin = /obj/item/firing_pin
-
 /obj/item/gun/ballistic/automatic/smg/c20r/Initialize()
 	. = ..()
 	update_appearance()
@@ -156,7 +150,6 @@
 	var/obj/item/gun/ballistic/revolver/grenadelauncher/underbarrel
 	burst_size = 3
 	fire_delay = 2
-	pin = /obj/item/firing_pin/implant/pindicate
 	mag_display = TRUE
 	empty_indicator = TRUE
 	fire_sound = 'sound/weapons/gun/rifle/shot_alt.ogg'
@@ -171,12 +164,9 @@
 	underbarrel = new /obj/item/gun/ballistic/revolver/grenadelauncher(src)
 	update_appearance()
 
-/obj/item/gun/ballistic/automatic/smg/m90/unrestricted
-	pin = /obj/item/firing_pin
-
-/obj/item/gun/ballistic/automatic/smg/m90/unrestricted/Initialize()
+/obj/item/gun/ballistic/automatic/smg/m90/Initialize()
 	. = ..()
-	underbarrel = new /obj/item/gun/ballistic/revolver/grenadelauncher/unrestricted(src)
+	underbarrel = new /obj/item/gun/ballistic/revolver/grenadelauncher(src)
 	update_appearance()
 
 /obj/item/gun/ballistic/automatic/smg/m90/afterattack(atom/target, mob/living/user, flag, params)
diff --git a/code/modules/projectiles/guns/ballistic/toy.dm b/code/modules/projectiles/guns/ballistic/toy.dm
index 4ce2819a902e..4d1e7884225c 100644
--- a/code/modules/projectiles/guns/ballistic/toy.dm
+++ b/code/modules/projectiles/guns/ballistic/toy.dm
@@ -20,9 +20,6 @@
 	. = ..()
 	. += "[icon_state]_toy"
 
-/obj/item/gun/ballistic/automatic/toy/unrestricted
-	pin = /obj/item/firing_pin
-
 /obj/item/gun/ballistic/automatic/toy/pistol
 	name = "foam force pistol"
 	desc = "A small, easily concealable toy handgun. Ages 8 and up."
@@ -45,12 +42,6 @@
 	magazine = new /obj/item/ammo_box/magazine/toy/pistol/riot(src)
 	return ..()
 
-/obj/item/gun/ballistic/automatic/toy/pistol/unrestricted
-	pin = /obj/item/firing_pin
-
-/obj/item/gun/ballistic/automatic/toy/pistol/riot/unrestricted
-	pin = /obj/item/firing_pin
-
 /obj/item/gun/ballistic/shotgun/toy
 	name = "foam force shotgun"
 	desc = "A toy shotgun with wood furniture and a four-shell capacity underneath. Ages 8 and up."
@@ -75,9 +66,6 @@
 	if(chambered && !chambered.BB)
 		qdel(chambered)
 
-/obj/item/gun/ballistic/shotgun/toy/unrestricted
-	pin = /obj/item/firing_pin
-
 /obj/item/gun/ballistic/shotgun/toy/crossbow
 	name = "foam force crossbow"
 	desc = "A weapon favored by many overactive children. Ages 8 and up."
@@ -105,13 +93,6 @@
 	recoil = -10 //its a toy...
 	recoil_unwielded = -10
 
-/obj/item/gun/ballistic/automatic/smg/c20r/toy/unrestricted //Use this for actual toys
-	pin = /obj/item/firing_pin
-	mag_type = /obj/item/ammo_box/magazine/toy/smgm45
-
-/obj/item/gun/ballistic/automatic/smg/c20r/toy/unrestricted/riot
-	mag_type = /obj/item/ammo_box/magazine/toy/smgm45/riot
-
 /obj/item/gun/ballistic/automatic/smg/c20r/toy/update_overlays()
 	. = ..()
 	. += "[icon_state]_toy"
@@ -129,11 +110,7 @@
 	recoil = -10 //its a toy...
 	recoil_unwielded = -10
 
-/obj/item/gun/ballistic/automatic/hmg/l6_saw/toy/unrestricted //Use this for actual toys
-	pin = /obj/item/firing_pin
-	mag_type = /obj/item/ammo_box/magazine/toy/m762
-
-/obj/item/gun/ballistic/automatic/hmg/l6_saw/toy/unrestricted/riot
+/obj/item/gun/ballistic/automatic/hmg/l6_saw/toy/riot
 	mag_type = /obj/item/ammo_box/magazine/toy/m762/riot
 
 /obj/item/gun/ballistic/automatic/hmg/l6_saw/toy/update_overlays()
diff --git a/code/modules/projectiles/guns/energy/energy_gun.dm b/code/modules/projectiles/guns/energy/energy_gun.dm
index 223cdc09e157..d8dbc159a8d0 100644
--- a/code/modules/projectiles/guns/energy/energy_gun.dm
+++ b/code/modules/projectiles/guns/energy/energy_gun.dm
@@ -12,9 +12,6 @@
 	dual_wield_spread = 60
 	manufacturer = MANUFACTURER_SHARPLITE_NEW
 
-/obj/item/gun/energy/e_gun/mindshield
-	pin = /obj/item/firing_pin/implant/mindshield
-
 /obj/item/gun/energy/e_gun/mini
 	name = "miniature energy gun"
 	desc = "A small, pistol-sized energy gun with a built-in flashlight. It has two settings: disable and kill."
diff --git a/code/modules/projectiles/guns/energy/laser.dm b/code/modules/projectiles/guns/energy/laser.dm
index 0c02e2ff90e8..8e3774737c06 100644
--- a/code/modules/projectiles/guns/energy/laser.dm
+++ b/code/modules/projectiles/guns/energy/laser.dm
@@ -75,7 +75,6 @@
 	item_state = "shotgun"
 	desc = "A combat shotgun gutted and refitted with an internal laser system. Can switch between taser and scattered disabler shots."
 	shaded_charge = 0
-	pin = /obj/item/firing_pin/implant/mindshield
 	ammo_type = list(/obj/item/ammo_casing/energy/disabler/scatter, /obj/item/ammo_casing/energy/electrode)
 	manufacturer = MANUFACTURER_NONE
 
@@ -97,9 +96,6 @@
 	ammo_x_offset = 3
 	manufacturer = MANUFACTURER_SHARPLITE
 
-/obj/item/gun/energy/lasercannon/unrestricted
-	pin = /obj/item/firing_pin
-
 /obj/item/ammo_casing/energy/laser/accelerator
 	projectile_type = /obj/projectile/beam/laser/accelerator
 	select_name = "accelerator"
@@ -135,7 +131,6 @@
 	ammo_type = list(/obj/item/ammo_casing/energy/laser/bluetag)
 	item_flags = NONE
 	clumsy_check = FALSE
-	pin = /obj/item/firing_pin/tag/blue
 	ammo_x_offset = 2
 	selfcharge = TRUE
 	manufacturer = MANUFACTURER_NONE
@@ -150,7 +145,6 @@
 	ammo_type = list(/obj/item/ammo_casing/energy/laser/redtag)
 	item_flags = NONE
 	clumsy_check = FALSE
-	pin = /obj/item/firing_pin/tag/red
 	ammo_x_offset = 2
 	selfcharge = TRUE
 	manufacturer = MANUFACTURER_NONE
diff --git a/code/modules/projectiles/guns/energy/pulse.dm b/code/modules/projectiles/guns/energy/pulse.dm
index f5efacbf96c3..fe5a85131ac5 100644
--- a/code/modules/projectiles/guns/energy/pulse.dm
+++ b/code/modules/projectiles/guns/energy/pulse.dm
@@ -24,26 +24,6 @@
 /obj/item/gun/energy/pulse/emp_act(severity)
 	return
 
-/obj/item/gun/energy/pulse/prize
-	pin = /obj/item/firing_pin
-
-/obj/item/gun/energy/pulse/prize/Initialize()
-	. = ..()
-	GLOB.poi_list += src
-	var/turf/T = get_turf(src)
-
-	message_admins("A pulse rifle prize has been created at [ADMIN_VERBOSEJMP(T)]")
-	log_game("A pulse rifle prize has been created at [AREACOORD(T)]")
-
-	notify_ghosts("Someone won a pulse rifle as a prize!", source = src, action = NOTIFY_ORBIT, header = "Pulse rifle prize")
-
-/obj/item/gun/energy/pulse/prize/Destroy()
-	GLOB.poi_list -= src
-	. = ..()
-
-/obj/item/gun/energy/pulse/loyalpin
-	pin = /obj/item/firing_pin
-
 /obj/item/gun/energy/pulse/carbine
 	name = "pulse carbine"
 	desc = "A next-generation pulse weapon for Nanotrasen's security forces. High production costs and logistical issues have limited its deployment to specialist Loss Prevention and Emergency Response units."
@@ -61,9 +41,6 @@
 	ammo_x_offset = 2
 	charge_sections = 4
 
-/obj/item/gun/energy/pulse/carbine/loyalpin
-	pin = /obj/item/firing_pin/implant/mindshield
-
 /obj/item/gun/energy/pulse/pistol
 	name = "pulse pistol"
 	desc = "A pulse rifle in an easily concealed handgun package with low capacity."
@@ -76,9 +53,6 @@
 	ammo_x_offset = 2
 	charge_sections = 4
 
-/obj/item/gun/energy/pulse/pistol/loyalpin
-	pin = /obj/item/firing_pin/implant/mindshield
-
 /obj/item/gun/energy/pulse/destroyer
 	name = "pulse destroyer"
 	desc = "A heavy-duty energy rifle built for pure destruction."
diff --git a/code/modules/projectiles/guns/energy/special.dm b/code/modules/projectiles/guns/energy/special.dm
index 5a01abfdc0f1..d8291feae088 100644
--- a/code/modules/projectiles/guns/energy/special.dm
+++ b/code/modules/projectiles/guns/energy/special.dm
@@ -44,10 +44,6 @@
 	if(!QDELETED(cell) && (cell.charge > shot.e_cost))
 		. += "decloner_spin"
 
-/obj/item/gun/energy/decloner/unrestricted
-	pin = /obj/item/firing_pin
-	ammo_type = list(/obj/item/ammo_casing/energy/declone/weak)
-
 /obj/item/gun/energy/floragun
 	name = "floral somatoray"
 	desc = "A tool that discharges controlled radiation which induces mutation in plant cells."
@@ -341,7 +337,6 @@
 /obj/item/gun/energy/temperature/security
 	name = "security temperature gun"
 	desc = "A weapon that can only be used to its full potential by the truly robust."
-	pin = /obj/item/firing_pin
 
 /obj/item/gun/energy/laser/instakill
 	name = "instakill rifle"
diff --git a/code/modules/projectiles/guns/misc/beam_rifle.dm b/code/modules/projectiles/guns/misc/beam_rifle.dm
index fad4f485aa88..cdd54d60c579 100644
--- a/code/modules/projectiles/guns/misc/beam_rifle.dm
+++ b/code/modules/projectiles/guns/misc/beam_rifle.dm
@@ -82,7 +82,6 @@
 	cell_type = /obj/item/stock_parts/cell/infinite
 	aiming_time = 0
 	recoil = 0
-	pin = /obj/item/firing_pin
 
 /obj/item/gun/energy/beam_rifle/equipped(mob/user)
 	set_user(user)
diff --git a/code/modules/projectiles/pins.dm b/code/modules/projectiles/pins.dm
deleted file mode 100644
index 23093e5d8d51..000000000000
--- a/code/modules/projectiles/pins.dm
+++ /dev/null
@@ -1,343 +0,0 @@
-/obj/item/firing_pin
-	name = "electronic firing pin"
-	desc = "A small authentication device, to be inserted into a firearm receiver to allow operation. NT safety regulations require all new designs to incorporate one."
-	icon = 'icons/obj/device.dmi'
-	icon_state = "firing_pin"
-	item_state = "pen"
-	flags_1 = CONDUCT_1
-	w_class = WEIGHT_CLASS_TINY
-	attack_verb = list("poked")
-	var/fail_message = "<span class='warning'>INVALID USER.</span>"
-	var/selfdestruct = 0 // Explode when user check is failed.
-	var/force_replace = 0 // Can forcefully replace other pins.
-	var/pin_removeable = 0 // Can be replaced by any pin.
-	var/obj/item/gun/gun
-
-/obj/item/firing_pin/New(newloc)
-	..()
-	if(istype(newloc, /obj/item/gun))
-		gun = newloc
-
-/obj/item/firing_pin/afterattack(atom/target, mob/user, proximity_flag)
-	. = ..()
-	if(proximity_flag)
-		if(istype(target, /obj/item/gun))
-			var/obj/item/gun/G = target
-			var/obj/item/firing_pin/old_pin = G.pin
-			if(old_pin && (force_replace || old_pin.pin_removeable))
-				to_chat(user, "<span class='notice'>You remove [old_pin] from [G].</span>")
-				if(Adjacent(user))
-					user.put_in_hands(old_pin)
-				else
-					old_pin.forceMove(G.drop_location())
-				old_pin.gun_remove(user)
-
-			if(!G.pin)
-				if(!user.temporarilyRemoveItemFromInventory(src))
-					return
-				gun_insert(user, G)
-				to_chat(user, "<span class='notice'>You insert [src] into [G].</span>")
-			else
-				to_chat(user, "<span class='notice'>This firearm already has a firing pin installed.</span>")
-
-/obj/item/firing_pin/emag_act(mob/user)
-	if(obj_flags & EMAGGED)
-		return
-	obj_flags |= EMAGGED
-	to_chat(user, "<span class='notice'>You override the authentication mechanism.</span>")
-
-/obj/item/firing_pin/proc/gun_insert(mob/living/user, obj/item/gun/G)
-	gun = G
-	forceMove(gun)
-	gun.pin = src
-	return
-
-/obj/item/firing_pin/proc/gun_remove(mob/living/user)
-	gun.pin = null
-	gun = null
-	return
-
-/obj/item/firing_pin/proc/pin_auth(mob/living/user)
-	return TRUE
-
-/obj/item/firing_pin/proc/auth_fail(mob/living/user)
-	if(user)
-		user.show_message(fail_message, MSG_VISUAL)
-	if(selfdestruct)
-		if(user)
-			user.show_message("<span class='danger'>SELF-DESTRUCTING...</span><br>", MSG_VISUAL)
-			to_chat(user, "<span class='userdanger'>[gun] explodes!</span>")
-		explosion(get_turf(gun), -1, 0, 2, 3)
-		if(gun)
-			qdel(gun)
-
-
-/obj/item/firing_pin/magic
-	name = "magic crystal shard"
-	desc = "A small enchanted shard which allows magical weapons to fire."
-
-
-// Test pin, works only near firing range.
-/obj/item/firing_pin/test_range
-	name = "test-range firing pin"
-	desc = "This safety firing pin allows weapons to be fired within proximity to a firing range."
-	fail_message = "<span class='warning'>TEST RANGE CHECK FAILED.</span>"
-	pin_removeable = TRUE
-
-/obj/item/firing_pin/test_range/pin_auth(mob/living/user)
-	if(!istype(user))
-		return FALSE
-	if (istype(get_area(user), /area/ship/security/range))
-		return TRUE
-	return FALSE
-
-
-// Implant pin, checks for implant
-/obj/item/firing_pin/implant
-	name = "implant-keyed firing pin"
-	desc = "This is a security firing pin which only authorizes users who are implanted with a certain device."
-	fail_message = "<span class='warning'>IMPLANT CHECK FAILED.</span>"
-	var/obj/item/implant/req_implant = null
-
-/obj/item/firing_pin/implant/pin_auth(mob/living/user)
-	if(user)
-		for(var/obj/item/implant/I in user.implants)
-			if(req_implant && I.type == req_implant)
-				return TRUE
-	return FALSE
-
-/obj/item/firing_pin/implant/mindshield
-	name = "mindshield firing pin"
-	desc = "This Security firing pin authorizes the weapon for only mindshield-implanted users."
-	icon_state = "firing_pin_loyalty"
-	req_implant = /obj/item/implant/mindshield
-
-/obj/item/firing_pin/implant/pindicate
-	name = "syndicate firing pin"
-	icon_state = "firing_pin_pindi"
-	req_implant = /obj/item/implant/weapons_auth
-
-
-
-// Honk pin, clown's joke item.
-// Can replace other pins. Replace a pin in cap's laser for extra fun!
-/obj/item/firing_pin/clown
-	name = "hilarious firing pin"
-	desc = "Advanced clowntech that can convert any firearm into a far more useful object."
-	color = "#FFFF00"
-	fail_message = "<span class='warning'>HONK!</span>"
-	force_replace = TRUE
-
-/obj/item/firing_pin/clown/pin_auth(mob/living/user)
-	playsound(src, 'sound/items/bikehorn.ogg', 50, TRUE)
-	return FALSE
-
-// Ultra-honk pin, clown's deadly joke item.
-// A gun with ultra-honk pin is useful for clown and useless for everyone else.
-/obj/item/firing_pin/clown/ultra
-	name = "ultra hilarious firing pin"
-
-/obj/item/firing_pin/clown/ultra/pin_auth(mob/living/user)
-	playsound(src.loc, 'sound/items/bikehorn.ogg', 50, TRUE)
-	if(QDELETED(user))  //how the hell...?
-		stack_trace("/obj/item/firing_pin/clown/ultra/pin_auth called with a [isnull(user) ? "null" : "invalid"] user.")
-		return TRUE
-	if(HAS_TRAIT(user, TRAIT_CLUMSY)) //clumsy
-		return TRUE
-	if(user.mind)
-		if(user.mind.assigned_role == "Clown") //traitor clowns can use this, even though they're technically not clumsy
-			return TRUE
-		if(user.mind.has_antag_datum(/datum/antagonist/nukeop/clownop)) //clown ops aren't clumsy by default and technically don't have an assigned role of "Clown", but come on, they're basically clowns
-			return TRUE
-		if(user.mind.has_antag_datum(/datum/antagonist/nukeop/leader/clownop)) //Wanna hear a funny joke?
-			return TRUE //The clown op leader antag datum isn't a subtype of the normal clown op antag datum.
-	return FALSE
-
-/obj/item/firing_pin/clown/ultra/gun_insert(mob/living/user, obj/item/gun/G)
-	..()
-	G.clumsy_check = FALSE
-
-/obj/item/firing_pin/clown/ultra/gun_remove(mob/living/user)
-	gun.clumsy_check = initial(gun.clumsy_check)
-	..()
-
-// Now two times deadlier!
-/obj/item/firing_pin/clown/ultra/selfdestruct
-	name = "super ultra hilarious firing pin"
-	desc = "Advanced clowntech that can convert any firearm into a far more useful object. It has a small nitrobananium charge on it."
-	selfdestruct = TRUE
-
-
-// DNA-keyed pin.
-// When you want to keep your toys for yourself.
-/obj/item/firing_pin/dna
-	name = "DNA-keyed firing pin"
-	desc = "This is a DNA-locked firing pin which only authorizes one user. Attempt to fire once to DNA-link."
-	icon_state = "firing_pin_dna"
-	fail_message = "<span class='warning'>DNA CHECK FAILED.</span>"
-	var/unique_enzymes = null
-
-/obj/item/firing_pin/dna/afterattack(atom/target, mob/user, proximity_flag)
-	. = ..()
-	if(proximity_flag && iscarbon(target))
-		var/mob/living/carbon/M = target
-		if(M.dna && M.dna.unique_enzymes)
-			unique_enzymes = M.dna.unique_enzymes
-			to_chat(user, "<span class='notice'>DNA-LOCK SET.</span>")
-
-/obj/item/firing_pin/dna/pin_auth(mob/living/carbon/user)
-	if(user && user.dna && user.dna.unique_enzymes)
-		if(user.dna.unique_enzymes == unique_enzymes)
-			return TRUE
-	return FALSE
-
-/obj/item/firing_pin/dna/auth_fail(mob/living/carbon/user)
-	if(!unique_enzymes)
-		if(user && user.dna && user.dna.unique_enzymes)
-			unique_enzymes = user.dna.unique_enzymes
-			to_chat(user, "<span class='notice'>DNA-LOCK SET.</span>")
-	else
-		..()
-
-/obj/item/firing_pin/dna/dredd
-	desc = "This is a DNA-locked firing pin which only authorizes one user. Attempt to fire once to DNA-link. It has a small explosive charge on it."
-	selfdestruct = TRUE
-
-// Paywall pin, brought to you by ARMA 3 DLC.
-// Checks if the user has a valid bank account on an ID and if so attempts to extract a one-time payment to authorize use of the gun. Otherwise fails to shoot.
-/obj/item/firing_pin/paywall
-	name = "paywall firing pin"
-	desc = "A firing pin with a built-in configurable paywall."
-	color = "#FFD700"
-	fail_message = ""
-	var/list/gun_owners = list() //list of people who've accepted the license prompt. If this is the multi-payment pin, then this means they accepted the waiver that each shot will cost them money
-	var/payment_amount //how much gets paid out to license yourself to the gun
-	var/obj/item/card/id/pin_owner
-	var/multi_payment = FALSE //if true, user has to pay everytime they fire the gun
-	var/owned = FALSE
-	var/active_prompt = FALSE //purchase prompt to prevent spamming it
-
-/obj/item/firing_pin/paywall/attack_self(mob/user)
-	multi_payment = !multi_payment
-	to_chat(user, "<span class='notice'>You set the pin to [(multi_payment) ? "process payment for every shot" : "one-time license payment"].</span>")
-
-/obj/item/firing_pin/paywall/examine(mob/user)
-	. = ..()
-	if(pin_owner)
-		. += "<span class='notice'>This firing pin is currently authorized to pay into the account of [pin_owner.registered_name].</span>"
-
-/obj/item/firing_pin/paywall/gun_insert(mob/living/user, obj/item/gun/G)
-	if(!pin_owner)
-		to_chat(user, "<span class='warning'>ERROR: Please swipe valid identification card before installing firing pin!</span>")
-		return
-	gun = G
-	forceMove(gun)
-	gun.pin = src
-	if(multi_payment)
-		gun.desc += "<span class='notice'> This [gun.name] has a per-shot cost of [payment_amount] credit[(payment_amount > 1) ? "s" : ""].</span>"
-		return
-	gun.desc += "<span class='notice'> This [gun.name] has a license permit cost of [payment_amount] credit[(payment_amount > 1) ? "s" : ""].</span>"
-	return
-
-
-/obj/item/firing_pin/paywall/gun_remove(mob/living/user)
-	gun.desc = initial(desc)
-	..()
-
-/obj/item/firing_pin/paywall/attackby(obj/item/M, mob/user, params)
-	if(istype(M, /obj/item/card/id))
-		var/obj/item/card/id/id = M
-		if(!id.registered_account)
-			to_chat(user, "<span class='warning'>ERROR: Identification card lacks registered bank account!</span>")
-			return
-		if(id != pin_owner && owned)
-			to_chat(user, "<span class='warning'>ERROR: This firing pin has already been authorized!</span>")
-			return
-		if(id == pin_owner)
-			to_chat(user, "<span class='notice'>You unlink the card from the firing pin.</span>")
-			gun_owners -= user
-			pin_owner = null
-			owned = FALSE
-			return
-		var/transaction_amount = input(user, "Insert valid deposit amount for gun purchase", "Money Deposit") as null|num
-		if(transaction_amount < 1)
-			to_chat(user, "<span class='warning'>ERROR: Invalid amount designated.</span>")
-			return
-		if(!transaction_amount)
-			return
-		pin_owner = id
-		owned = TRUE
-		payment_amount = transaction_amount
-		gun_owners += user
-		to_chat(user, "<span class='notice'>You link the card to the firing pin.</span>")
-
-/obj/item/firing_pin/paywall/pin_auth(mob/living/user)
-	if(!istype(user))//nice try commie
-		return FALSE
-	if(ishuman(user))
-		var/datum/bank_account/credit_card_details
-		var/mob/living/carbon/human/H = user
-		if(H.get_bank_account())
-			credit_card_details = H.get_bank_account()
-		if(H in gun_owners)
-			if(multi_payment && credit_card_details)
-				if(credit_card_details.adjust_money(-payment_amount))
-					pin_owner.registered_account.adjust_money(payment_amount)
-					return TRUE
-				to_chat(user, "<span class='warning'>ERROR: User balance insufficent for successful transaction!</span>")
-				return FALSE
-			return TRUE
-		if(credit_card_details && !active_prompt)
-			var/license_request = alert(usr, "Do you wish to pay [payment_amount] credit[(payment_amount > 1) ? "s" : ""] for [(multi_payment) ? "each shot of [gun.name]" : "usage license of [gun.name]"]?", "Weapon Purchase", "Yes", "No")
-			active_prompt = TRUE
-			if(!user.canUseTopic(src, BE_CLOSE))
-				active_prompt = FALSE
-				return FALSE
-			switch(license_request)
-				if("Yes")
-					if(credit_card_details.adjust_money(-payment_amount))
-						pin_owner.registered_account.adjust_money(payment_amount)
-						gun_owners += H
-						to_chat(user, "<span class='notice'>Gun license purchased, have a secure day!</span>")
-						active_prompt = FALSE
-						return FALSE //we return false here so you don't click initially to fire, get the prompt, accept the prompt, and THEN the gun
-					to_chat(user, "<span class='warning'>ERROR: User balance insufficent for successful transaction!</span>")
-					return FALSE
-				if("No")
-					to_chat(user, "<span class='warning'>ERROR: User has declined to purchase gun license!</span>")
-					return FALSE
-		to_chat(user, "<span class='warning'>ERROR: User has no valid bank account to substract neccesary funds from!</span>")
-		return FALSE
-
-// Laser tag pins
-/obj/item/firing_pin/tag
-	name = "laser tag firing pin"
-	desc = "A recreational firing pin, used in laser tag units to ensure users have their vests on."
-	fail_message = "<span class='warning'>SUIT CHECK FAILED.</span>"
-	var/obj/item/clothing/suit/suit_requirement = null
-	var/tagcolor = ""
-
-/obj/item/firing_pin/tag/pin_auth(mob/living/user)
-	if(ishuman(user))
-		var/mob/living/carbon/human/M = user
-		if(istype(M.wear_suit, suit_requirement))
-			return TRUE
-	to_chat(user, "<span class='warning'>You need to be wearing [tagcolor] laser tag armor!</span>")
-	return FALSE
-
-/obj/item/firing_pin/tag/red
-	name = "red laser tag firing pin"
-	icon_state = "firing_pin_red"
-	suit_requirement = /obj/item/clothing/suit/redtag
-	tagcolor = "red"
-
-/obj/item/firing_pin/tag/blue
-	name = "blue laser tag firing pin"
-	icon_state = "firing_pin_blue"
-	suit_requirement = /obj/item/clothing/suit/bluetag
-	tagcolor = "blue"
-
-/obj/item/firing_pin/Destroy()
-	if(gun)
-		gun.pin = null
-	return ..()
diff --git a/code/modules/vending/liberation.dm b/code/modules/vending/liberation.dm
index d2fb11bfef4b..6656e9e37b49 100644
--- a/code/modules/vending/liberation.dm
+++ b/code/modules/vending/liberation.dm
@@ -13,7 +13,7 @@
 		/obj/item/gun/ballistic/automatic/pistol/deagle/gold = 2,
 		/obj/item/gun/ballistic/automatic/pistol/deagle/camo = 2,
 		/obj/item/gun/ballistic/automatic/pistol/m1911 = 2,
-		/obj/item/gun/ballistic/automatic/smg/proto/unrestricted = 2,
+		/obj/item/gun/ballistic/automatic/smg/proto = 2,
 		/obj/item/gun/ballistic/shotgun/automatic/combat = 2,
 		/obj/item/gun/ballistic/automatic/gyropistol = 1,
 		/obj/item/gun/ballistic/shotgun = 2,
diff --git a/code/modules/vending/liberation_toy.dm b/code/modules/vending/liberation_toy.dm
index 90df6b673b16..23a65a503c96 100644
--- a/code/modules/vending/liberation_toy.dm
+++ b/code/modules/vending/liberation_toy.dm
@@ -6,9 +6,9 @@
 	product_ads = "Feel robust with your toys!;Express your inner child today!;Toy weapons don't kill people, but valid hunters do!;Who needs responsibilities when you have toy weapons?;Make your next murder FUN!"
 	vend_reply = "Come back for more!"
 	circuit = /obj/item/circuitboard/machine/vending/syndicatedonksofttoyvendor
-	products = list(/obj/item/gun/ballistic/automatic/toy/unrestricted = 10,
-					/obj/item/gun/ballistic/automatic/toy/pistol/unrestricted = 10,
-					/obj/item/gun/ballistic/shotgun/toy/unrestricted = 10,
+	products = list(/obj/item/gun/ballistic/automatic/toy = 10,
+					/obj/item/gun/ballistic/automatic/toy/pistol = 10,
+					/obj/item/gun/ballistic/shotgun/toy = 10,
 					/obj/item/toy/sword = 10,
 					/obj/item/ammo_box/foambox = 20,
 					/obj/item/toy/foamblade = 10,
@@ -17,8 +17,8 @@
 					/obj/item/clothing/head/syndicatefake = 5) //OPS IN DORMS oh wait it's just an assistant
 	contraband = list(
 		/obj/item/gun/ballistic/shotgun/toy/crossbow = 10,   //Congrats, you unlocked the +18 setting!
-		/obj/item/gun/ballistic/automatic/smg/c20r/toy/unrestricted/riot = 10,
-		/obj/item/gun/ballistic/automatic/hmg/l6_saw/toy/unrestricted/riot = 10,
+		/obj/item/gun/ballistic/automatic/smg/c20r/toy/riot = 10,
+		/obj/item/gun/ballistic/automatic/hmg/l6_saw/toy/riot = 10,
 		/obj/item/ammo_box/foambox/riot = 20,
 		/obj/item/toy/katana = 10,
 		/obj/item/dualsaber/toy = 5,
diff --git a/code/modules/vending/security.dm b/code/modules/vending/security.dm
index d71dcae5ab41..482071c8b520 100644
--- a/code/modules/vending/security.dm
+++ b/code/modules/vending/security.dm
@@ -134,10 +134,10 @@
 		/obj/item/melee/transforming/energy/sword/saber/red = 1,
 		)
 	voucher_items = list(
-		"M-90gl Carbine" = /obj/item/gun/ballistic/automatic/smg/m90/unrestricted,
+		"M-90gl Carbine" = /obj/item/gun/ballistic/automatic/smg/m90,
 		"sniper rifle" = /obj/item/gun/ballistic/automatic/sniper_rifle,
-		"C-20r SMG" = /obj/item/gun/ballistic/automatic/smg/c20r/unrestricted,
-		"Bulldog Shotgun" = /obj/item/gun/ballistic/shotgun/bulldog/unrestricted)
+		"C-20r SMG" = /obj/item/gun/ballistic/automatic/smg/c20r,
+		"Bulldog Shotgun" = /obj/item/gun/ballistic/shotgun/bulldog)
 
 /obj/machinery/vending/security/marine/nanotrasen
 	icon_state = "nt-marine"
diff --git a/code/modules/vending/toys.dm b/code/modules/vending/toys.dm
index 8a938b50d435..a497afacc5e4 100644
--- a/code/modules/vending/toys.dm
+++ b/code/modules/vending/toys.dm
@@ -8,9 +8,9 @@
 	light_mask = "donksoft-light-mask"
 	circuit = /obj/item/circuitboard/machine/vending/donksofttoyvendor
 	products = list(
-		/obj/item/gun/ballistic/automatic/toy/unrestricted = 10,
-		/obj/item/gun/ballistic/automatic/toy/pistol/unrestricted = 10,
-		/obj/item/gun/ballistic/shotgun/toy/unrestricted = 10,
+		/obj/item/gun/ballistic/automatic/toy = 10,
+		/obj/item/gun/ballistic/automatic/toy/pistol = 10,
+		/obj/item/gun/ballistic/shotgun/toy = 10,
 		/obj/item/toy/sword = 10,
 		/obj/item/ammo_box/foambox = 20,
 		/obj/item/toy/foamblade = 10,
@@ -19,8 +19,8 @@
 		/obj/item/clothing/head/syndicatefake = 5)
 	contraband = list(
 		/obj/item/gun/ballistic/shotgun/toy/crossbow = 10,
-		/obj/item/gun/ballistic/automatic/smg/c20r/toy/unrestricted = 10,
-		/obj/item/gun/ballistic/automatic/hmg/l6_saw/toy/unrestricted = 10,
+		/obj/item/gun/ballistic/automatic/smg/c20r/toy = 10,
+		/obj/item/gun/ballistic/automatic/hmg/l6_saw/toy = 10,
 		/obj/item/toy/katana = 10,
 		/obj/item/dualsaber/toy = 5)
 	armor = list("melee" = 100, "bullet" = 100, "laser" = 100, "energy" = 100, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 100, "acid" = 50)
diff --git a/shiptest.dme b/shiptest.dme
index 543b4322394d..580d8162e721 100644
--- a/shiptest.dme
+++ b/shiptest.dme
@@ -2934,7 +2934,6 @@
 #include "code\modules\power\tesla\energy_ball.dm"
 #include "code\modules\power\tesla\generator.dm"
 #include "code\modules\projectiles\gun.dm"
-#include "code\modules\projectiles\pins.dm"
 #include "code\modules\projectiles\projectile.dm"
 #include "code\modules\projectiles\ammunition\_ammunition.dm"
 #include "code\modules\projectiles\ammunition\_firing.dm"

From 475643850c2ad8235d981b6c6600574464331411 Mon Sep 17 00:00:00 2001
From: FalloutFalcon <falloutfalconplays@gmail.com>
Date: Mon, 5 Feb 2024 17:31:55 -0600
Subject: [PATCH 47/89] hm

---
 code/modules/unit_tests/gun_crafting.dm | 6 +++---
 1 file changed, 3 insertions(+), 3 deletions(-)

diff --git a/code/modules/unit_tests/gun_crafting.dm b/code/modules/unit_tests/gun_crafting.dm
index 3dc74430681c..31ee1edc2285 100644
--- a/code/modules/unit_tests/gun_crafting.dm
+++ b/code/modules/unit_tests/gun_crafting.dm
@@ -1,12 +1,11 @@
 //Makes sure preinstalled frame parts can be removed an reinstalled
 /datum/unit_test/gun_crafting/Run()
-/*
 	var/list/guns = typesof(/obj/item/gun/ballistic)
 	for(var/gunType in guns)
 		var/obj/item/gun/ballistic/G = new gunType
 		if(G.magazine)
-			TEST_FAIL("Gun: [G.type], Magazine: [G.magazine.type], Caliber: [G.magazine.caliber]")
-*/
+			TEST_FAIL("[G.type], Mag: [G.magazine.type], Cali: [G.magazine.caliber]")
+/*
 	var/mob/living/carbon/human/human = allocate(/mob/living/carbon/human)
 	for(var/frame_type in subtypesof(/obj/item/part/gun/frame))
 		var/obj/item/part/gun/frame/frame = new frame_type
@@ -15,3 +14,4 @@
 			frame.eject_item(installedPart, human)
 			frame.handle_part(installedPart, human)
 		TEST_ASSERT_EQUAL(frame_parts, frame.installed_parts, "Frame parts to match there original contents. I assume frame parts were not reinstalled correctly.")
+*/

From a049ff914082cfd6af65fe7d0af39dd01af0bfdb Mon Sep 17 00:00:00 2001
From: FalloutFalcon <falloutfalconplays@gmail.com>
Date: Mon, 5 Feb 2024 17:38:14 -0600
Subject: [PATCH 48/89] oh the paths changed alot?

---
 code/modules/guncrafting/recipe.dm | 20 +++++++++++---------
 1 file changed, 11 insertions(+), 9 deletions(-)

diff --git a/code/modules/guncrafting/recipe.dm b/code/modules/guncrafting/recipe.dm
index 1b1dfa7ed5a5..1072dd7b4777 100644
--- a/code/modules/guncrafting/recipe.dm
+++ b/code/modules/guncrafting/recipe.dm
@@ -28,6 +28,16 @@
 	var/list/valid_parts = list()
 	var/required_part_types = ALL
 
+/datum/lathe_recipe/gun/m1911
+	result = /obj/item/gun/ballistic/automatic/pistol/m1911
+	valid_parts = list(
+		/obj/item/part/gun/frame/m1911,
+		/obj/item/part/gun/modular/grip/wood,
+		/obj/item/part/gun/modular/mechanism/pistol,
+		/obj/item/part/gun/modular/barrel/pistol
+		)
+
+/*
 /datum/lathe_recipe/gun/winchester
 	result = /obj/item/gun/ballistic/shotgun/winchester
 	valid_parts = list(
@@ -46,15 +56,6 @@
 		/obj/item/part/gun/modular/barrel/rifle
 		)
 
-/datum/lathe_recipe/gun/m1911
-	result = /obj/item/gun/ballistic/automatic/pistol/m1911
-	valid_parts = list(
-		/obj/item/part/gun/frame/m1911,
-		/obj/item/part/gun/modular/grip/wood,
-		/obj/item/part/gun/modular/mechanism/pistol,
-		/obj/item/part/gun/modular/barrel/pistol
-		)
-
 /datum/lathe_recipe/gun/tec9
 	result = /obj/item/gun/ballistic/automatic/pistol/tec9
 	valid_parts = list(
@@ -126,3 +127,4 @@
 		/obj/item/part/gun/modular/mechanism,
 		/obj/item/part/gun/modular/barrel
 		)
+*/

From 54ec41868c48dc9d897945efc021311e61139906 Mon Sep 17 00:00:00 2001
From: FalloutFalcon <falloutfalconplays@gmail.com>
Date: Mon, 5 Feb 2024 17:41:00 -0600
Subject: [PATCH 49/89] yea

---
 code/modules/guncrafting/frame.dm  | 4 ++--
 code/modules/guncrafting/recipe.dm | 6 +++---
 2 files changed, 5 insertions(+), 5 deletions(-)

diff --git a/code/modules/guncrafting/frame.dm b/code/modules/guncrafting/frame.dm
index cf05f893bfff..de54637a7190 100644
--- a/code/modules/guncrafting/frame.dm
+++ b/code/modules/guncrafting/frame.dm
@@ -192,8 +192,8 @@
 /obj/item/part/gun/frame/winchester/mk1
 	name = "winchester mk1 gun frame"
 
-/obj/item/part/gun/frame/m1911
-	name = "m1911 gun frame"
+/obj/item/part/gun/frame/candor
+	name = "candor gun frame"
 	preinstalled_parts = list(
 		/obj/item/part/gun/modular/grip/wood,
 		/obj/item/part/gun/modular/mechanism/pistol,
diff --git a/code/modules/guncrafting/recipe.dm b/code/modules/guncrafting/recipe.dm
index 1072dd7b4777..2fea8240799c 100644
--- a/code/modules/guncrafting/recipe.dm
+++ b/code/modules/guncrafting/recipe.dm
@@ -28,10 +28,10 @@
 	var/list/valid_parts = list()
 	var/required_part_types = ALL
 
-/datum/lathe_recipe/gun/m1911
-	result = /obj/item/gun/ballistic/automatic/pistol/m1911
+/datum/lathe_recipe/gun/candor
+	result = /obj/item/gun/ballistic/automatic/pistol/candor
 	valid_parts = list(
-		/obj/item/part/gun/frame/m1911,
+		/obj/item/part/gun/frame/candor,
 		/obj/item/part/gun/modular/grip/wood,
 		/obj/item/part/gun/modular/mechanism/pistol,
 		/obj/item/part/gun/modular/barrel/pistol

From f6af1222b0c796596321de246a3282253e52626d Mon Sep 17 00:00:00 2001
From: FalloutFalcon <falloutfalconplays@gmail.com>
Date: Mon, 5 Feb 2024 17:43:19 -0600
Subject: [PATCH 50/89] candor

---
 code/modules/guncrafting/guncrafting.dm | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/code/modules/guncrafting/guncrafting.dm b/code/modules/guncrafting/guncrafting.dm
index 423fb6f1a28a..84975f846d7f 100644
--- a/code/modules/guncrafting/guncrafting.dm
+++ b/code/modules/guncrafting/guncrafting.dm
@@ -44,7 +44,7 @@
 	new /obj/item/part/gun/modular/mechanism/shotgun(src)
 	new /obj/item/part/gun/modular/barrel/shotgun(src)
 	new /obj/item/part/gun/frame(src)
-	new /obj/item/part/gun/frame/m1911(src)
+	new /obj/item/part/gun/frame/candor(src)
 	new /obj/item/part/gun/modular/grip/wood(src)
 	new /obj/item/part/gun/modular/mechanism(src)
 	new /obj/item/part/gun/modular/barrel(src)

From f39fe7e454b3372041af7c2d7043c498006fcbdd Mon Sep 17 00:00:00 2001
From: FalloutFalcon <falloutfalconplays@gmail.com>
Date: Mon, 5 Feb 2024 18:04:49 -0600
Subject: [PATCH 51/89] firing pins are the devil i think

---
 .../icemoon_underground_oldstation.dmm        |  1 -
 _maps/RandomRuins/SpaceRuins/oldstation.dmm   |  1 -
 .../shuttles/nanotrasen/nanotrasen_mimir.dmm  |  1 -
 _maps/shuttles/pirate/pirate_ember.dmm        |  4 --
 .../syndicate/syndicate_gorlex_komodo.dmm     |  3 --
 code/__DEFINES/dcs/signals.dm                 |  2 -
 code/datums/components/gunpoint.dm            |  3 --
 code/datums/components/sitcomlaughter.dm      |  2 +-
 code/game/machinery/computer/arcade.dm        |  6 ---
 .../game/objects/items/storage/uplink_kits.dm |  3 --
 .../crates_lockers/closets/secure/security.dm |  2 -
 .../mission_code/stationCollision.dm          |  2 -
 code/modules/cargo/packs/gun.dm               | 19 ---------
 code/modules/projectiles/gun.dm               | 14 -------
 .../projectiles/guns/ballistic/revolver.dm    | 12 ------
 .../modules/projectiles/guns/ballistic/smg.dm |  1 -
 .../modules/projectiles/guns/ballistic/toy.dm |  4 --
 .../projectiles/guns/energy/energy_gun.dm     |  1 -
 code/modules/projectiles/guns/energy/laser.dm |  5 ---
 .../projectiles/guns/energy/special.dm        |  5 ---
 code/modules/projectiles/guns/magic.dm        |  2 -
 .../projectiles/guns/misc/beam_rifle.dm       |  1 -
 .../projectiles/guns/misc/blastcannon.dm      |  6 ---
 .../modules/projectiles/guns/misc/chem_gun.dm |  1 -
 .../projectiles/guns/misc/syringe_gun.dm      |  1 -
 code/modules/projectiles/guns/powered.dm      |  4 --
 .../research/designs/weapon_designs.dm        | 30 --------------
 .../ruins/spaceruin_code/forgottenship.dm     |  8 ----
 .../spells/spell_types/rightandwrong.dm       |  2 -
 code/modules/uplink/uplink_items.dm           | 40 -------------------
 30 files changed, 1 insertion(+), 185 deletions(-)

diff --git a/_maps/RandomRuins/IceRuins/icemoon_underground_oldstation.dmm b/_maps/RandomRuins/IceRuins/icemoon_underground_oldstation.dmm
index b63742662227..84adfe2c8cbb 100644
--- a/_maps/RandomRuins/IceRuins/icemoon_underground_oldstation.dmm
+++ b/_maps/RandomRuins/IceRuins/icemoon_underground_oldstation.dmm
@@ -3941,7 +3941,6 @@
 /obj/machinery/light/small/directional/east,
 /obj/item/assembly/flash/handheld,
 /obj/item/assembly/flash/handheld,
-/obj/item/storage/box/firingpins,
 /obj/structure/closet/crate/secure/weapon{
 	req_access_txt = "203"
 	},
diff --git a/_maps/RandomRuins/SpaceRuins/oldstation.dmm b/_maps/RandomRuins/SpaceRuins/oldstation.dmm
index 1b9136861194..898e1b41f989 100644
--- a/_maps/RandomRuins/SpaceRuins/oldstation.dmm
+++ b/_maps/RandomRuins/SpaceRuins/oldstation.dmm
@@ -8428,7 +8428,6 @@
 /obj/machinery/light/small/directional/east,
 /obj/item/assembly/flash/handheld,
 /obj/item/assembly/flash/handheld,
-/obj/item/storage/box/firingpins,
 /obj/structure/closet/crate/secure/weapon{
 	req_access_txt = "203"
 	},
diff --git a/_maps/shuttles/nanotrasen/nanotrasen_mimir.dmm b/_maps/shuttles/nanotrasen/nanotrasen_mimir.dmm
index 8f7fb343e1a4..126eb82ccd6f 100644
--- a/_maps/shuttles/nanotrasen/nanotrasen_mimir.dmm
+++ b/_maps/shuttles/nanotrasen/nanotrasen_mimir.dmm
@@ -3249,7 +3249,6 @@
 /obj/item/storage/box/handcuffs,
 /obj/item/storage/box/handcuffs,
 /obj/item/storage/box/prisoner,
-/obj/item/storage/box/firingpins,
 /obj/item/storage/box/seccarts,
 /obj/item/storage/box/teargas,
 /obj/item/storage/box/zipties,
diff --git a/_maps/shuttles/pirate/pirate_ember.dmm b/_maps/shuttles/pirate/pirate_ember.dmm
index f114c64f153f..afc537e6e6ff 100644
--- a/_maps/shuttles/pirate/pirate_ember.dmm
+++ b/_maps/shuttles/pirate/pirate_ember.dmm
@@ -4032,10 +4032,6 @@
 	pixel_y = 7;
 	pixel_x = 4
 	},
-/obj/item/storage/box/firingpins{
-	pixel_x = -6;
-	pixel_y = 4
-	},
 /obj/item/storage/box/syndie_kit/throwing_weapons,
 /obj/machinery/light/directional/south,
 /obj/effect/decal/cleanable/dirt,
diff --git a/_maps/shuttles/syndicate/syndicate_gorlex_komodo.dmm b/_maps/shuttles/syndicate/syndicate_gorlex_komodo.dmm
index 68ee81cb02f2..6c86468d04ac 100644
--- a/_maps/shuttles/syndicate/syndicate_gorlex_komodo.dmm
+++ b/_maps/shuttles/syndicate/syndicate_gorlex_komodo.dmm
@@ -1739,9 +1739,6 @@
 	},
 /obj/effect/decal/cleanable/dirt/dust,
 /obj/machinery/airalarm/directional/south,
-/obj/item/storage/box/firingpins{
-	pixel_x = 21
-	},
 /obj/item/clothing/glasses/night{
 	pixel_y = 6
 	},
diff --git a/code/__DEFINES/dcs/signals.dm b/code/__DEFINES/dcs/signals.dm
index 004b2f23fedf..07c5f1d83835 100644
--- a/code/__DEFINES/dcs/signals.dm
+++ b/code/__DEFINES/dcs/signals.dm
@@ -447,8 +447,6 @@
 
 ///From /datum/component/creamed/Initialize()
 #define COMSIG_MOB_CREAMED "mob_creamed"
-///From /obj/item/gun/proc/check_botched()
-#define COMSIG_MOB_CLUMSY_SHOOT_FOOT "mob_clumsy_shoot_foot"
 
 ///When a carbon mob hugs someone, this is called on the carbon that is hugging. (mob/living/hugger, mob/living/hugged)
 #define COMSIG_CARBON_HUG "carbon_hug"
diff --git a/code/datums/components/gunpoint.dm b/code/datums/components/gunpoint.dm
index 2865865c98ab..26bbb641a8eb 100644
--- a/code/datums/components/gunpoint.dm
+++ b/code/datums/components/gunpoint.dm
@@ -126,9 +126,6 @@
 	if(weapon.chambered && weapon.chambered.BB)
 		weapon.chambered.BB.damage *= damage_mult
 
-	if(weapon.check_botched(shooter))
-		return
-
 	weapon.process_fire(target, shooter)
 	qdel(src)
 
diff --git a/code/datums/components/sitcomlaughter.dm b/code/datums/components/sitcomlaughter.dm
index 8dfef21b749d..8a5c32d2e2d1 100644
--- a/code/datums/components/sitcomlaughter.dm
+++ b/code/datums/components/sitcomlaughter.dm
@@ -1,6 +1,6 @@
 /datum/component/wearertargeting/sitcomlaughter
 	valid_slots = list(ITEM_SLOT_HANDS, ITEM_SLOT_BELT, ITEM_SLOT_ID, ITEM_SLOT_LPOCKET, ITEM_SLOT_RPOCKET, ITEM_SLOT_SUITSTORE, ITEM_SLOT_DEX_STORAGE)
-	signals = list(COMSIG_MOB_CREAMED, COMSIG_ON_CARBON_SLIP, COMSIG_ON_VENDOR_CRUSH, COMSIG_MOB_CLUMSY_SHOOT_FOOT)
+	signals = list(COMSIG_MOB_CREAMED, COMSIG_ON_CARBON_SLIP, COMSIG_ON_VENDOR_CRUSH)
 	proctype = PROC_REF(EngageInComedy)
 	mobtype = /mob/living
 	///Sounds used for when user has a sitcom action occur
diff --git a/code/game/machinery/computer/arcade.dm b/code/game/machinery/computer/arcade.dm
index 571d5b090da9..f0d03e645a1d 100644
--- a/code/game/machinery/computer/arcade.dm
+++ b/code/game/machinery/computer/arcade.dm
@@ -88,12 +88,6 @@ GLOBAL_LIST_INIT(arcade_prize_pool, list(
 		prizes *= 2
 	for(var/i = 0, i < prizes, i++)
 		SEND_SIGNAL(user, COMSIG_ADD_MOOD_EVENT, "arcade", /datum/mood_event/arcade)
-		if(prob(0.0001)) //1 in a million
-			new /obj/item/gun/energy/pulse/prize(src)
-			visible_message("<span class='notice'>[src] dispenses.. woah, a gun! Way past cool.</span>", "<span class='notice'>You hear a chime and a shot.</span>")
-			user.client.give_award(/datum/award/achievement/misc/pulse, user)
-			return
-
 		var/prizeselect
 		if(prize_override)
 			prizeselect = pickweight(prize_override)
diff --git a/code/game/objects/items/storage/uplink_kits.dm b/code/game/objects/items/storage/uplink_kits.dm
index cc070ba21d5c..08b9a4f86d81 100644
--- a/code/game/objects/items/storage/uplink_kits.dm
+++ b/code/game/objects/items/storage/uplink_kits.dm
@@ -519,9 +519,6 @@
 	for(var/i in 1 to 3)
 		new/obj/item/grenade/chem_grenade/ez_clean(src)
 
-/obj/item/storage/box/hug/reverse_revolver/PopulateContents()
-	new /obj/item/gun/ballistic/revolver/reverse(src)
-
 /obj/item/storage/box/syndie_kit/mimery/PopulateContents()
 	new /obj/item/book/granter/spell/mimery_blockade(src)
 	new /obj/item/book/granter/spell/mimery_guns(src)
diff --git a/code/game/objects/structures/crates_lockers/closets/secure/security.dm b/code/game/objects/structures/crates_lockers/closets/secure/security.dm
index 66b803e7d041..caeec2241a67 100644
--- a/code/game/objects/structures/crates_lockers/closets/secure/security.dm
+++ b/code/game/objects/structures/crates_lockers/closets/secure/security.dm
@@ -296,7 +296,6 @@
 
 /obj/structure/closet/secure_closet/armory2/PopulateContents()
 	..()
-	new /obj/item/storage/box/firingpins(src)
 	for(var/i in 1 to 3)
 		new /obj/item/storage/box/rubbershot(src)
 	for(var/i in 1 to 3)
@@ -309,7 +308,6 @@
 
 /obj/structure/closet/secure_closet/armory3/PopulateContents()
 	..()
-	new /obj/item/storage/box/firingpins(src)
 	new /obj/item/gun/energy/ionrifle(src)
 	for(var/i in 1 to 3)
 		new /obj/item/gun/energy/e_gun(src)
diff --git a/code/modules/awaymissions/mission_code/stationCollision.dm b/code/modules/awaymissions/mission_code/stationCollision.dm
index 4312d2f89f48..063966c86d63 100644
--- a/code/modules/awaymissions/mission_code/stationCollision.dm
+++ b/code/modules/awaymissions/mission_code/stationCollision.dm
@@ -44,7 +44,6 @@
 	icon_state = "retro"
 	desc = "An older model of the basic lasergun, no longer used by Nanotrasen's security or military forces."
 //	projectile_type = "/obj/projectile/practice"
-	clumsy_check = 0 //No sense in having a harmless gun blow up in the clowns face
 
 //Syndicate sub-machine guns.
 /obj/item/gun/ballistic/automatic/smg/c20r/sc_c20r
@@ -68,7 +67,6 @@
 /obj/item/gun/energy/laser/practice/sc_laser
 	name = "Old laser"
 	desc = "A once potent weapon, years of dust have collected in the chamber and lens of this weapon, weakening the beam significantly."
-	clumsy_check = 0
 
 /*
  * Safe code hints
diff --git a/code/modules/cargo/packs/gun.dm b/code/modules/cargo/packs/gun.dm
index 6ca715889855..45c8d9ba371c 100644
--- a/code/modules/cargo/packs/gun.dm
+++ b/code/modules/cargo/packs/gun.dm
@@ -147,22 +147,3 @@
 	contains = list(/obj/item/gun/ballistic/automatic/assault/ak47,
 					/obj/item/gun/ballistic/automatic/assault/ak47)
 	crate_name = "auto rifle crate"
-
-/*
-		Firing pins
-*/
-
-/datum/supply_pack/gun/firingpins
-	name = "Standard Firing Pins Crate"
-	desc = "Upgrade your arsenal with 10 standard firing pins."
-	cost = 2000
-	contains = list(/obj/item/storage/box/firingpins,
-					/obj/item/storage/box/firingpins)
-	crate_name = "firing pins crate"
-
-/datum/supply_pack/gun/lasertag_pins
-	name = "Laser Tag Firing Pins Crate"
-	desc = "Three laser tag firing pins used in laser-tag units to ensure users are wearing their vests."
-	cost = 1500
-	contains = list(/obj/item/storage/box/lasertagpins)
-	crate_name = "laser tag pin crate"
diff --git a/code/modules/projectiles/gun.dm b/code/modules/projectiles/gun.dm
index 4402a88ead17..3201211fdc5e 100644
--- a/code/modules/projectiles/gun.dm
+++ b/code/modules/projectiles/gun.dm
@@ -314,9 +314,6 @@
 		shoot_with_empty_chamber(user)
 		return
 
-	if(check_botched(user))
-		return
-
 	if(weapon_weight == WEAPON_HEAVY && (!wielded))
 		to_chat(user, "<span class='warning'>You need a more secure grip to fire [src]!</span>")
 		return
@@ -335,17 +332,6 @@
 
 	return process_fire(target, user, TRUE, params, null, bonus_spread)
 
-/obj/item/gun/proc/check_botched(mob/living/user, params)
-	if(clumsy_check)
-		if(istype(user))
-			if(HAS_TRAIT(user, TRAIT_CLUMSY) && prob(40))
-				to_chat(user, "<span class='userdanger'>You shoot yourself in the foot with [src]!</span>")
-				var/shot_leg = pick(BODY_ZONE_L_LEG, BODY_ZONE_R_LEG)
-				process_fire(user, user, FALSE, params, shot_leg)
-				SEND_SIGNAL(user, COMSIG_MOB_CLUMSY_SHOOT_FOOT)
-				user.dropItemToGround(src, TRUE)
-				return TRUE
-
 /obj/item/gun/proc/recharge_newshot()
 	return
 
diff --git a/code/modules/projectiles/guns/ballistic/revolver.dm b/code/modules/projectiles/guns/ballistic/revolver.dm
index 57b088fc16b7..d5cad1c23b48 100644
--- a/code/modules/projectiles/guns/ballistic/revolver.dm
+++ b/code/modules/projectiles/guns/ballistic/revolver.dm
@@ -316,18 +316,6 @@
 		return
 	user.visible_message("<span class='danger'>[user.name]'s soul is captured by \the [src]!</span>", "<span class='userdanger'>You've lost the gamble! Your soul is forfeit!</span>")
 
-/obj/item/gun/ballistic/revolver/reverse //Fires directly at its user... unless the user is a clown, of course.
-	clumsy_check = 0
-
-/obj/item/gun/ballistic/revolver/reverse/can_trigger_gun(mob/living/user)
-	if((HAS_TRAIT(user, TRAIT_CLUMSY)) || (user.mind && user.mind.assigned_role == "Clown"))
-		return ..()
-	if(process_fire(user, user, FALSE, null, BODY_ZONE_HEAD))
-		user.visible_message("<span class='warning'>[user] somehow manages to shoot [user.p_them()]self in the face!</span>", "<span class='userdanger'>You somehow shoot yourself in the face! How the hell?!</span>")
-		user.emote("scream")
-		user.drop_all_held_items()
-		user.Paralyze(80)
-
 /obj/item/gun/ballistic/revolver/srm
 	name = "SRM Standard Issue .357 Revolver" //should have used the pepperbox...
 	desc = "A sturdy, powerful, and reliable revolver utilized by the Saint-Roumain Militia."
diff --git a/code/modules/projectiles/guns/ballistic/smg.dm b/code/modules/projectiles/guns/ballistic/smg.dm
index 696a934e71c4..43944c0fcc50 100644
--- a/code/modules/projectiles/guns/ballistic/smg.dm
+++ b/code/modules/projectiles/guns/ballistic/smg.dm
@@ -18,7 +18,6 @@
 	icon_state = "saber"
 	actions_types = list()
 	mag_type = /obj/item/ammo_box/magazine/smgm9mm
-	pin = null
 	bolt_type = BOLT_TYPE_LOCKING
 	mag_display = TRUE
 	manufacturer = MANUFACTURER_NANOTRASEN_OLD
diff --git a/code/modules/projectiles/guns/ballistic/toy.dm b/code/modules/projectiles/guns/ballistic/toy.dm
index 4d1e7884225c..63c25c5d62f6 100644
--- a/code/modules/projectiles/guns/ballistic/toy.dm
+++ b/code/modules/projectiles/guns/ballistic/toy.dm
@@ -9,7 +9,6 @@
 	throwforce = 0
 	burst_size = 3
 	can_suppress = TRUE
-	clumsy_check = 0
 	item_flags = NONE
 	casing_ejector = FALSE
 	manufacturer = MANUFACTURER_NANOTRASEN
@@ -49,7 +48,6 @@
 	throwforce = 0
 	mag_type = /obj/item/ammo_box/magazine/internal/shot/toy
 	fire_sound = 'sound/items/syringeproj.ogg'
-	clumsy_check = FALSE
 	item_flags = NONE
 	casing_ejector = FALSE
 	can_suppress = FALSE
@@ -88,7 +86,6 @@
 	mag_type = /obj/item/ammo_box/magazine/toy/smgm45/riot
 	fire_sound = 'sound/items/syringeproj.ogg'
 	casing_ejector = FALSE
-	clumsy_check = FALSE
 	manufacturer = MANUFACTURER_DONKCO
 	recoil = -10 //its a toy...
 	recoil_unwielded = -10
@@ -105,7 +102,6 @@
 	item_flags = NONE
 	mag_type = /obj/item/ammo_box/magazine/toy/m762/riot
 	casing_ejector = FALSE
-	clumsy_check = FALSE
 	manufacturer = MANUFACTURER_DONKCO
 	recoil = -10 //its a toy...
 	recoil_unwielded = -10
diff --git a/code/modules/projectiles/guns/energy/energy_gun.dm b/code/modules/projectiles/guns/energy/energy_gun.dm
index d8dbc159a8d0..e1887f0ea425 100644
--- a/code/modules/projectiles/guns/energy/energy_gun.dm
+++ b/code/modules/projectiles/guns/energy/energy_gun.dm
@@ -128,7 +128,6 @@
 	icon_state = "nucgun"
 	item_state = "nucgun"
 	charge_delay = 5
-	pin = null
 	can_charge = FALSE
 	internal_cell = TRUE
 	ammo_x_offset = 2
diff --git a/code/modules/projectiles/guns/energy/laser.dm b/code/modules/projectiles/guns/energy/laser.dm
index 8e3774737c06..3456eabe0901 100644
--- a/code/modules/projectiles/guns/energy/laser.dm
+++ b/code/modules/projectiles/guns/energy/laser.dm
@@ -18,7 +18,6 @@
 	name = "practice laser gun"
 	desc = "A modified version of the L-204 laser gun, this one fires less concentrated energy bolts designed for target practice."
 	ammo_type = list(/obj/item/ammo_casing/energy/laser/practice)
-	clumsy_check = TRUE
 	item_flags = NONE
 
 /obj/item/gun/energy/laser/retro
@@ -92,7 +91,6 @@
 	flags_1 =  CONDUCT_1
 	slot_flags = ITEM_SLOT_BACK
 	ammo_type = list(/obj/item/ammo_casing/energy/laser/accelerator)
-	pin = null
 	ammo_x_offset = 3
 	manufacturer = MANUFACTURER_SHARPLITE
 
@@ -119,7 +117,6 @@
 	icon_state = "xray"
 	item_state = null
 	ammo_type = list(/obj/item/ammo_casing/energy/xray)
-	pin = null
 	ammo_x_offset = 3
 
 ////////Laser Tag////////////////////
@@ -130,7 +127,6 @@
 	desc = "A retro laser gun modified to fire harmless blue beams of light. Sound effects included!"
 	ammo_type = list(/obj/item/ammo_casing/energy/laser/bluetag)
 	item_flags = NONE
-	clumsy_check = FALSE
 	ammo_x_offset = 2
 	selfcharge = TRUE
 	manufacturer = MANUFACTURER_NONE
@@ -144,7 +140,6 @@
 	desc = "A retro laser gun modified to fire harmless beams red of light. Sound effects included!"
 	ammo_type = list(/obj/item/ammo_casing/energy/laser/redtag)
 	item_flags = NONE
-	clumsy_check = FALSE
 	ammo_x_offset = 2
 	selfcharge = TRUE
 	manufacturer = MANUFACTURER_NONE
diff --git a/code/modules/projectiles/guns/energy/special.dm b/code/modules/projectiles/guns/energy/special.dm
index d8291feae088..27b7b65b622d 100644
--- a/code/modules/projectiles/guns/energy/special.dm
+++ b/code/modules/projectiles/guns/energy/special.dm
@@ -25,7 +25,6 @@
 	slot_flags = ITEM_SLOT_BELT
 	ammo_x_offset = 2
 	ammo_y_offset = 0
-	pin = null
 	can_flashlight = TRUE
 	flight_x_offset = 18
 	flight_y_offset = 11
@@ -35,7 +34,6 @@
 	desc = "A gun that discharges high amounts of controlled radiation to slowly break a target into component elements."
 	icon_state = "decloner"
 	ammo_type = list(/obj/item/ammo_casing/energy/declone)
-	pin = null
 	ammo_x_offset = 1
 
 /obj/item/gun/energy/decloner/update_overlays()
@@ -63,7 +61,6 @@
 	w_class = WEIGHT_CLASS_BULKY
 	ammo_type = list(/obj/item/ammo_casing/energy/meteor)
 	cell_type = /obj/item/stock_parts/cell/potato
-	clumsy_check = 0 //Admin spawn only, might as well let clowns use it.
 	selfcharge = 1
 
 /obj/item/gun/energy/meteorgun/pen
@@ -117,7 +114,6 @@
 	custom_materials = list(/datum/material/iron=4000)
 	suppressed = null
 	ammo_type = list(/obj/item/ammo_casing/energy/bolt/large)
-	pin = null
 	manufacturer = MANUFACTURER_NONE
 
 
@@ -332,7 +328,6 @@
 	ammo_type = list(/obj/item/ammo_casing/energy/temp, /obj/item/ammo_casing/energy/temp/hot)
 	cell_type = /obj/item/stock_parts/cell/gun/upgraded
 	ammo_x_offset = 2
-	pin = null
 
 /obj/item/gun/energy/temperature/security
 	name = "security temperature gun"
diff --git a/code/modules/projectiles/guns/magic.dm b/code/modules/projectiles/guns/magic.dm
index 63c4ef8aa2d0..9360c24be499 100644
--- a/code/modules/projectiles/guns/magic.dm
+++ b/code/modules/projectiles/guns/magic.dm
@@ -17,9 +17,7 @@
 	var/can_charge = TRUE
 	var/ammo_type
 	var/no_den_usage
-	clumsy_check = 0
 	trigger_guard = TRIGGER_GUARD_ALLOW_ALL // Has no trigger at all, uses magic instead
-	pin = /obj/item/firing_pin/magic
 
 /obj/item/gun/magic/process_fire(atom/target, mob/living/user, message, params, zone_override, bonus_spread)
 	if(no_den_usage)
diff --git a/code/modules/projectiles/guns/misc/beam_rifle.dm b/code/modules/projectiles/guns/misc/beam_rifle.dm
index cdd54d60c579..8b6626bc5e97 100644
--- a/code/modules/projectiles/guns/misc/beam_rifle.dm
+++ b/code/modules/projectiles/guns/misc/beam_rifle.dm
@@ -32,7 +32,6 @@
 	big_gun = TRUE
 	cell_type = "/obj/item/stock_parts/cell/gun/large"
 	canMouseDown = TRUE
-	pin = null
 	var/aiming = FALSE
 	var/aiming_time = 12
 	var/aiming_time_fire_threshold = 5
diff --git a/code/modules/projectiles/guns/misc/blastcannon.dm b/code/modules/projectiles/guns/misc/blastcannon.dm
index 888e680479ea..161aa216b866 100644
--- a/code/modules/projectiles/guns/misc/blastcannon.dm
+++ b/code/modules/projectiles/guns/misc/blastcannon.dm
@@ -8,7 +8,6 @@
 	force = 10
 	fire_sound = 'sound/weapons/blastcannon.ogg'
 	item_flags = NONE
-	clumsy_check = FALSE
 	randomspread = FALSE
 
 	var/hugbox = TRUE
@@ -26,11 +25,6 @@
 	debug_power = 80
 	bombcheck = FALSE
 
-/obj/item/gun/blastcannon/Initialize()
-	. = ..()
-	if(!pin)
-		pin = new
-
 /obj/item/gun/blastcannon/Destroy()
 	QDEL_NULL(bomb)
 	return ..()
diff --git a/code/modules/projectiles/guns/misc/chem_gun.dm b/code/modules/projectiles/guns/misc/chem_gun.dm
index 6d9c5eda699d..fef47121af5f 100644
--- a/code/modules/projectiles/guns/misc/chem_gun.dm
+++ b/code/modules/projectiles/guns/misc/chem_gun.dm
@@ -10,7 +10,6 @@
 	throw_range = 7
 	force = 4
 	custom_materials = list(/datum/material/iron=2000)
-	clumsy_check = FALSE
 	fire_sound = 'sound/items/syringeproj.ogg'
 	var/time_per_syringe = 250
 	var/syringes_left = 4
diff --git a/code/modules/projectiles/guns/misc/syringe_gun.dm b/code/modules/projectiles/guns/misc/syringe_gun.dm
index 34af73b855c6..96927eb91afc 100644
--- a/code/modules/projectiles/guns/misc/syringe_gun.dm
+++ b/code/modules/projectiles/guns/misc/syringe_gun.dm
@@ -8,7 +8,6 @@
 	throw_range = 7
 	force = 4
 	custom_materials = list(/datum/material/iron=2000)
-	clumsy_check = 0
 	fire_sound = 'sound/items/syringeproj.ogg'
 	var/list/syringes = list()
 	var/max_syringes = 1
diff --git a/code/modules/projectiles/guns/powered.dm b/code/modules/projectiles/guns/powered.dm
index 698826436b18..ac7418748d9b 100644
--- a/code/modules/projectiles/guns/powered.dm
+++ b/code/modules/projectiles/guns/powered.dm
@@ -52,10 +52,6 @@
 /obj/item/gun/ballistic/automatic/powered/get_cell()
 	return cell
 
-/obj/item/gun/ballistic/automatic/powered/nopin
-	pin = null
-	spawnwithmagazine = FALSE
-
 //the things below were taken from energy gun code. blame whoever coded this, not me
 /obj/item/gun/ballistic/automatic/powered/attackby(obj/item/A, mob/user, params)
 	if (!internal_cell && istype(A, /obj/item/stock_parts/cell/gun))
diff --git a/code/modules/research/designs/weapon_designs.dm b/code/modules/research/designs/weapon_designs.dm
index 4d28452521af..68e9362fd424 100644
--- a/code/modules/research/designs/weapon_designs.dm
+++ b/code/modules/research/designs/weapon_designs.dm
@@ -67,36 +67,6 @@
 	category = list("Ammo")
 	departmental_flags = DEPARTMENTAL_FLAG_SECURITY | DEPARTMENTAL_FLAG_BALLISTICS
 
-/datum/design/pin_testing
-	name = "Test-Range Firing Pin"
-	desc = "This safety firing pin allows firearms to be operated within proximity to a firing range."
-	id = "pin_testing"
-	build_type = PROTOLATHE
-	materials = list(/datum/material/iron = 500, /datum/material/glass = 300)
-	build_path = /obj/item/firing_pin/test_range
-	category = list("Firing Pins")
-	departmental_flags = DEPARTMENTAL_FLAG_SECURITY
-
-/datum/design/pin_mindshield
-	name = "Mindshield Firing Pin"
-	desc = "This is a security firing pin which only authorizes users who are mindshield-implanted."
-	id = "pin_loyalty"
-	build_type = PROTOLATHE
-	materials = list(/datum/material/silver = 600, /datum/material/diamond = 600, /datum/material/uranium = 200)
-	build_path = /obj/item/firing_pin/implant/mindshield
-	category = list("Firing Pins")
-	departmental_flags = DEPARTMENTAL_FLAG_SECURITY
-
-/datum/design/pin
-	name = "Standard Firing Pin"
-	desc = "A simple, electronic firing pin which is required in most standardized modern weapons."
-	id = "pin_standard"
-	build_type = PROTOLATHE
-	materials = list(/datum/material/silver = 600, /datum/material/diamond = 600, /datum/material/uranium = 200)
-	build_path = /obj/item/firing_pin
-	category = list("Firing Pins")
-	departmental_flags = DEPARTMENTAL_FLAG_SECURITY | DEPARTMENTAL_FLAG_BALLISTICS
-
 /datum/design/stunrevolver
 	name = "Tesla Canon"
 	desc = "A high-tech cannon that fires internal, reusable bolt cartridges in a revolving cylinder. The cartridges can be recharged using conventional rechargers"
diff --git a/code/modules/ruins/spaceruin_code/forgottenship.dm b/code/modules/ruins/spaceruin_code/forgottenship.dm
index 8e3ae585d73d..def148f22239 100644
--- a/code/modules/ruins/spaceruin_code/forgottenship.dm
+++ b/code/modules/ruins/spaceruin_code/forgottenship.dm
@@ -47,14 +47,6 @@ GLOBAL_VAR_INIT(fscpassword, generate_password())
 	. = ..()
 	AddComponent(/datum/component/gps, "Old Encrypted Signal")
 
-/obj/item/storage/box/firingpins/syndicate
-	name = "box of syndicate firing pins"
-	desc = "A box full of special syndicate firing pins which allow only syndicate operatives to use weapons with those firing pins."
-
-/obj/item/storage/box/firingpins/syndicate/PopulateContents()
-	for(var/i in 1 to 5)
-		new /obj/item/firing_pin/implant/pindicate(src)
-
 ///////////	AI Laws
 
 /obj/item/aiModule/core/full/cybersun
diff --git a/code/modules/spells/spell_types/rightandwrong.dm b/code/modules/spells/spell_types/rightandwrong.dm
index ee40b2782574..60ad5ce9399c 100644
--- a/code/modules/spells/spell_types/rightandwrong.dm
+++ b/code/modules/spells/spell_types/rightandwrong.dm
@@ -118,8 +118,6 @@ GLOBAL_VAR_INIT(summon_magic_triggered, FALSE)
 
 	var/gun_type = pick(GLOB.summoned_guns)
 	var/obj/item/gun/G = new gun_type(get_turf(H))
-	if (istype(G)) // The list contains some non-gun type guns like the speargun which do not have this proc
-		G.unlock()
 	playsound(get_turf(H),'sound/magic/summon_guns.ogg', 50, TRUE)
 
 	var/in_hand = H.put_in_hands(G) // not always successful
diff --git a/code/modules/uplink/uplink_items.dm b/code/modules/uplink/uplink_items.dm
index 53b49ab30f0b..c045387546ed 100644
--- a/code/modules/uplink/uplink_items.dm
+++ b/code/modules/uplink/uplink_items.dm
@@ -365,22 +365,6 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item))
 	surplus = 0
 	include_modes = list(/datum/game_mode/nuclear/clown_ops)
 
-/datum/uplink_item/dangerous/clownoppin
-	name = "Ultra Hilarious Firing Pin"
-	desc = "A firing pin that, when inserted into a gun, makes that gun only useable by clowns and clumsy people and makes that gun honk whenever anyone tries to fire it."
-	cost = 1 //much cheaper for clown ops than for clowns
-	item = /obj/item/firing_pin/clown/ultra
-	include_modes = list(/datum/game_mode/nuclear/clown_ops)
-	illegal_tech = FALSE
-
-/datum/uplink_item/dangerous/clownopsuperpin
-	name = "Super Ultra Hilarious Firing Pin"
-	desc = "Like the ultra hilarious firing pin, except the gun you insert this pin into explodes when someone who isn't clumsy or a clown tries to fire it."
-	cost = 4 //much cheaper for clown ops than for clowns
-	item = /obj/item/firing_pin/clown/ultra/selfdestruct
-	include_modes = list(/datum/game_mode/nuclear/clown_ops)
-	illegal_tech = FALSE
-
 /datum/uplink_item/dangerous/bioterror
 	name = "Biohazardous Chemical Sprayer"
 	desc = "A handheld chemical sprayer that allows a wide dispersal of selected chemicals. Especially tailored by the Tiger \
@@ -1952,30 +1936,6 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item))
 	item = /obj/item/reverse_bear_trap
 	restricted_roles = list("Clown")
 
-/datum/uplink_item/role_restricted/reverse_revolver
-	name = "Reverse Revolver"
-	desc = "A revolver that always fires at its user. \"Accidentally\" drop your weapon, then watch as the greedy corporate pigs blow their own brains all over the wall. \
-	The revolver itself is actually real. Only clumsy people, and clowns, can fire it normally. Comes in a box of hugs. Honk."
-	cost = 14
-	item = /obj/item/storage/box/hug/reverse_revolver
-	restricted_roles = list("Clown")
-
-/datum/uplink_item/role_restricted/clownpin
-	name = "Ultra Hilarious Firing Pin"
-	desc = "A firing pin that, when inserted into a gun, makes that gun only usable by clowns and clumsy people and makes that gun honk whenever anyone tries to fire it."
-	cost = 4
-	item = /obj/item/firing_pin/clown/ultra
-	restricted_roles = list("Clown")
-	illegal_tech = FALSE
-
-/datum/uplink_item/role_restricted/clownsuperpin
-	name = "Super Ultra Hilarious Firing Pin"
-	desc = "Like the ultra hilarious firing pin, except the gun you insert this pin into explodes when someone who isn't clumsy or a clown tries to fire it."
-	cost = 7
-	item = /obj/item/firing_pin/clown/ultra/selfdestruct
-	restricted_roles = list("Clown")
-	illegal_tech = FALSE
-
 /datum/uplink_item/role_restricted/laser_arm
 	name = "Laser Arm Implant"
 	desc = "An implant that grants you a recharging laser gun inside your arm. Weak to EMPs. Comes with a syndicate autosurgeon for immediate self-application."

From bc765fa2889342a63cf44b92274b66f65b71d1bc Mon Sep 17 00:00:00 2001
From: FalloutFalcon <falloutfalconplays@gmail.com>
Date: Mon, 5 Feb 2024 18:12:53 -0600
Subject: [PATCH 52/89] ok no errors?

---
 _maps/RandomRuins/RockRuins/rockplanet_harmfactory.dmm | 2 +-
 _maps/shuttles/syndicate/syndicate_luxembourg.dmm      | 2 +-
 code/game/objects/items/storage/uplink_kits.dm         | 2 +-
 code/modules/vending/liberation_toy.dm                 | 2 +-
 4 files changed, 4 insertions(+), 4 deletions(-)

diff --git a/_maps/RandomRuins/RockRuins/rockplanet_harmfactory.dmm b/_maps/RandomRuins/RockRuins/rockplanet_harmfactory.dmm
index 48f7614da429..c3d59b531da1 100644
--- a/_maps/RandomRuins/RockRuins/rockplanet_harmfactory.dmm
+++ b/_maps/RandomRuins/RockRuins/rockplanet_harmfactory.dmm
@@ -251,7 +251,7 @@
 /area/ruin/powered)
 "ga" = (
 /obj/structure/table/wood/reinforced,
-/obj/item/gun/ballistic/automatic/smg/c20r/toy/riot{
+/obj/item/gun/ballistic/automatic/smg/c20r/toy{
 	pixel_x = 5;
 	pixel_y = 7
 	},
diff --git a/_maps/shuttles/syndicate/syndicate_luxembourg.dmm b/_maps/shuttles/syndicate/syndicate_luxembourg.dmm
index cff4c84386e0..991d2769c163 100644
--- a/_maps/shuttles/syndicate/syndicate_luxembourg.dmm
+++ b/_maps/shuttles/syndicate/syndicate_luxembourg.dmm
@@ -831,7 +831,7 @@
 /obj/structure/closet/crate/wooden/toy,
 /obj/item/ammo_box/magazine/toy/smgm45/riot,
 /obj/item/ammo_box/magazine/toy/smgm45/riot,
-/obj/item/gun/ballistic/automatic/smg/c20r/toy/riot,
+/obj/item/gun/ballistic/automatic/smg/c20r/toy,
 /obj/item/soap/syndie,
 /obj/item/soap/syndie,
 /obj/item/soap/syndie,
diff --git a/code/game/objects/items/storage/uplink_kits.dm b/code/game/objects/items/storage/uplink_kits.dm
index d91fc622cd56..e47922ae3623 100644
--- a/code/game/objects/items/storage/uplink_kits.dm
+++ b/code/game/objects/items/storage/uplink_kits.dm
@@ -306,7 +306,7 @@
 		/obj/item/storage/box/syndie_kit/imp_radio,
 		/obj/item/storage/box/syndie_kit/imp_uplink,
 		/obj/item/clothing/gloves/krav_maga/combatglovesplus,
-		/obj/item/gun/ballistic/automatic/smg/c20r/toy/riot,
+		/obj/item/gun/ballistic/automatic/smg/c20r/toy,
 		/obj/item/reagent_containers/hypospray/medipen/stimulants,
 		/obj/item/storage/box/syndie_kit/imp_freedom,
 		/obj/item/toy/eightball/haunted
diff --git a/code/modules/vending/liberation_toy.dm b/code/modules/vending/liberation_toy.dm
index 23a65a503c96..19301643fac4 100644
--- a/code/modules/vending/liberation_toy.dm
+++ b/code/modules/vending/liberation_toy.dm
@@ -17,7 +17,7 @@
 					/obj/item/clothing/head/syndicatefake = 5) //OPS IN DORMS oh wait it's just an assistant
 	contraband = list(
 		/obj/item/gun/ballistic/shotgun/toy/crossbow = 10,   //Congrats, you unlocked the +18 setting!
-		/obj/item/gun/ballistic/automatic/smg/c20r/toy/riot = 10,
+		/obj/item/gun/ballistic/automatic/smg/c20r/toy = 10,
 		/obj/item/gun/ballistic/automatic/hmg/l6_saw/toy/riot = 10,
 		/obj/item/ammo_box/foambox/riot = 20,
 		/obj/item/toy/katana = 10,

From 6c3113db54e8f802b90a14dd34505af24d58e5a7 Mon Sep 17 00:00:00 2001
From: FalloutFalcon <falloutfalconplays@gmail.com>
Date: Mon, 5 Feb 2024 18:20:36 -0600
Subject: [PATCH 53/89] some more

---
 _maps/shuttles/nanotrasen/nanotrasen_ranger.dmm |  2 +-
 code/modules/research/techweb/all_nodes.dm      | 13 ++-----------
 2 files changed, 3 insertions(+), 12 deletions(-)

diff --git a/_maps/shuttles/nanotrasen/nanotrasen_ranger.dmm b/_maps/shuttles/nanotrasen/nanotrasen_ranger.dmm
index ed46e7e7ef1e..0bf245f53010 100644
--- a/_maps/shuttles/nanotrasen/nanotrasen_ranger.dmm
+++ b/_maps/shuttles/nanotrasen/nanotrasen_ranger.dmm
@@ -3117,7 +3117,7 @@
 /area/ship/engineering)
 "Ha" = (
 /obj/structure/closet/secure_closet/lp/lieutenant,
-/obj/item/gun/energy/e_gun/mindshield{
+/obj/item/gun/energy/e_gun{
 	pixel_y = 1
 	},
 /obj/item/stock_parts/cell/gun,
diff --git a/code/modules/research/techweb/all_nodes.dm b/code/modules/research/techweb/all_nodes.dm
index 12ce53dc175d..769449c42bb5 100644
--- a/code/modules/research/techweb/all_nodes.dm
+++ b/code/modules/research/techweb/all_nodes.dm
@@ -641,7 +641,7 @@
 	display_name = "Weapon Development Technology"
 	description = "Our researchers have found new ways to weaponize just about everything now."
 	prereq_ids = list("engineering")
-	design_ids = list("pin_testing", "tele_shield","gun_cell")
+	design_ids = list("tele_shield","gun_cell")
 	research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 10000)
 	export_price = 5000
 
@@ -650,19 +650,10 @@
 	display_name = "Advanced Weapon Development Technology"
 	description = "Our weapons are breaking the rules of reality by now."
 	prereq_ids = list("adv_engi", "weaponry")
-	design_ids = list("pin_loyalty", "gun_cell_upgraded", "gun_cell_large")
+	design_ids = list("gun_cell_upgraded", "gun_cell_large")
 	research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 10000)
 	export_price = 5000
 
-/datum/techweb_node/firingpin
-	id = "firingpin"
-	display_name = "Pin Security Decompilation"
-	description = "A resource-intensive hacking operation, allowing for the creation of pins without a mindshield brake."
-	prereq_ids = list("adv_weaponry")
-	design_ids = list("pin_standard")
-	research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 15000)
-	export_price = 5000
-
 /datum/techweb_node/electric_weapons
 	id = "electronic_weapons"
 	display_name = "Electric Weapons"

From 598154059e6d759ae459174ab69e34cdfebcde62 Mon Sep 17 00:00:00 2001
From: FalloutFalcon <falloutfalconplays@gmail.com>
Date: Mon, 5 Feb 2024 18:38:51 -0600
Subject: [PATCH 54/89] than k you thingrvr :thumbsup:

---
 check_regex.yaml | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/check_regex.yaml b/check_regex.yaml
index df64dec9aae1..d19ee9828e4e 100644
--- a/check_regex.yaml
+++ b/check_regex.yaml
@@ -29,7 +29,7 @@ standards:
     - exactly: [1, "/area text paths", '"/area']
     - exactly: [17, "/datum text paths", '"/datum']
     - exactly: [4, "/mob text paths", '"/mob']
-    - exactly: [44, "/obj text paths", '"/obj']
+    - exactly: [43, "/obj text paths", '"/obj']
     - exactly: [0, "/turf text paths", '"/turf']
     - exactly: [117, "text2path uses", "text2path"]
 

From 7547ca674920b482e5344523e7bb879d822b44c5 Mon Sep 17 00:00:00 2001
From: fallcon <falloutfalconplays@gmail.com>
Date: Wed, 7 Feb 2024 13:25:26 -0600
Subject: [PATCH 55/89] proper foam darts where needed

---
 .../RandomRuins/RockRuins/rockplanet_harmfactory.dmm  |  2 +-
 _maps/shuttles/syndicate/syndicate_luxembourg.dmm     |  2 +-
 code/game/objects/items/storage/backpack.dm           |  4 ++--
 code/game/objects/items/storage/uplink_kits.dm        |  2 +-
 code/modules/projectiles/guns/ballistic/toy.dm        | 11 +++++++----
 code/modules/uplink/uplink_items.dm                   |  4 ++--
 code/modules/vending/liberation_toy.dm                |  2 +-
 7 files changed, 15 insertions(+), 12 deletions(-)

diff --git a/_maps/RandomRuins/RockRuins/rockplanet_harmfactory.dmm b/_maps/RandomRuins/RockRuins/rockplanet_harmfactory.dmm
index c3d59b531da1..48f7614da429 100644
--- a/_maps/RandomRuins/RockRuins/rockplanet_harmfactory.dmm
+++ b/_maps/RandomRuins/RockRuins/rockplanet_harmfactory.dmm
@@ -251,7 +251,7 @@
 /area/ruin/powered)
 "ga" = (
 /obj/structure/table/wood/reinforced,
-/obj/item/gun/ballistic/automatic/smg/c20r/toy{
+/obj/item/gun/ballistic/automatic/smg/c20r/toy/riot{
 	pixel_x = 5;
 	pixel_y = 7
 	},
diff --git a/_maps/shuttles/syndicate/syndicate_luxembourg.dmm b/_maps/shuttles/syndicate/syndicate_luxembourg.dmm
index 991d2769c163..cff4c84386e0 100644
--- a/_maps/shuttles/syndicate/syndicate_luxembourg.dmm
+++ b/_maps/shuttles/syndicate/syndicate_luxembourg.dmm
@@ -831,7 +831,7 @@
 /obj/structure/closet/crate/wooden/toy,
 /obj/item/ammo_box/magazine/toy/smgm45/riot,
 /obj/item/ammo_box/magazine/toy/smgm45/riot,
-/obj/item/gun/ballistic/automatic/smg/c20r/toy,
+/obj/item/gun/ballistic/automatic/smg/c20r/toy/riot,
 /obj/item/soap/syndie,
 /obj/item/soap/syndie,
 /obj/item/soap/syndie,
diff --git a/code/game/objects/items/storage/backpack.dm b/code/game/objects/items/storage/backpack.dm
index b4ec267bd770..dc750fb15594 100644
--- a/code/game/objects/items/storage/backpack.dm
+++ b/code/game/objects/items/storage/backpack.dm
@@ -644,7 +644,7 @@
 /obj/item/storage/backpack/duffelbag/syndie/med/medicalbundle/PopulateContents()
 	new /obj/item/clothing/shoes/magboots/syndie(src)
 	new /obj/item/storage/firstaid/tactical(src)
-	new /obj/item/gun/ballistic/automatic/hmg/l6_saw/toy(src)
+	new /obj/item/gun/ballistic/automatic/hmg/l6_saw/toy/riot(src)
 	new /obj/item/ammo_box/foambox/riot(src)
 
 /obj/item/storage/backpack/duffelbag/syndie/med/bioterrorbundle
@@ -654,7 +654,7 @@
 	new /obj/item/reagent_containers/spray/chemsprayer/bioterror(src)
 	new /obj/item/storage/box/syndie_kit/chemical(src)
 	new /obj/item/gun/syringe/syndicate(src)
-	new /obj/item/gun/ballistic/automatic/smg/c20r/toy(src)
+	new /obj/item/gun/ballistic/automatic/smg/c20r/toy/riot(src)
 	new /obj/item/storage/box/syringes(src)
 	new /obj/item/ammo_box/foambox/riot(src)
 	new /obj/item/grenade/chem_grenade/bioterrorfoam(src)
diff --git a/code/game/objects/items/storage/uplink_kits.dm b/code/game/objects/items/storage/uplink_kits.dm
index e47922ae3623..d91fc622cd56 100644
--- a/code/game/objects/items/storage/uplink_kits.dm
+++ b/code/game/objects/items/storage/uplink_kits.dm
@@ -306,7 +306,7 @@
 		/obj/item/storage/box/syndie_kit/imp_radio,
 		/obj/item/storage/box/syndie_kit/imp_uplink,
 		/obj/item/clothing/gloves/krav_maga/combatglovesplus,
-		/obj/item/gun/ballistic/automatic/smg/c20r/toy,
+		/obj/item/gun/ballistic/automatic/smg/c20r/toy/riot,
 		/obj/item/reagent_containers/hypospray/medipen/stimulants,
 		/obj/item/storage/box/syndie_kit/imp_freedom,
 		/obj/item/toy/eightball/haunted
diff --git a/code/modules/projectiles/guns/ballistic/toy.dm b/code/modules/projectiles/guns/ballistic/toy.dm
index 63c25c5d62f6..95911c9269bc 100644
--- a/code/modules/projectiles/guns/ballistic/toy.dm
+++ b/code/modules/projectiles/guns/ballistic/toy.dm
@@ -78,29 +78,32 @@
 	recoil = -10 //its a toy...
 	recoil_unwielded = -10
 
-/obj/item/gun/ballistic/automatic/smg/c20r/toy //This is the syndicate variant with syndicate firing pin and riot darts.
+/obj/item/gun/ballistic/automatic/smg/c20r/toy
 	name = "donksoft SMG"
 	desc = "A bullpup two-round burst toy SMG, designated 'C-20r'. Ages 8 and up."
 	can_suppress = FALSE
 	item_flags = NONE
-	mag_type = /obj/item/ammo_box/magazine/toy/smgm45/riot
+	mag_type = /obj/item/ammo_box/magazine/toy/smgm45
 	fire_sound = 'sound/items/syringeproj.ogg'
 	casing_ejector = FALSE
 	manufacturer = MANUFACTURER_DONKCO
 	recoil = -10 //its a toy...
 	recoil_unwielded = -10
 
+/obj/item/gun/ballistic/automatic/smg/c20r/toy/riot
+	mag_type = /obj/item/ammo_box/magazine/toy/smgm45/riot
+
 /obj/item/gun/ballistic/automatic/smg/c20r/toy/update_overlays()
 	. = ..()
 	. += "[icon_state]_toy"
 
-/obj/item/gun/ballistic/automatic/hmg/l6_saw/toy //This is the syndicate variant with syndicate firing pin and riot darts.
+/obj/item/gun/ballistic/automatic/hmg/l6_saw/toy
 	name = "donksoft LMG"
 	desc = "A heavily modified toy light machine gun, designated 'L6 SAW'. Ages 8 and up."
 	fire_sound = 'sound/items/syringeproj.ogg'
 	can_suppress = FALSE
 	item_flags = NONE
-	mag_type = /obj/item/ammo_box/magazine/toy/m762/riot
+	mag_type = /obj/item/ammo_box/magazine/toy/m762
 	casing_ejector = FALSE
 	manufacturer = MANUFACTURER_DONKCO
 	recoil = -10 //its a toy...
diff --git a/code/modules/uplink/uplink_items.dm b/code/modules/uplink/uplink_items.dm
index 6943b4edd4e2..f58f94df84dd 100644
--- a/code/modules/uplink/uplink_items.dm
+++ b/code/modules/uplink/uplink_items.dm
@@ -516,7 +516,7 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item))
 /datum/uplink_item/dangerous/foamsmg
 	name = "Toy Submachine Gun"
 	desc = "A fully-loaded Donksoft bullpup submachine gun that fires riot grade darts with a 20-round magazine."
-	item = /obj/item/gun/ballistic/automatic/smg/c20r/toy
+	item = /obj/item/gun/ballistic/automatic/smg/c20r/toy/riot
 	cost = 5
 	surplus = 0
 	include_modes = list(/datum/game_mode/nuclear, /datum/game_mode/nuclear/clown_ops)
@@ -525,7 +525,7 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item))
 	name = "Toy Machine Gun"
 	desc = "A fully-loaded Donksoft belt-fed machine gun. This weapon has a massive 50-round magazine of devastating \
 			riot grade darts, that can briefly incapacitate someone in just one volley."
-	item = /obj/item/gun/ballistic/automatic/hmg/l6_saw/toy
+	item = /obj/item/gun/ballistic/automatic/hmg/l6_saw/toy/riot
 	cost = 10
 	surplus = 0
 	include_modes = list(/datum/game_mode/nuclear, /datum/game_mode/nuclear/clown_ops)
diff --git a/code/modules/vending/liberation_toy.dm b/code/modules/vending/liberation_toy.dm
index 19301643fac4..8bf1121ee157 100644
--- a/code/modules/vending/liberation_toy.dm
+++ b/code/modules/vending/liberation_toy.dm
@@ -18,7 +18,7 @@
 	contraband = list(
 		/obj/item/gun/ballistic/shotgun/toy/crossbow = 10,   //Congrats, you unlocked the +18 setting!
 		/obj/item/gun/ballistic/automatic/smg/c20r/toy = 10,
-		/obj/item/gun/ballistic/automatic/hmg/l6_saw/toy/riot = 10,
+		/obj/item/gun/ballistic/automatic/hmg/l6_saw/toy = 10,
 		/obj/item/ammo_box/foambox/riot = 20,
 		/obj/item/toy/katana = 10,
 		/obj/item/dualsaber/toy = 5,

From a4604f455980a031c75f831de562a639892ea11a Mon Sep 17 00:00:00 2001
From: FalloutFalcon <falloutfalconplays@gmail.com>
Date: Thu, 29 Feb 2024 15:13:02 -0600
Subject: [PATCH 56/89] ya

---
 code/modules/guncrafting/frame.dm | 43 +++++++++++++++++++++----------
 code/modules/guncrafting/lathe.dm |  4 ++-
 2 files changed, 33 insertions(+), 14 deletions(-)

diff --git a/code/modules/guncrafting/frame.dm b/code/modules/guncrafting/frame.dm
index de54637a7190..6ab248e373f6 100644
--- a/code/modules/guncrafting/frame.dm
+++ b/code/modules/guncrafting/frame.dm
@@ -118,25 +118,42 @@
 /obj/item/part/gun/frame/attack_self(mob/user)
 	var/list/choose_options = list()
 	var/list/option_results = list()
+
 	for(var/datum/lathe_recipe/gun/recipe in filtered_recipes)
 		var/obj/recipe_result = recipe.result
-		var/list/parts_for_craft = list()
-		for(var/obj/item/part/gun/part as anything in recipe.valid_parts)
-			var/part_type = initial(part.gun_part_type)
-			var/list/installed_types = get_part_types()
-			if(!(part_type in installed_types))
-				parts_for_craft += "	\a [initial(part.name)]"
-		if(length(parts_for_craft) != 0)
-			to_chat(user, span_warning("Parts needed for a [initial(recipe_result.name)]:"))
-			for(var/part in parts_for_craft)
-				to_chat(user, span_warning(part))
+		var/list/missing_parts = get_missing_parts_for_recipe(recipe)
+
+		if(length(missing_parts) != 0)
+			display_missing_parts_warning(user, recipe_result, missing_parts)
 		else
-			to_chat(user, span_notice("You can craft a [initial(recipe_result.name)] with the parts installed."))
-			choose_options += list("Craft [initial(recipe_result.name)]" = image(icon = initial(recipe_result.icon), icon_state = initial(recipe_result.icon_state)))
-			option_results["Craft [initial(recipe_result.name)]"] = recipe_result
+			add_recipe_to_options(user, recipe_result, choose_options, option_results)
+
 	if(length(choose_options) == 0)
 		to_chat(user, span_warning("No recipes can be crafted with the parts installed."))
 		return
+
+	craft_selected_option(user, choose_options, option_results)
+
+/obj/item/part/gun/frame/proc/get_missing_parts_for_recipe(datum/lathe_recipe/gun/recipe)
+	var/list/missing_parts = list()
+	for(var/obj/item/part/gun/part as anything in recipe.valid_parts)
+		var/part_type = initial(part.gun_part_type)
+		var/list/installed_types = get_part_types()
+		if(!(part_type in installed_types))
+			missing_parts += "	\a [initial(part.name)]"
+	return missing_parts
+
+/obj/item/part/gun/frame/proc/display_missing_parts_warning(mob/user, obj/recipe_result, list/missing_parts)
+	to_chat(user, span_warning("Parts needed for a [initial(recipe_result.name)]:"))
+	for(var/part in missing_parts)
+		to_chat(user, span_warning(part))
+
+/obj/item/part/gun/frame/proc/add_recipe_to_options(mob/user, obj/recipe_result, list/choose_options, list/option_results)
+	to_chat(user, span_notice("You can craft a [initial(recipe_result.name)] with the parts installed."))
+	choose_options += list("Craft [initial(recipe_result.name)]" = image(icon = initial(recipe_result.icon), icon_state = initial(recipe_result.icon_state)))
+	option_results["Craft [initial(recipe_result.name)]"] = recipe_result
+
+/obj/item/part/gun/frame/proc/craft_selected_option(mob/user, list/choose_options, list/option_results)
 	var/picked_option = show_radial_menu(user, src, choose_options, radius = 38, require_near = TRUE)
 	if(!picked_option)
 		return
diff --git a/code/modules/guncrafting/lathe.dm b/code/modules/guncrafting/lathe.dm
index 861b49c9ec0c..8da0ac5be7af 100644
--- a/code/modules/guncrafting/lathe.dm
+++ b/code/modules/guncrafting/lathe.dm
@@ -104,11 +104,13 @@
 	playsound(src,'sound/items/welder.ogg',50,TRUE)
 	if(istype(work_piece, /obj/item/gun))
 		var/obj/item/gun/gun_work_piece = work_piece
-		var/obj/item/new_part = new /obj/item/part/gun
+		var/obj/item/new_part = new /obj/item/stack/gun_part
 		new_part.forceMove(drop_location())
+		/* I think this should be a seperate procces for obtaining the frame
 		if(gun_work_piece.frame)
 			var/obj/item/frame = gun_work_piece.frame
 			frame.forceMove(drop_location())
+		*/
 	var/datum/component/material_container/materials = GetComponent(/datum/component/material_container)
 	var/material_amount = materials.get_item_material_amount(work_piece)
 	if(material_amount)

From e735f975706a5f62e58385136ca8ee7f792b1e3b Mon Sep 17 00:00:00 2001
From: FalloutFalcon <falloutfalconplays@gmail.com>
Date: Mon, 4 Mar 2024 23:11:37 -0600
Subject: [PATCH 57/89] i dunno

---
 code/modules/cargo/packs/material.dm    |  10 +++
 code/modules/guncrafting/frame.dm       |  12 +++
 code/modules/guncrafting/guncrafting.dm |  19 ++---
 code/modules/guncrafting/lathe.dm       |   2 +-
 code/modules/guncrafting/recipe.dm      | 101 +++++++++---------------
 5 files changed, 66 insertions(+), 78 deletions(-)

diff --git a/code/modules/cargo/packs/material.dm b/code/modules/cargo/packs/material.dm
index ee0f00e42d96..2c75c44d7740 100644
--- a/code/modules/cargo/packs/material.dm
+++ b/code/modules/cargo/packs/material.dm
@@ -110,3 +110,13 @@
 	contains = list(/obj/item/stack/sheet/mineral/wood/fifty)
 	crate_name = "wood planks crate"
 
+/datum/supply_pack/material/gun_parts
+	name = "Gun Parts Crate"
+	desc = "Contains a variety of parts for assembling and maintaining firearms."
+	cost = 1000
+	contains = list(/obj/item/stack/gun_part,
+					/obj/item/stack/gun_part,
+					/obj/item/stack/gun_part,
+					/obj/item/stack/gun_part,
+					/obj/item/stack/gun_part)
+	crate_name = "gun parts crate"
diff --git a/code/modules/guncrafting/frame.dm b/code/modules/guncrafting/frame.dm
index 6ab248e373f6..d4981fd9b37f 100644
--- a/code/modules/guncrafting/frame.dm
+++ b/code/modules/guncrafting/frame.dm
@@ -197,6 +197,7 @@
 			. += "<span class='notice'>[src] has " + part_type_message + ".</span>"
 */
 
+/*
 /obj/item/part/gun/frame/winchester
 	name = "winchester gun frame"
 	icon_state = "frame_shotgun"
@@ -223,8 +224,19 @@
 /obj/item/part/gun/frame/boltaction
 	name = "bolt action gun frame"
 
+*/
+
 /obj/item/part/gun/frame/revolver
+	name = "revolver gun frame"
+	icon_state = "frame_revolver"
+	preinstalled_parts = list(
+		/obj/item/part/gun/modular/grip/wood,
+		/obj/item/part/gun/modular/mechanism/revolver,
+		/obj/item/part/gun/modular/barrel/revolver
+		)
 
+/*
 /obj/item/part/gun/frame/tec9
 
 /obj/item/part/gun/frame/shotgun
+*/
diff --git a/code/modules/guncrafting/guncrafting.dm b/code/modules/guncrafting/guncrafting.dm
index 84975f846d7f..483a887c1622 100644
--- a/code/modules/guncrafting/guncrafting.dm
+++ b/code/modules/guncrafting/guncrafting.dm
@@ -35,17 +35,12 @@
 	new /obj/item/tool/hammer(src)
 	new /obj/item/tool/file(src)
 	new /obj/item/tool/saw(src)
-	new /obj/item/part/gun/frame/winchester(src)
+	new /obj/item/stack/gun_part(src)
+	new /obj/item/part/gun/frame/revolver(src)
 	new /obj/item/part/gun/modular/grip/wood(src)
-	new /obj/item/part/gun/modular/mechanism/shotgun(src)
-	new /obj/item/part/gun/modular/barrel/shotgun(src)
-	new /obj/item/part/gun/frame/winchester(src)
+	new /obj/item/part/gun/modular/mechanism/revolver(src)
+	new /obj/item/part/gun/modular/barrel/revolver(src)
+	new /obj/item/part/gun/frame/revolver(src)
 	new /obj/item/part/gun/modular/grip/wood(src)
-	new /obj/item/part/gun/modular/mechanism/shotgun(src)
-	new /obj/item/part/gun/modular/barrel/shotgun(src)
-	new /obj/item/part/gun/frame(src)
-	new /obj/item/part/gun/frame/candor(src)
-	new /obj/item/part/gun/modular/grip/wood(src)
-	new /obj/item/part/gun/modular/mechanism(src)
-	new /obj/item/part/gun/modular/barrel(src)
-
+	new /obj/item/part/gun/modular/mechanism/revolver(src)
+	new /obj/item/part/gun/modular/barrel/revolver(src)
diff --git a/code/modules/guncrafting/lathe.dm b/code/modules/guncrafting/lathe.dm
index 8da0ac5be7af..e42a680e5359 100644
--- a/code/modules/guncrafting/lathe.dm
+++ b/code/modules/guncrafting/lathe.dm
@@ -103,7 +103,7 @@
 	to_chat(user, "The [work_piece.name] is broken down into parts.")
 	playsound(src,'sound/items/welder.ogg',50,TRUE)
 	if(istype(work_piece, /obj/item/gun))
-		var/obj/item/gun/gun_work_piece = work_piece
+		//var/obj/item/gun/gun_work_piece = work_piece
 		var/obj/item/new_part = new /obj/item/stack/gun_part
 		new_part.forceMove(drop_location())
 		/* I think this should be a seperate procces for obtaining the frame
diff --git a/code/modules/guncrafting/recipe.dm b/code/modules/guncrafting/recipe.dm
index 2fea8240799c..e2eb1b16de9e 100644
--- a/code/modules/guncrafting/recipe.dm
+++ b/code/modules/guncrafting/recipe.dm
@@ -9,13 +9,15 @@
 /datum/lathe_recipe/part/frame
 	result = /obj/item/part/gun/frame
 
-/datum/lathe_recipe/part/frame/winchester
-	result = /obj/item/part/gun/frame/winchester
 
 /datum/lathe_recipe/part/grip/wood
 	result = /obj/item/part/gun/modular/grip/wood
 	reqs = list(/obj/item/stack/sheet/mineral/wood = 3)
 
+/*
+/datum/lathe_recipe/part/frame/winchester
+	result = /obj/item/part/gun/frame/winchester
+
 /datum/lathe_recipe/part/mechanism/shotgun
 	result = /obj/item/part/gun/modular/mechanism/shotgun
 	reqs = list(/obj/item/stack/sheet/metal = 2,
@@ -23,68 +25,47 @@
 
 /datum/lathe_recipe/part/barrel/shotgun
 	result = /obj/item/part/gun/modular/barrel/shotgun
+*/
+
+/datum/lathe_recipe/part/barrel/revolver
+	result = /obj/item/part/gun/modular/barrel/revolver
+	reqs = list(/obj/item/stack/sheet/metal = 2)
+
+/datum/lathe_recipe/part/mechanism/revolver
+	result = /obj/item/part/gun/modular/mechanism/revolver
+	reqs = list(/obj/item/stack/sheet/metal = 2,
+			/obj/item/stack/gun_part = 2)
+
+/datum/lathe_recipe/part/frame/revolver
+	result = /obj/item/part/gun/frame/revolver
+	reqs = list(/obj/item/stack/sheet/metal = 2)
 
 /datum/lathe_recipe/gun
 	var/list/valid_parts = list()
 	var/required_part_types = ALL
 
-/datum/lathe_recipe/gun/candor
-	result = /obj/item/gun/ballistic/automatic/pistol/candor
-	valid_parts = list(
-		/obj/item/part/gun/frame/candor,
-		/obj/item/part/gun/modular/grip/wood,
-		/obj/item/part/gun/modular/mechanism/pistol,
-		/obj/item/part/gun/modular/barrel/pistol
-		)
-
 /*
-/datum/lathe_recipe/gun/winchester
-	result = /obj/item/gun/ballistic/shotgun/winchester
+/datum/lathe_recipe/gun/vickland
+	result = /obj/item/gun/ballistic/automatic/vickland
 	valid_parts = list(
-		/obj/item/part/gun/frame/winchester,
+		/obj/item/part/gun/frame,
 		/obj/item/part/gun/modular/grip/wood,
 		/obj/item/part/gun/modular/mechanism/rifle,
 		/obj/item/part/gun/modular/barrel/rifle
 		)
 
-/datum/lathe_recipe/gun/winchester/mk1
-	result = /obj/item/gun/ballistic/shotgun/winchester/mk1
+/datum/lathe_recipe/gun/candor
+	result = /obj/item/gun/ballistic/automatic/pistol/candor
 	valid_parts = list(
-		/obj/item/part/gun/frame/winchester/mk1,
+		/obj/item/part/gun/frame/candor,
 		/obj/item/part/gun/modular/grip/wood,
-		/obj/item/part/gun/modular/mechanism/rifle,
-		/obj/item/part/gun/modular/barrel/rifle
-		)
-
-/datum/lathe_recipe/gun/tec9
-	result = /obj/item/gun/ballistic/automatic/pistol/tec9
-	valid_parts = list(
-		/obj/item/part/gun/frame/tec9,
-		/obj/item/part/gun/modular/grip/black,
 		/obj/item/part/gun/modular/mechanism/pistol,
 		/obj/item/part/gun/modular/barrel/pistol
 		)
+*/
 
-/datum/lathe_recipe/gun/boltaction
-	result	= /obj/item/gun/ballistic/rifle/boltaction
-	valid_parts = list(
-		/obj/item/part/gun/frame/boltaction,
-		/obj/item/part/gun/modular/grip/wood,
-		/obj/item/part/gun/modular/mechanism/rifle,
-		/obj/item/part/gun/modular/barrel/rifle
-		)
-
-/datum/lathe_recipe/gun/doublebarrel
-	result = /obj/item/gun/ballistic/shotgun/doublebarrel
-	valid_parts = list(
-		/obj/item/part/gun/frame/shotgun,
-		/obj/item/part/gun/modular/grip/wood,
-		/obj/item/part/gun/modular/mechanism/shotgun,
-		/obj/item/part/gun/modular/barrel/shotgun
-		)
-
-/datum/lathe_recipe/gun/derringer
-	result = /obj/item/gun/ballistic/derringer
+/datum/lathe_recipe/gun/montagne
+	result = /obj/item/gun/ballistic/revolver/montagne
 	valid_parts = list(
 		/obj/item/part/gun/frame/revolver,
 		/obj/item/part/gun/modular/grip/wood,
@@ -92,8 +73,8 @@
 		/obj/item/part/gun/modular/barrel/revolver
 		)
 
-/datum/lathe_recipe/gun/srmrevolver
-	result = /obj/item/gun/ballistic/revolver/srm
+/datum/lathe_recipe/gun/ashhand
+	result = /obj/item/gun/ballistic/revolver/ashhand
 	valid_parts = list(
 		/obj/item/part/gun/frame/revolver,
 		/obj/item/part/gun/modular/grip/wood,
@@ -101,8 +82,8 @@
 		/obj/item/part/gun/modular/barrel/revolver
 		)
 
-/datum/lathe_recipe/gun/pepperbox
-	result = /obj/item/gun/ballistic/revolver/pepperbox
+/datum/lathe_recipe/gun/firebrand
+	result = /obj/item/gun/ballistic/revolver/firebrand
 	valid_parts = list(
 		/obj/item/part/gun/frame/revolver,
 		/obj/item/part/gun/modular/grip/wood,
@@ -110,21 +91,11 @@
 		/obj/item/part/gun/modular/barrel/revolver
 		)
 
-/datum/lathe_recipe/gun/nagantrevolver
-	result = /obj/item/gun/ballistic/revolver/nagant
-	valid_parts = list(
-		/obj/item/part/gun/frame,
-		/obj/item/part/gun/modular/grip/wood,
-		/obj/item/part/gun/modular/mechanism,
-		/obj/item/part/gun/modular/barrel
-		)
-
-/datum/lathe_recipe/gun/nagantrifle
-	result = /obj/item/gun/ballistic/rifle/boltaction
+/datum/lathe_recipe/gun/shadow
+	result = /obj/item/gun/ballistic/revolver/shadow
 	valid_parts = list(
-		/obj/item/part/gun/frame,
+		/obj/item/part/gun/frame/revolver,
 		/obj/item/part/gun/modular/grip/wood,
-		/obj/item/part/gun/modular/mechanism,
-		/obj/item/part/gun/modular/barrel
+		/obj/item/part/gun/modular/mechanism/revolver,
+		/obj/item/part/gun/modular/barrel/revolver
 		)
-*/

From f345d44bc57686a1f2bcc8018076a39a2ff6fcf2 Mon Sep 17 00:00:00 2001
From: FalloutFalcon <falloutfalconplays@gmail.com>
Date: Sat, 9 Mar 2024 13:52:58 -0600
Subject: [PATCH 58/89] yea

---
 code/modules/guncrafting/frame.dm | 8 +++++---
 1 file changed, 5 insertions(+), 3 deletions(-)

diff --git a/code/modules/guncrafting/frame.dm b/code/modules/guncrafting/frame.dm
index d4981fd9b37f..806c0be26fd7 100644
--- a/code/modules/guncrafting/frame.dm
+++ b/code/modules/guncrafting/frame.dm
@@ -173,8 +173,10 @@
 /obj/item/part/gun/frame/examine(user, distance)
 	. = ..()
 	if(.)
-		for(var/obj/item/part/gun/part in installed_parts)
-			. += "<span class='notice'>[src] has \a [part] [icon2html(part, user)] installed.</span>"
+		if(length(installed_parts) != 0)
+			. += "<span class='notice'>[src] has parts installed:</span>"
+			for(var/obj/item/part/gun/part in installed_parts)
+				. += "\a [part] [icon2html(part, user)] installed."
 		for(var/datum/lathe_recipe/gun/recipe in filtered_recipes)
 			var/obj/recipe_result = recipe.result
 			var/list/parts_for_craft = list()
@@ -188,7 +190,7 @@
 				for(var/part in parts_for_craft)
 					. += part
 			else
-				. += "<span class='notice'>You can craft a [initial(recipe_result.name)] with the parts installed.</span>"
+				. += "<span class='notice'>You can craft a [initial(recipe_result.name)].</span>"
 /*
 		var/part_type_message = ""
 		for(var/part_type in get_part_types())

From 850647831734f56fba2c3d35c67fc641402a3436 Mon Sep 17 00:00:00 2001
From: fallcon <falloutfalconplays@gmail.com>
Date: Thu, 21 Mar 2024 10:05:11 -0500
Subject: [PATCH 59/89] culling to pistols and revvys and reduces gun part
 quanity from crate

---
 code/modules/cargo/packs/material.dm |  4 +--
 code/modules/guncrafting/frame.dm    | 48 ++++++----------------------
 code/modules/guncrafting/part.dm     | 16 ++--------
 code/modules/guncrafting/recipe.dm   | 25 ---------------
 4 files changed, 13 insertions(+), 80 deletions(-)

diff --git a/code/modules/cargo/packs/material.dm b/code/modules/cargo/packs/material.dm
index 2c75c44d7740..2ace6bcf60cd 100644
--- a/code/modules/cargo/packs/material.dm
+++ b/code/modules/cargo/packs/material.dm
@@ -116,7 +116,5 @@
 	cost = 1000
 	contains = list(/obj/item/stack/gun_part,
 					/obj/item/stack/gun_part,
-					/obj/item/stack/gun_part,
-					/obj/item/stack/gun_part,
-					/obj/item/stack/gun_part)
+					/obj/item/stack/gun_part,)
 	crate_name = "gun parts crate"
diff --git a/code/modules/guncrafting/frame.dm b/code/modules/guncrafting/frame.dm
index 806c0be26fd7..f4bc7a114891 100644
--- a/code/modules/guncrafting/frame.dm
+++ b/code/modules/guncrafting/frame.dm
@@ -2,7 +2,7 @@
 	name = "gun frame"
 	desc = "a generic gun frame."
 	icon_state = "frame_olivaw"
-	var/list/preinstalled_parts = list()
+	//var/list/preinstalled_parts = list()
 	var/list/installed_parts = list()
 	var/list/filtered_recipes = list()
 
@@ -11,8 +11,10 @@
 
 /obj/item/part/gun/frame/Initialize()
 	. = ..()
+	/*
 	for (var/part_type in preinstalled_parts)
 		installed_parts += new part_type(src)
+	*/
 	get_current_recipes()
 	/*
 	var/spawn_with_preinstalled_parts = TRUE
@@ -199,46 +201,14 @@
 			. += "<span class='notice'>[src] has " + part_type_message + ".</span>"
 */
 
-/*
-/obj/item/part/gun/frame/winchester
-	name = "winchester gun frame"
-	icon_state = "frame_shotgun"
-	preinstalled_parts = list(
-		/obj/item/part/gun/modular/grip/wood,
-		/obj/item/part/gun/modular/mechanism/rifle,
-		/obj/item/part/gun/modular/barrel/rifle
-		)
-
-/obj/item/part/gun/frame/winchester/mk1
-	name = "winchester mk1 gun frame"
-
-/obj/item/part/gun/frame/candor
-	name = "candor gun frame"
-	preinstalled_parts = list(
-		/obj/item/part/gun/modular/grip/wood,
-		/obj/item/part/gun/modular/mechanism/pistol,
-		/obj/item/part/gun/modular/barrel/pistol
-		)
-
-/obj/item/part/gun/frame/commander
-	name = "commander gun frame"
-
-/obj/item/part/gun/frame/boltaction
-	name = "bolt action gun frame"
-
-*/
-
 /obj/item/part/gun/frame/revolver
 	name = "revolver gun frame"
 	icon_state = "frame_revolver"
-	preinstalled_parts = list(
-		/obj/item/part/gun/modular/grip/wood,
-		/obj/item/part/gun/modular/mechanism/revolver,
-		/obj/item/part/gun/modular/barrel/revolver
-		)
 
-/*
-/obj/item/part/gun/frame/tec9
+/obj/item/part/gun/frame/deringer
+	name = "deringer gun frame"
+	icon_state = "frame_revolver"
 
-/obj/item/part/gun/frame/shotgun
-*/
+/obj/item/part/gun/frame/pistol
+	name = "pistol gun frame"
+	icon_state = "frame_pistol"
diff --git a/code/modules/guncrafting/part.dm b/code/modules/guncrafting/part.dm
index 7fc06a6cec20..005fed46d839 100644
--- a/code/modules/guncrafting/part.dm
+++ b/code/modules/guncrafting/part.dm
@@ -33,16 +33,11 @@
 	icon_state = "mechanism_pistol"
 	gun_part_type = GUN_PART_MECHANISM
 
-/obj/item/part/gun/modular/mechanism/shotgun
-	name = "generic shotgun mechanism"
-	icon_state = "mechanism_shotgun"
-
-/obj/item/part/gun/modular/mechanism/rifle
-
 /obj/item/part/gun/modular/mechanism/revolver
 	name = "generic revolver mechanism"
 
 /obj/item/part/gun/modular/mechanism/pistol
+	name = "generic pistol mechanism"
 
 /obj/item/part/gun/modular/barrel
 	name = "generic barrel"
@@ -50,13 +45,8 @@
 	icon_state = "barrel_35"
 	gun_part_type = GUN_PART_BARREL
 
-/obj/item/part/gun/modular/barrel/shotgun
-	name = "generic shotgun barrel"
-	desc = "A gun barrel, which keeps the bullet going in the right direction."
-	icon_state = "barrel_30"
-
-/obj/item/part/gun/modular/barrel/rifle
-
 /obj/item/part/gun/modular/barrel/revolver
+	name = "generic revolver barrel"
 
 /obj/item/part/gun/modular/barrel/pistol
+	name = "generic pistol barrel"
diff --git a/code/modules/guncrafting/recipe.dm b/code/modules/guncrafting/recipe.dm
index e2eb1b16de9e..84b234a75b38 100644
--- a/code/modules/guncrafting/recipe.dm
+++ b/code/modules/guncrafting/recipe.dm
@@ -9,24 +9,10 @@
 /datum/lathe_recipe/part/frame
 	result = /obj/item/part/gun/frame
 
-
 /datum/lathe_recipe/part/grip/wood
 	result = /obj/item/part/gun/modular/grip/wood
 	reqs = list(/obj/item/stack/sheet/mineral/wood = 3)
 
-/*
-/datum/lathe_recipe/part/frame/winchester
-	result = /obj/item/part/gun/frame/winchester
-
-/datum/lathe_recipe/part/mechanism/shotgun
-	result = /obj/item/part/gun/modular/mechanism/shotgun
-	reqs = list(/obj/item/stack/sheet/metal = 2,
-			/obj/item/stack/gun_part = 1)
-
-/datum/lathe_recipe/part/barrel/shotgun
-	result = /obj/item/part/gun/modular/barrel/shotgun
-*/
-
 /datum/lathe_recipe/part/barrel/revolver
 	result = /obj/item/part/gun/modular/barrel/revolver
 	reqs = list(/obj/item/stack/sheet/metal = 2)
@@ -44,16 +30,6 @@
 	var/list/valid_parts = list()
 	var/required_part_types = ALL
 
-/*
-/datum/lathe_recipe/gun/vickland
-	result = /obj/item/gun/ballistic/automatic/vickland
-	valid_parts = list(
-		/obj/item/part/gun/frame,
-		/obj/item/part/gun/modular/grip/wood,
-		/obj/item/part/gun/modular/mechanism/rifle,
-		/obj/item/part/gun/modular/barrel/rifle
-		)
-
 /datum/lathe_recipe/gun/candor
 	result = /obj/item/gun/ballistic/automatic/pistol/candor
 	valid_parts = list(
@@ -62,7 +38,6 @@
 		/obj/item/part/gun/modular/mechanism/pistol,
 		/obj/item/part/gun/modular/barrel/pistol
 		)
-*/
 
 /datum/lathe_recipe/gun/montagne
 	result = /obj/item/gun/ballistic/revolver/montagne

From 9e22fae7c523320859b17d9b4b54bbb7c5b7ad7c Mon Sep 17 00:00:00 2001
From: fallcon <falloutfalconplays@gmail.com>
Date: Thu, 21 Mar 2024 11:26:40 -0500
Subject: [PATCH 60/89] augh

---
 .../datums/mapgen/planetary/WasteGenerator.dm |   1 +
 .../game/objects/effects/spawners/lootdrop.dm |  18 +++
 code/modules/guncrafting/frame.dm             |   3 +
 code/modules/guncrafting/lathe.dm             | 109 ++++++++++++++----
 code/modules/guncrafting/part.dm              |   8 ++
 5 files changed, 118 insertions(+), 21 deletions(-)

diff --git a/code/datums/mapgen/planetary/WasteGenerator.dm b/code/datums/mapgen/planetary/WasteGenerator.dm
index d0243740bc3b..58bdbd6b3868 100644
--- a/code/datums/mapgen/planetary/WasteGenerator.dm
+++ b/code/datums/mapgen/planetary/WasteGenerator.dm
@@ -227,6 +227,7 @@
 	flora_spawn_list = list( //there are no plants here
 		/obj/effect/spawner/lootdrop/waste/mechwreck = 200,
 		/obj/effect/spawner/lootdrop/waste/mechwreck/rare = 50,
+		/obj/effect/spawner/lootdrop/gun_parts = 500,
 		/obj/effect/spawner/lootdrop/waste/trash = 900,
 		/obj/effect/spawner/lootdrop/waste/radiation = 80,
 		/obj/effect/spawner/lootdrop/waste/radiation/more_rads = 20,
diff --git a/code/game/objects/effects/spawners/lootdrop.dm b/code/game/objects/effects/spawners/lootdrop.dm
index d1f47ff647f6..1fd2ab83a1fb 100644
--- a/code/game/objects/effects/spawners/lootdrop.dm
+++ b/code/game/objects/effects/spawners/lootdrop.dm
@@ -1007,6 +1007,24 @@
 
 //wasteplanet things
 
+/obj/effect/spawner/lootdrop/gun_parts
+	name = "gun parts spawner"
+	loot = list(
+		/obj/item/stack/gun_part = 10,
+		/obj/item/part/gun/modular/grip = 1,
+		/obj/item/part/gun/modular/grip/wood = 1,
+		/obj/item/part/gun/modular/grip/black = 1,
+		/obj/item/part/gun/modular/mechanism = 1,
+		/obj/item/part/gun/modular/mechanism/revolver = 1,
+		/obj/item/part/gun/modular/mechanism/pistol = 1,
+		/obj/item/part/gun/modular/barrel = 1,
+		/obj/item/part/gun/modular/barrel/revolver = 1,
+		/obj/item/part/gun/modular/barrel/pistol = 1,
+		/obj/item/part/gun/frame/revolver = 1,
+		/obj/item/part/gun/frame/deringer = 1,
+		/obj/item/part/gun/frame/pistol
+	)
+
 /obj/effect/spawner/lootdrop/waste/grille_or_trash
 	name = "wasteplanet loot spawner"
 	loot = list(
diff --git a/code/modules/guncrafting/frame.dm b/code/modules/guncrafting/frame.dm
index f4bc7a114891..5ced1cd4e36d 100644
--- a/code/modules/guncrafting/frame.dm
+++ b/code/modules/guncrafting/frame.dm
@@ -204,11 +204,14 @@
 /obj/item/part/gun/frame/revolver
 	name = "revolver gun frame"
 	icon_state = "frame_revolver"
+	material_cost = list(/obj/item/stack/sheet/metal = 2)
 
 /obj/item/part/gun/frame/deringer
 	name = "deringer gun frame"
 	icon_state = "frame_revolver"
+	material_cost = list(/obj/item/stack/sheet/metal = 2)
 
 /obj/item/part/gun/frame/pistol
 	name = "pistol gun frame"
 	icon_state = "frame_pistol"
+	material_cost = list(/obj/item/stack/sheet/metal = 2)
diff --git a/code/modules/guncrafting/lathe.dm b/code/modules/guncrafting/lathe.dm
index e42a680e5359..ed3cc72abd9f 100644
--- a/code/modules/guncrafting/lathe.dm
+++ b/code/modules/guncrafting/lathe.dm
@@ -16,6 +16,10 @@
 	var/mode = FALSE
 	//If activily doing a do untill loop
 	var/working = FALSE
+	//The part that the user has picked to fabricate
+	var/obj/item/picked_part = FALSE
+	var/list/tools_required = list(/obj/item/tool/hammer, /obj/item/tool/file, /obj/item/tool/saw)
+	var/tool_required = FALSE
 
 /obj/structure/lathe/Initialize()
 	AddComponent(/datum/component/material_container, list(/datum/material/iron, /datum/material/glass, /datum/material/silver, /datum/material/plasma, /datum/material/gold, /datum/material/diamond, /datum/material/plastic, /datum/material/uranium, /datum/material/bananium, /datum/material/titanium, /datum/material/bluespace), INFINITY, FALSE, null, null, null, TRUE)
@@ -31,7 +35,7 @@
 	if(in_progress)
 		to_chat(user, "The lathe is currently in use.")
 		return
-	remove_part(user)
+	remove_work_piece(user)
 
 /obj/structure/lathe/attack_hand(mob/living/carbon/human/user)
 	if(!work_piece)
@@ -44,9 +48,9 @@
 		mode = show_radial_menu(user, src, choose_options, radius = 38, require_near = TRUE)
 	if(mode && !working)
 		if(mode == "Deconstruct")
-			deconstruct_part(user)
+			deconstruct_work_piece(user)
 		if(mode == "Fabricate")
-			fabricate_part(user)
+			work_on_part(user)
 
 /obj/structure/lathe/attackby(obj/item/I, mob/user)
 	if(work_piece)
@@ -58,7 +62,7 @@
 		work_piece.vis_flags |= VIS_INHERIT_ID
 		vis_contents += work_piece
 
-/obj/structure/lathe/proc/remove_part(mob/user)
+/obj/structure/lathe/proc/remove_work_piece(mob/user)
 	if(work_piece)
 		vis_contents -= work_piece
 		work_piece.forceMove(drop_location())
@@ -68,7 +72,7 @@
 		in_progress = FALSE
 		mode = FALSE
 
-/obj/structure/lathe/proc/destroy_part(mob/user)
+/obj/structure/lathe/proc/destroy_work_piece(mob/user)
 	if(work_piece)
 		vis_contents -= work_piece
 		qdel(work_piece)
@@ -76,11 +80,18 @@
 		in_progress = FALSE
 		mode = FALSE
 
+/obj/structure/lathe/proc/reset_lathe()
+	picked_part = FALSE
+	in_progress = FALSE
+	mode = FALSE
+	steps_left = FALSE
+	working = FALSE
+
 /////////////////
 // DECONSTRUCT //
 /////////////////
 
-/obj/structure/lathe/proc/deconstruct_part(mob/living/carbon/human/user)
+/obj/structure/lathe/proc/deconstruct_work_piece(mob/living/carbon/human/user)
 	if(!in_progress)
 		in_progress = TRUE
 		steps_left = 3
@@ -94,12 +105,12 @@
 			playsound(src,'sound/items/welder2.ogg',50,TRUE)
 			to_chat(user, "You have [steps_left] steps left.")
 			user.adjustStaminaLoss(DECONSTRUCT_STAMINA_USE)
-			deconstruct_part(user)
+			deconstruct_work_piece(user)
 		else
-			scrap_item(work_piece)
+			scrap_work_piece(work_piece)
 	working = FALSE
 
-/obj/structure/lathe/proc/scrap_item(mob/user)
+/obj/structure/lathe/proc/scrap_work_piece(mob/user)
 	to_chat(user, "The [work_piece.name] is broken down into parts.")
 	playsound(src,'sound/items/welder.ogg',50,TRUE)
 	if(istype(work_piece, /obj/item/gun))
@@ -116,28 +127,84 @@
 	if(material_amount)
 		materials.insert_item(work_piece)
 		materials.retrieve_all()
-	destroy_part(user)
+	destroy_work_piece(user)
+	reset_lathe()
 
 ///////////////
 // FABRICATE //
 ///////////////
 
-/obj/structure/lathe/proc/fabricate_part(mob/living/carbon/human/user)
+/obj/structure/lathe/proc/choose_part(mob/living/carbon/human/user)
 	if(istype (work_piece, /obj/item/gun))
 		var/obj/item/gun/gun_work_piece = work_piece
 		var/list/choose_options = list()
 		var/list/option_results = list()
 		if(gun_work_piece.frame)
-			choose_options += list("Craft [gun_work_piece.frame.name]" = image(icon = gun_work_piece.frame.icon , icon_state = gun_work_piece.frame.icon_state))
-			option_results["Craft [gun_work_piece.frame.name]"] = gun_work_piece.frame.type
-			for(var/obj/item/part/gun/gun_part in gun_work_piece.frame.installed_parts)
-				choose_options += list("Craft [gun_part.name]" = image(icon = gun_part.icon, icon_state = gun_part.icon_state))
-				option_results["Craft [gun_part.name]"] = gun_part.type
+			var/obj/item/part/gun/frame = gun_work_piece.frame
+			if(frame.material_cost)
+				choose_options += list("Craft [frame.name]" = image(icon = frame.icon , icon_state = frame.icon_state))
+				option_results["Craft [frame.name]"] = frame.type
+			for(var/obj/item/part/gun/gun_part in frame.installed_parts)
+				if(gun_part.material_cost)
+					choose_options += list("Craft [gun_part.name]" = image(icon = gun_part.icon, icon_state = gun_part.icon_state))
+					option_results["Craft [gun_part.name]"] = gun_part.type
 		var/choosen_part = show_radial_menu(user, src, choose_options, radius = 38, require_near = TRUE)
 		if(!choosen_part)
 			return
-		var/turf/T = get_turf(src)
-		var/obj/item/part/gun/picked_part = option_results[choosen_part]
-		var/obj/item/part/gun/new_part = new picked_part(T)
-		new_part.forceMove(drop_location())
-	mode = FALSE
+		if(check_materials(choosen_part))
+			return option_results[choosen_part]
+
+/obj/structure/lathe/proc/get_surrounding_items()
+	var/list/surrounding_items = list()
+	for(var/obj/item/I in view(1, src))
+		surrounding_items[I.type] += 1
+	return surrounding_items
+
+/obj/structure/lathe/proc/check_materials(obj/item/part/gun/gun_part)
+	var/list/surrounding_items = get_surrounding_items()
+	for(var/obj/item/material in gun_part.material_cost)
+		if(!(material in surrounding_items) || surrounding_items[material] < gun_part.material_cost[material])
+			return FALSE
+	return TRUE
+
+/obj/structure/lathe/proc/start_work(mob/living/carbon/human/user)
+	if(in_progress)
+		return TRUE
+	in_progress = TRUE
+	tools_required = list(/obj/item/tool/hammer, /obj/item/tool/file, /obj/item/tool/saw)
+	tool_required = pick(tools_required)
+	steps_left = 3
+	return TRUE
+
+/obj/structure/lathe/proc/work_on_part(mob/living/carbon/human/user)
+	if(!picked_part)
+		picked_part = choose_part(user)
+	if(!picked_part || !start_work(user))
+		return
+	if(!user.has_item_of_type(tool_required))
+		balloon_alert(user, "You need a [tool_required.name] to work on this part.")
+		return
+	if(user.getStaminaLoss() > DECONSTRUCT_STAMINA_MINIMUM)
+		balloon_alert(user, "too tired")
+		return FALSE
+	working = TRUE
+	if(do_after(user, 20, work_piece))
+		if(steps_left > 1)
+			steps_left--
+			playsound(src,'sound/items/welder2.ogg',50,TRUE)
+			to_chat(user, "You have [steps_left] steps left.")
+			user.adjustStaminaLoss(DECONSTRUCT_STAMINA_USE)
+			tool_required = pick(tools_required)
+			balloon_alert(user, "You need a [tool_required.name] next.")
+			work_on_part(user)
+		else
+			fabricate_part(user)
+	working = FALSE
+
+/obj/structure/lathe/proc/fabricate_part(mob/living/carbon/human/user)
+	if(!picked_part)
+		return
+	var/turf/T = get_turf(src)
+	var/obj/item/part/gun/new_part = new picked_part(T)
+	new_part.forceMove(drop_location())
+	reset_lathe()
diff --git a/code/modules/guncrafting/part.dm b/code/modules/guncrafting/part.dm
index 005fed46d839..9d9c6c3cd53e 100644
--- a/code/modules/guncrafting/part.dm
+++ b/code/modules/guncrafting/part.dm
@@ -6,6 +6,7 @@
 	desc = "Spare part of gun."
 	icon_state = "gun_part_1"
 	var/gun_part_type = NONE
+	var/material_cost = list()
 
 /obj/item/part/gun/modular
 	name = "modular gun part"
@@ -21,11 +22,14 @@
 	name = "wood grip"
 	desc = "A wood firearm grip, unattached from a firearm."
 	icon_state = "grip_wood"
+	material_cost = list(/obj/item/stack/sheet/mineral/wood = 3)
+
 
 /obj/item/part/gun/modular/grip/black
 	name = "plastic grip"
 	desc = "A black plastic firearm grip, unattached from a firearm. For sleekness and decorum."
 	icon_state = "grip_black"
+	material_cost = list(/obj/item/stack/sheet/metal = 2)
 
 /obj/item/part/gun/modular/mechanism
 	name = "generic mechanism"
@@ -35,9 +39,11 @@
 
 /obj/item/part/gun/modular/mechanism/revolver
 	name = "generic revolver mechanism"
+	material_cost = list(/obj/item/stack/sheet/metal = 3)
 
 /obj/item/part/gun/modular/mechanism/pistol
 	name = "generic pistol mechanism"
+	material_cost = list(/obj/item/stack/sheet/metal = 3)
 
 /obj/item/part/gun/modular/barrel
 	name = "generic barrel"
@@ -47,6 +53,8 @@
 
 /obj/item/part/gun/modular/barrel/revolver
 	name = "generic revolver barrel"
+	material_cost = list(/obj/item/stack/sheet/metal = 2)
 
 /obj/item/part/gun/modular/barrel/pistol
 	name = "generic pistol barrel"
+	material_cost = list(/obj/item/stack/sheet/metal = 2)

From 91e07f2fcd30059dee2ecf1c939a9d488080b517 Mon Sep 17 00:00:00 2001
From: fallcon <falloutfalconplays@gmail.com>
Date: Tue, 2 Apr 2024 08:28:58 -0500
Subject: [PATCH 61/89] unit unit

---
 code/modules/unit_tests/gun_crafting.dm | 5 +++--
 1 file changed, 3 insertions(+), 2 deletions(-)

diff --git a/code/modules/unit_tests/gun_crafting.dm b/code/modules/unit_tests/gun_crafting.dm
index 31ee1edc2285..c3d203023ee4 100644
--- a/code/modules/unit_tests/gun_crafting.dm
+++ b/code/modules/unit_tests/gun_crafting.dm
@@ -1,11 +1,12 @@
 //Makes sure preinstalled frame parts can be removed an reinstalled
 /datum/unit_test/gun_crafting/Run()
+/*
 	var/list/guns = typesof(/obj/item/gun/ballistic)
 	for(var/gunType in guns)
 		var/obj/item/gun/ballistic/G = new gunType
 		if(G.magazine)
 			TEST_FAIL("[G.type], Mag: [G.magazine.type], Cali: [G.magazine.caliber]")
-/*
+*/
 	var/mob/living/carbon/human/human = allocate(/mob/living/carbon/human)
 	for(var/frame_type in subtypesof(/obj/item/part/gun/frame))
 		var/obj/item/part/gun/frame/frame = new frame_type
@@ -14,4 +15,4 @@
 			frame.eject_item(installedPart, human)
 			frame.handle_part(installedPart, human)
 		TEST_ASSERT_EQUAL(frame_parts, frame.installed_parts, "Frame parts to match there original contents. I assume frame parts were not reinstalled correctly.")
-*/
+

From 1fe0695a6c01c83670ce52b2fdc92d620278c06a Mon Sep 17 00:00:00 2001
From: fallcon <falloutfalconplays@gmail.com>
Date: Tue, 2 Apr 2024 09:51:20 -0500
Subject: [PATCH 62/89] soft port of CEV-eris tool system

---
 code/__DEFINES/tools.dm                 |  25 -----
 code/__DEFINES/tools_and_qualities.dm   |  97 +++++++++++++++++++
 code/game/objects/items.dm              |   2 +
 code/game/objects/items/tools/_tools.dm | 119 ++++++++++++++++++++++++
 code/modules/guncrafting/frame.dm       |   3 +
 code/modules/guncrafting/lathe.dm       |  19 +++-
 code/modules/guncrafting/tools.dm       |  14 ---
 shiptest.dme                            |   4 +-
 8 files changed, 237 insertions(+), 46 deletions(-)
 delete mode 100644 code/__DEFINES/tools.dm
 create mode 100644 code/__DEFINES/tools_and_qualities.dm
 create mode 100644 code/game/objects/items/tools/_tools.dm
 delete mode 100644 code/modules/guncrafting/tools.dm

diff --git a/code/__DEFINES/tools.dm b/code/__DEFINES/tools.dm
deleted file mode 100644
index 320648170b44..000000000000
--- a/code/__DEFINES/tools.dm
+++ /dev/null
@@ -1,25 +0,0 @@
-// Tool types
-#define TOOL_CROWBAR "crowbar"
-#define TOOL_MULTITOOL "multitool"
-#define TOOL_SCREWDRIVER "screwdriver"
-#define TOOL_WIRECUTTER "wirecutter"
-#define TOOL_WRENCH "wrench"
-#define TOOL_WELDER "welder"
-#define TOOL_ANALYZER "analyzer"
-#define TOOL_MINING "mining"
-#define TOOL_SHOVEL "shovel"
-#define TOOL_RETRACTOR "retractor"
-#define TOOL_HEMOSTAT "hemostat"
-#define TOOL_CAUTERY "cautery"
-#define TOOL_DRILL "drill"
-#define TOOL_SCALPEL "scalpel"
-#define TOOL_SAW "saw"
-
-// If delay between the start and the end of tool operation is less than MIN_TOOL_SOUND_DELAY,
-// tool sound is only played when op is started. If not, it's played twice.
-#define MIN_TOOL_SOUND_DELAY 20
-
-/// When a tooltype_act proc is successful
-#define TOOL_ACT_TOOLTYPE_SUCCESS (1<<0)
-/// When [COMSIG_ATOM_TOOL_ACT] blocks the act
-#define TOOL_ACT_SIGNAL_BLOCKING (1<<1)
diff --git a/code/__DEFINES/tools_and_qualities.dm b/code/__DEFINES/tools_and_qualities.dm
new file mode 100644
index 000000000000..5ea1a0e88e05
--- /dev/null
+++ b/code/__DEFINES/tools_and_qualities.dm
@@ -0,0 +1,97 @@
+// Tool types
+#define TOOL_CROWBAR "crowbar"
+#define TOOL_MULTITOOL "multitool"
+#define TOOL_SCREWDRIVER "screwdriver"
+#define TOOL_WIRECUTTER "wirecutter"
+#define TOOL_WRENCH "wrench"
+#define TOOL_WELDER "welder"
+#define TOOL_ANALYZER "analyzer"
+#define TOOL_MINING "mining"
+#define TOOL_SHOVEL "shovel"
+#define TOOL_RETRACTOR "retractor"
+#define TOOL_HEMOSTAT "hemostat"
+#define TOOL_CAUTERY "cautery"
+#define TOOL_DRILL "drill"
+#define TOOL_SCALPEL "scalpel"
+#define TOOL_SAW "saw"
+
+///////////////
+// ERIS PORT //
+///////////////
+
+// If delay between the start and the end of tool operation is less than MIN_TOOL_SOUND_DELAY,
+// tool sound is only played when op is started. If not, it's played twice.
+#define MIN_TOOL_SOUND_DELAY 20
+
+/// When a tooltype_act proc is successful
+#define TOOL_ACT_TOOLTYPE_SUCCESS (1<<0)
+/// When [COMSIG_ATOM_TOOL_ACT] blocks the act
+#define TOOL_ACT_SIGNAL_BLOCKING (1<<1)
+
+#define ABORT_CHECK						-1
+#define TOOL_USE_FAIL					-1
+#define TOOL_USE_CANCEL					0
+#define TOOL_USE_SUCCESS				1
+
+#define QUALITY_BOLT_TURNING			"bolt turning"
+#define QUALITY_PULSING					"pulsing"
+#define QUALITY_PRYING					"prying"
+#define QUALITY_WELDING					"welding"
+#define QUALITY_SCREW_DRIVING			"screw driving"
+#define QUALITY_WIRE_CUTTING			"wire cutting"
+#define QUALITY_CLAMPING				"clamping"
+#define QUALITY_CAUTERIZING				"cauterizing"
+#define QUALITY_RETRACTING				"retracting"
+#define QUALITY_DRILLING				"drilling"
+#define QUALITY_HAMMERING				"hammering"
+#define QUALITY_SAWING					"sawing"
+#define QUALITY_BONE_SETTING			"bone setting"
+#define QUALITY_SHOVELING				"shoveling"
+#define QUALITY_DIGGING					"digging"
+#define QUALITY_EXCAVATION				"excavation"
+#define QUALITY_CUTTING					"cutting"
+#define QUALITY_LASER_CUTTING			"laser cutting"	//laser scalpels and e-swords - bloodless cutting
+#define QUALITY_ADHESIVE				"adhesive"
+#define QUALITY_SEALING					"sealing"
+#define QUALITY_FILING					"filing"
+
+//Time for a work for tool system calculated in that way: basic time - tool level - stat check..
+//It means that basic tools will give -30 on time, and people on right job should have -20 at least, or even more.
+#define WORKTIME_INSTANT				0
+#define WORKTIME_NEAR_INSTANT			30
+#define WORKTIME_FAST					60
+#define WORKTIME_NORMAL					90
+#define WORKTIME_SLOW					120
+#define WORKTIME_LONG					170
+#define WORKTIME_EXTREMELY_LONG			250
+
+//Fail chance for tool system calculated in that way: basic chance - tool level - stat check.
+//Basic tools will give -30% on fail chance, and people on right job should have -20% at least.
+#define FAILCHANCE_ZERO					0
+#define FAILCHANCE_VERY_EASY			30
+#define FAILCHANCE_EASY					50
+#define FAILCHANCE_NORMAL				60
+#define FAILCHANCE_HARD					80
+#define FAILCHANCE_CHALLENGING			90
+#define FAILCHANCE_VERY_HARD			120
+#define FAILCHANCE_IMPOSSIBLE			150
+
+//Sounds for working with tools
+#define NO_WORKSOUND					-1
+
+#define WORKSOUND_CIRCULAR_SAW			'sound/weapons/circsawhit.ogg'
+#define WORKSOUND_SIMPLE_SAW			'sound/items/saw.ogg'
+#define WORKSOUND_WRENCHING				'sound/items/Ratchet.ogg'
+#define WORKSOUND_WIRECUTTING			'sound/items/Wirecutter.ogg'
+#define WORKSOUND_WELDING				"weld"
+#define WORKSOUND_PULSING				'sound/items/multitool_pulse.ogg'
+#define WORKSOUND_SCREW_DRIVING			'sound/items/Screwdriver.ogg'
+#define WORKSOUND_EASY_CROWBAR			'sound/items/Crowbar.ogg'
+#define WORKSOUND_HAMMER				'sound/items/hammer.ogg'
+#define WORKSOUND_REMOVING				'sound/items/Deconstruct.ogg'
+#define WORKSOUND_DRIVER_TOOL			'sound/items/e_screwdriver.ogg'
+#define WORKSOUND_PICKAXE				'sound/items/pickaxe.ogg'
+#define WORKSOUND_HARD_SLASH			'sound/weapons/bladeslice.ogg'
+#define WORKSOUND_CHAINSAW				'sound/items/chainsaw.ogg'
+#define WORKSOUND_TAPE					'sound/items/duct_tape.ogg'
+#define WORKSOUND_HONK                  'sound/items/bikehorn.ogg'
diff --git a/code/game/objects/items.dm b/code/game/objects/items.dm
index df7c5ae431c5..b63b2ccbf286 100644
--- a/code/game/objects/items.dm
+++ b/code/game/objects/items.dm
@@ -97,6 +97,8 @@ GLOBAL_VAR_INIT(embedpocalypse, FALSE) // if true, all items will be able to emb
 	///you can see someone's mask through their transparent visor, but you can't reach it
 	var/transparent_protection = NONE
 
+	var/list/tool_qualities// List of item qualities for tools system. See tools_and_qualities.dm.
+
 	///flags for what should be done when you click on the item, default is picking it up
 	var/interaction_flags_item = INTERACT_ITEM_ATTACK_HAND_PICKUP
 
diff --git a/code/game/objects/items/tools/_tools.dm b/code/game/objects/items/tools/_tools.dm
new file mode 100644
index 000000000000..8fbba03478e1
--- /dev/null
+++ b/code/game/objects/items/tools/_tools.dm
@@ -0,0 +1,119 @@
+// Time added to tool operations in percent based on original time
+// (if you dig hole in 10 seconds then 50 ADDITIONAL_TIME_LOWHEALTH will add 0 on full health, 2.5sec on 50% health and 5sec ~0% health)
+#define ADDITIONAL_TIME_LOWHEALTH 60
+
+/obj/item/tool
+	name = "tool"
+	icon = 'icons/obj/tools.dmi'
+	slot_flags = SLOT_BELT
+	force = WEAPON_FORCE_NORMAL
+	throwforce = WEAPON_FORCE_NORMAL
+	w_class = ITEM_SIZE_SMALL
+
+/*
+	//spawn values
+	bad_type = /obj/item/tool
+	spawn_tags = SPAWN_TAG_TOOL
+
+	price_tag = 20
+
+	health = 600
+	maxHealth = 600
+
+	var/tool_in_use = FALSE
+
+	var/force_upgrade_mults = 1
+
+	var/force_upgrade_mods = 0
+
+	var/sparks_on_use = FALSE	//Set to TRUE if you want to have sparks on each use of a tool
+	var/eye_hazard = FALSE	//Set to TRUE should damage users eyes if they without eye protection
+
+	var/use_power_cost = 0	//For tool system, determinze how much power tool will drain from cells, 0 means no cell needed
+	var/obj/item/cell/cell
+	var/suitable_cell	//Dont forget to edit this for a tool, if you want in to consume cells
+	var/passive_power_cost = 1 //Energy consumed per process tick while active
+
+	var/use_fuel_cost = 0	//Same, only for fuel. And for the sake of God, DONT USE CELLS AND FUEL SIMULTANEOUSLY.
+	var/passive_fuel_cost = 0.03 //Fuel consumed per process tick while active
+	var/max_fuel = 0
+
+	var/mode = NOMODE //For various tool icon updates.
+
+	//Third type of resource, stock. A tool that uses physical objects (or itself) in order to work
+	//Currently used for tape roll
+	var/use_stock_cost = 0
+	var/stock = 0
+	var/max_stock = 0
+	var/allow_decimal_stock = TRUE
+	var/delete_when_empty = TRUE
+
+
+	//Variables used for tool degradation
+	health = 0		// Health of a tool.
+	maxHealth = 1000
+	var/degradation = 0.8 //If nonzero, the health of the tool decreases by this amount after each tool operation
+	var/health_threshold  = 40 // threshold in percent on which tool health stops dropping
+	var/lastNearBreakMessage = 0 // used to show messages that tool is about to break
+	var/isBroken = FALSE
+
+
+	var/toggleable = FALSE	//Determines if it can be switched ON or OFF, for example, if you need a tool that will consume power/fuel upon turning it ON only. Such as welder.
+	var/switched_on = FALSE	//Curent status of tool. Dont edit this in subtypes vars, its for procs only.
+	var/switched_on_qualities	//This var will REPLACE tool_qualities when tool will be toggled on.
+	var/switched_on_force
+	var/switched_on_hitsound
+	var/switched_off_qualities	//This var will REPLACE tool_qualities when tool will be toggled off. So its possible for tool to have diferent qualities both for ON and OFF state.
+	var/create_hot_spot = FALSE	 //Set this TRUE to ignite plasma on turf with tool upon activation
+	var/glow_color	//Set color of glow upon activation, or leave it null if you dont want any light
+	var/last_tooluse = 0 //When the tool was last used for a tool operation. This is set both at the start of an operation, and after the doafter call
+
+	//Vars for tool upgrades
+	var/precision = 0	//Subtracted from failure rates
+	var/workspeed = 1	//Worktimes are divided by this
+	var/extra_bulk = 0 	//Extra physicial volume added by certain mods
+	var/list/prefixes = list()
+*/
+
+/obj/item/proc/has_quality(quality_id)
+	return !quality_id || (quality_id in tool_qualities)
+
+/obj/item/tool/admin_debug
+	name = "Electric Boogaloo 3000"
+	icon_state = "omnitool"
+	item_state = "omnitool"
+	spawn_tags = null
+	tool_qualities = list(QUALITY_BOLT_TURNING = 100,
+							QUALITY_PRYING = 100,
+							QUALITY_WELDING = 100,
+							QUALITY_SCREW_DRIVING = 100,
+							QUALITY_CLAMPING = 100,
+							QUALITY_CAUTERIZING = 100,
+							QUALITY_WIRE_CUTTING = 100,
+							QUALITY_RETRACTING = 100,
+							QUALITY_DRILLING = 100,
+							QUALITY_SAWING = 100,
+							QUALITY_VEIN_FIXING = 100,
+							QUALITY_BONE_SETTING = 100,
+							QUALITY_BONE_FIXING = 100,
+							QUALITY_SHOVELING = 100,
+							QUALITY_DIGGING = 100,
+							QUALITY_EXCAVATION = 100,
+							QUALITY_CUTTING = 100,
+							QUALITY_HAMMERING = 100,
+							QUALITY_FILING = 100)
+
+/obj/item/tool/hammer
+	name = "ballpin hammer"
+	icon_state = "oldcrowbar"
+	tool_qualities = (QUALITY_HAMMERING = 50)
+
+/obj/item/tool/file
+	name = "metal file"
+	icon_state = "oldwrench"
+	tool_qualities = (QUALITY_FILING = 50)
+
+/obj/item/tool/saw
+	name = "rusty hacksaw"
+	icon_state = "oldcutters_map"
+	tool_qualities = (QUALITY_SAWING = 50)
diff --git a/code/modules/guncrafting/frame.dm b/code/modules/guncrafting/frame.dm
index 5ced1cd4e36d..8fa9d7bd16ca 100644
--- a/code/modules/guncrafting/frame.dm
+++ b/code/modules/guncrafting/frame.dm
@@ -215,3 +215,6 @@
 	name = "pistol gun frame"
 	icon_state = "frame_pistol"
 	material_cost = list(/obj/item/stack/sheet/metal = 2)
+
+/obj/item/part/gun/frame/pistol/candor
+	name = "candor gun frame"
diff --git a/code/modules/guncrafting/lathe.dm b/code/modules/guncrafting/lathe.dm
index ed3cc72abd9f..57eacfea330b 100644
--- a/code/modules/guncrafting/lathe.dm
+++ b/code/modules/guncrafting/lathe.dm
@@ -18,7 +18,7 @@
 	var/working = FALSE
 	//The part that the user has picked to fabricate
 	var/obj/item/picked_part = FALSE
-	var/list/tools_required = list(/obj/item/tool/hammer, /obj/item/tool/file, /obj/item/tool/saw)
+	var/list/tools_required = list(QUALITY_HAMMERING, QUALITY_SAWING, QUALITY_FILING)
 	var/tool_required = FALSE
 
 /obj/structure/lathe/Initialize()
@@ -53,6 +53,14 @@
 			work_on_part(user)
 
 /obj/structure/lathe/attackby(obj/item/I, mob/user)
+	if(mode && !working)
+		if(is_valid_tool(I))
+			if(mode == "Deconstruct")
+				deconstruct_work_piece(user)
+			if(mode == "Fabricate")
+				work_on_part(user)
+		else
+			balloon_alert(user, "You need a tool with [tool_required] to work on this part.")
 	if(work_piece)
 		to_chat(user, "You cant add another item to the lathe.")
 		return
@@ -87,6 +95,10 @@
 	steps_left = FALSE
 	working = FALSE
 
+/obj/structure/lathe/proc/is_valid_tool(obj/item/I)
+	if(I.has_quality(tool_required))
+		return TRUE
+
 /////////////////
 // DECONSTRUCT //
 /////////////////
@@ -140,7 +152,7 @@
 		var/list/choose_options = list()
 		var/list/option_results = list()
 		if(gun_work_piece.frame)
-			var/obj/item/part/gun/frame = gun_work_piece.frame
+			var/obj/item/part/gun/frame/frame = gun_work_piece.frame
 			if(frame.material_cost)
 				choose_options += list("Craft [frame.name]" = image(icon = frame.icon , icon_state = frame.icon_state))
 				option_results["Craft [frame.name]"] = frame.type
@@ -181,9 +193,6 @@
 		picked_part = choose_part(user)
 	if(!picked_part || !start_work(user))
 		return
-	if(!user.has_item_of_type(tool_required))
-		balloon_alert(user, "You need a [tool_required.name] to work on this part.")
-		return
 	if(user.getStaminaLoss() > DECONSTRUCT_STAMINA_MINIMUM)
 		balloon_alert(user, "too tired")
 		return FALSE
diff --git a/code/modules/guncrafting/tools.dm b/code/modules/guncrafting/tools.dm
deleted file mode 100644
index 6403005791ea..000000000000
--- a/code/modules/guncrafting/tools.dm
+++ /dev/null
@@ -1,14 +0,0 @@
-/obj/item/tool/hammer
-	name = "hammer"
-	icon = 'icons/obj/tools.dmi'
-	icon_state = "oldcrowbar"
-
-/obj/item/tool/file
-	name = "file"
-	icon = 'icons/obj/tools.dmi'
-	icon_state = "oldwrench"
-
-/obj/item/tool/saw
-	name = "saw"
-	icon = 'icons/obj/tools.dmi'
-	icon_state = "oldcutters_map"
diff --git a/shiptest.dme b/shiptest.dme
index 725823ff0c9b..508ee627d31b 100644
--- a/shiptest.dme
+++ b/shiptest.dme
@@ -141,7 +141,7 @@
 #include "code\__DEFINES\tgs.dm"
 #include "code\__DEFINES\tgui.dm"
 #include "code\__DEFINES\time.dm"
-#include "code\__DEFINES\tools.dm"
+#include "code\__DEFINES\tools_and_qualities.dm"
 #include "code\__DEFINES\traits.dm"
 #include "code\__DEFINES\turfs.dm"
 #include "code\__DEFINES\typeids.dm"
@@ -1306,6 +1306,7 @@
 #include "code\game\objects\items\tanks\tank_types.dm"
 #include "code\game\objects\items\tanks\tanks.dm"
 #include "code\game\objects\items\tanks\watertank.dm"
+#include "code\game\objects\items\tools\_tools.dm"
 #include "code\game\objects\items\tools\chisel.dm"
 #include "code\game\objects\items\tools\crowbar.dm"
 #include "code\game\objects\items\tools\screwdriver.dm"
@@ -2196,7 +2197,6 @@
 #include "code\modules\guncrafting\lathe.dm"
 #include "code\modules\guncrafting\part.dm"
 #include "code\modules\guncrafting\recipe.dm"
-#include "code\modules\guncrafting\tools.dm"
 #include "code\modules\holiday\easter.dm"
 #include "code\modules\holiday\foreign_calendar.dm"
 #include "code\modules\holiday\holidays.dm"

From 1cba2a00e778398b4407d64c3f9247d0c82580e1 Mon Sep 17 00:00:00 2001
From: fallcon <falloutfalconplays@gmail.com>
Date: Tue, 2 Apr 2024 10:03:26 -0500
Subject: [PATCH 63/89] stuff

---
 code/__DEFINES/tools_and_qualities.dm         |   2 +-
 code/game/objects/items/tools/_tools.dm       | 128 +++---------------
 code/game/objects/items/tools/simple_tools.dm |  41 ++++++
 shiptest.dme                                  |   1 +
 4 files changed, 64 insertions(+), 108 deletions(-)
 create mode 100644 code/game/objects/items/tools/simple_tools.dm

diff --git a/code/__DEFINES/tools_and_qualities.dm b/code/__DEFINES/tools_and_qualities.dm
index 5ea1a0e88e05..2cc3177fe229 100644
--- a/code/__DEFINES/tools_and_qualities.dm
+++ b/code/__DEFINES/tools_and_qualities.dm
@@ -94,4 +94,4 @@
 #define WORKSOUND_HARD_SLASH			'sound/weapons/bladeslice.ogg'
 #define WORKSOUND_CHAINSAW				'sound/items/chainsaw.ogg'
 #define WORKSOUND_TAPE					'sound/items/duct_tape.ogg'
-#define WORKSOUND_HONK                  'sound/items/bikehorn.ogg'
+#define WORKSOUND_HONK					'sound/items/bikehorn.ogg'
diff --git a/code/game/objects/items/tools/_tools.dm b/code/game/objects/items/tools/_tools.dm
index 8fbba03478e1..78d8b408186f 100644
--- a/code/game/objects/items/tools/_tools.dm
+++ b/code/game/objects/items/tools/_tools.dm
@@ -1,119 +1,33 @@
-// Time added to tool operations in percent based on original time
-// (if you dig hole in 10 seconds then 50 ADDITIONAL_TIME_LOWHEALTH will add 0 on full health, 2.5sec on 50% health and 5sec ~0% health)
-#define ADDITIONAL_TIME_LOWHEALTH 60
-
 /obj/item/tool
 	name = "tool"
 	icon = 'icons/obj/tools.dmi'
 	slot_flags = SLOT_BELT
-	force = WEAPON_FORCE_NORMAL
-	throwforce = WEAPON_FORCE_NORMAL
+	force = 10
+	throwforce = 10
 	w_class = ITEM_SIZE_SMALL
 
-/*
-	//spawn values
-	bad_type = /obj/item/tool
-	spawn_tags = SPAWN_TAG_TOOL
-
-	price_tag = 20
-
-	health = 600
-	maxHealth = 600
-
-	var/tool_in_use = FALSE
-
-	var/force_upgrade_mults = 1
-
-	var/force_upgrade_mods = 0
-
-	var/sparks_on_use = FALSE	//Set to TRUE if you want to have sparks on each use of a tool
-	var/eye_hazard = FALSE	//Set to TRUE should damage users eyes if they without eye protection
-
-	var/use_power_cost = 0	//For tool system, determinze how much power tool will drain from cells, 0 means no cell needed
-	var/obj/item/cell/cell
-	var/suitable_cell	//Dont forget to edit this for a tool, if you want in to consume cells
-	var/passive_power_cost = 1 //Energy consumed per process tick while active
-
-	var/use_fuel_cost = 0	//Same, only for fuel. And for the sake of God, DONT USE CELLS AND FUEL SIMULTANEOUSLY.
-	var/passive_fuel_cost = 0.03 //Fuel consumed per process tick while active
-	var/max_fuel = 0
-
-	var/mode = NOMODE //For various tool icon updates.
-
-	//Third type of resource, stock. A tool that uses physical objects (or itself) in order to work
-	//Currently used for tape roll
-	var/use_stock_cost = 0
-	var/stock = 0
-	var/max_stock = 0
-	var/allow_decimal_stock = TRUE
-	var/delete_when_empty = TRUE
-
-
-	//Variables used for tool degradation
-	health = 0		// Health of a tool.
-	maxHealth = 1000
-	var/degradation = 0.8 //If nonzero, the health of the tool decreases by this amount after each tool operation
-	var/health_threshold  = 40 // threshold in percent on which tool health stops dropping
-	var/lastNearBreakMessage = 0 // used to show messages that tool is about to break
-	var/isBroken = FALSE
-
-
-	var/toggleable = FALSE	//Determines if it can be switched ON or OFF, for example, if you need a tool that will consume power/fuel upon turning it ON only. Such as welder.
-	var/switched_on = FALSE	//Curent status of tool. Dont edit this in subtypes vars, its for procs only.
-	var/switched_on_qualities	//This var will REPLACE tool_qualities when tool will be toggled on.
-	var/switched_on_force
-	var/switched_on_hitsound
-	var/switched_off_qualities	//This var will REPLACE tool_qualities when tool will be toggled off. So its possible for tool to have diferent qualities both for ON and OFF state.
-	var/create_hot_spot = FALSE	 //Set this TRUE to ignite plasma on turf with tool upon activation
-	var/glow_color	//Set color of glow upon activation, or leave it null if you dont want any light
-	var/last_tooluse = 0 //When the tool was last used for a tool operation. This is set both at the start of an operation, and after the doafter call
-
-	//Vars for tool upgrades
-	var/precision = 0	//Subtracted from failure rates
-	var/workspeed = 1	//Worktimes are divided by this
-	var/extra_bulk = 0 	//Extra physicial volume added by certain mods
-	var/list/prefixes = list()
-*/
-
+/******************************
+	/* Data and Checking */
+*******************************/
 /obj/item/proc/has_quality(quality_id)
 	return !quality_id || (quality_id in tool_qualities)
 
-/obj/item/tool/admin_debug
-	name = "Electric Boogaloo 3000"
-	icon_state = "omnitool"
-	item_state = "omnitool"
-	spawn_tags = null
-	tool_qualities = list(QUALITY_BOLT_TURNING = 100,
-							QUALITY_PRYING = 100,
-							QUALITY_WELDING = 100,
-							QUALITY_SCREW_DRIVING = 100,
-							QUALITY_CLAMPING = 100,
-							QUALITY_CAUTERIZING = 100,
-							QUALITY_WIRE_CUTTING = 100,
-							QUALITY_RETRACTING = 100,
-							QUALITY_DRILLING = 100,
-							QUALITY_SAWING = 100,
-							QUALITY_VEIN_FIXING = 100,
-							QUALITY_BONE_SETTING = 100,
-							QUALITY_BONE_FIXING = 100,
-							QUALITY_SHOVELING = 100,
-							QUALITY_DIGGING = 100,
-							QUALITY_EXCAVATION = 100,
-							QUALITY_CUTTING = 100,
-							QUALITY_HAMMERING = 100,
-							QUALITY_FILING = 100)
 
-/obj/item/tool/hammer
-	name = "ballpin hammer"
-	icon_state = "oldcrowbar"
-	tool_qualities = (QUALITY_HAMMERING = 50)
+/obj/item/proc/get_tool_quality(quality_id)
+	if(tool_qualities && tool_qualities.len)
+		return tool_qualities[quality_id]
+	return null
+
+//We are cheking if our item got required qualities. If we require several qualities, and item posses more than one of those, we ask user to choose how that item should be used
+/obj/item/proc/get_tool_type(mob/living/user, list/required_qualities, atom/use_on, datum/callback/CB)
+	if(!tool_qualities) //This is not a tool, or does not have tool qualities
+		return
 
-/obj/item/tool/file
-	name = "metal file"
-	icon_state = "oldwrench"
-	tool_qualities = (QUALITY_FILING = 50)
+	var/list/L = required_qualities & tool_qualities
 
-/obj/item/tool/saw
-	name = "rusty hacksaw"
-	icon_state = "oldcutters_map"
-	tool_qualities = (QUALITY_SAWING = 50)
+	if(L.len)
+		if(L.len == 1)
+			return L[1]
+		for(var/i in L)
+			L[i] = image(icon = 'icons/mob/radial.dmi', icon_state = i)
+		return show_radial_menu(user, use_on ? use_on : user, L, tooltips = TRUE, require_near = TRUE, custom_check = CB)
diff --git a/code/game/objects/items/tools/simple_tools.dm b/code/game/objects/items/tools/simple_tools.dm
new file mode 100644
index 000000000000..da9c76cddf44
--- /dev/null
+++ b/code/game/objects/items/tools/simple_tools.dm
@@ -0,0 +1,41 @@
+// Tools not cool enough for there own file
+
+/obj/item/tool/admin_debug
+	name = "Electric Boogaloo 3000"
+	icon_state = "omnitool"
+	item_state = "omnitool"
+	spawn_tags = null
+	tool_qualities = list(QUALITY_BOLT_TURNING = 100,
+							QUALITY_PRYING = 100,
+							QUALITY_WELDING = 100,
+							QUALITY_SCREW_DRIVING = 100,
+							QUALITY_CLAMPING = 100,
+							QUALITY_CAUTERIZING = 100,
+							QUALITY_WIRE_CUTTING = 100,
+							QUALITY_RETRACTING = 100,
+							QUALITY_DRILLING = 100,
+							QUALITY_SAWING = 100,
+							QUALITY_VEIN_FIXING = 100,
+							QUALITY_BONE_SETTING = 100,
+							QUALITY_BONE_FIXING = 100,
+							QUALITY_SHOVELING = 100,
+							QUALITY_DIGGING = 100,
+							QUALITY_EXCAVATION = 100,
+							QUALITY_CUTTING = 100,
+							QUALITY_HAMMERING = 100,
+							QUALITY_FILING = 100)
+
+/obj/item/tool/hammer
+	name = "ballpin hammer"
+	icon_state = "oldcrowbar"
+	tool_qualities = (QUALITY_HAMMERING = 50)
+
+/obj/item/tool/file
+	name = "metal file"
+	icon_state = "oldwrench"
+	tool_qualities = (QUALITY_FILING = 50)
+
+/obj/item/tool/saw
+	name = "rusty hacksaw"
+	icon_state = "oldcutters_map"
+	tool_qualities = (QUALITY_SAWING = 50)
diff --git a/shiptest.dme b/shiptest.dme
index 508ee627d31b..ca26079a77a2 100644
--- a/shiptest.dme
+++ b/shiptest.dme
@@ -1310,6 +1310,7 @@
 #include "code\game\objects\items\tools\chisel.dm"
 #include "code\game\objects\items\tools\crowbar.dm"
 #include "code\game\objects\items\tools\screwdriver.dm"
+#include "code\game\objects\items\tools\simple_tools.dm"
 #include "code\game\objects\items\tools\weldingtool.dm"
 #include "code\game\objects\items\tools\wirecutters.dm"
 #include "code\game\objects\items\tools\wrench.dm"

From d0f65524b1d003e50c19e77fbaa853165f20549f Mon Sep 17 00:00:00 2001
From: fallcon <falloutfalconplays@gmail.com>
Date: Tue, 2 Apr 2024 10:27:49 -0500
Subject: [PATCH 64/89] yea

---
 code/game/objects/items/tools/_tools.dm       | 4 ++--
 code/game/objects/items/tools/simple_tools.dm | 7 +++----
 code/modules/guncrafting/lathe.dm             | 2 +-
 code/modules/guncrafting/recipe.dm            | 2 +-
 4 files changed, 7 insertions(+), 8 deletions(-)

diff --git a/code/game/objects/items/tools/_tools.dm b/code/game/objects/items/tools/_tools.dm
index 78d8b408186f..eb4e03e9b406 100644
--- a/code/game/objects/items/tools/_tools.dm
+++ b/code/game/objects/items/tools/_tools.dm
@@ -1,10 +1,10 @@
 /obj/item/tool
 	name = "tool"
 	icon = 'icons/obj/tools.dmi'
-	slot_flags = SLOT_BELT
+	slot_flags = ITEM_SLOT_BELT
 	force = 10
 	throwforce = 10
-	w_class = ITEM_SIZE_SMALL
+	w_class = WEIGHT_CLASS_SMALL
 
 /******************************
 	/* Data and Checking */
diff --git a/code/game/objects/items/tools/simple_tools.dm b/code/game/objects/items/tools/simple_tools.dm
index da9c76cddf44..e30fe286a9c8 100644
--- a/code/game/objects/items/tools/simple_tools.dm
+++ b/code/game/objects/items/tools/simple_tools.dm
@@ -4,7 +4,6 @@
 	name = "Electric Boogaloo 3000"
 	icon_state = "omnitool"
 	item_state = "omnitool"
-	spawn_tags = null
 	tool_qualities = list(QUALITY_BOLT_TURNING = 100,
 							QUALITY_PRYING = 100,
 							QUALITY_WELDING = 100,
@@ -28,14 +27,14 @@
 /obj/item/tool/hammer
 	name = "ballpin hammer"
 	icon_state = "oldcrowbar"
-	tool_qualities = (QUALITY_HAMMERING = 50)
+	tool_qualities = list(QUALITY_HAMMERING = 50)
 
 /obj/item/tool/file
 	name = "metal file"
 	icon_state = "oldwrench"
-	tool_qualities = (QUALITY_FILING = 50)
+	tool_qualities = list(QUALITY_FILING = 50)
 
 /obj/item/tool/saw
 	name = "rusty hacksaw"
 	icon_state = "oldcutters_map"
-	tool_qualities = (QUALITY_SAWING = 50)
+	tool_qualities = list(QUALITY_SAWING = 50)
diff --git a/code/modules/guncrafting/lathe.dm b/code/modules/guncrafting/lathe.dm
index 57eacfea330b..d0a235c753a7 100644
--- a/code/modules/guncrafting/lathe.dm
+++ b/code/modules/guncrafting/lathe.dm
@@ -60,7 +60,7 @@
 			if(mode == "Fabricate")
 				work_on_part(user)
 		else
-			balloon_alert(user, "You need a tool with [tool_required] to work on this part.")
+			balloon_alert(user, "you need a tool with [tool_required] to work on this part.")
 	if(work_piece)
 		to_chat(user, "You cant add another item to the lathe.")
 		return
diff --git a/code/modules/guncrafting/recipe.dm b/code/modules/guncrafting/recipe.dm
index 84b234a75b38..d1432cf6952c 100644
--- a/code/modules/guncrafting/recipe.dm
+++ b/code/modules/guncrafting/recipe.dm
@@ -33,7 +33,7 @@
 /datum/lathe_recipe/gun/candor
 	result = /obj/item/gun/ballistic/automatic/pistol/candor
 	valid_parts = list(
-		/obj/item/part/gun/frame/candor,
+		/obj/item/part/gun/frame/pistol/candor,
 		/obj/item/part/gun/modular/grip/wood,
 		/obj/item/part/gun/modular/mechanism/pistol,
 		/obj/item/part/gun/modular/barrel/pistol

From ecfdd90f0b2352e72f6a80801e8ae90df516cebd Mon Sep 17 00:00:00 2001
From: fallcon <falloutfalconplays@gmail.com>
Date: Tue, 2 Apr 2024 10:31:22 -0500
Subject: [PATCH 65/89] pass mabye

---
 code/modules/guncrafting/lathe.dm | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/code/modules/guncrafting/lathe.dm b/code/modules/guncrafting/lathe.dm
index d0a235c753a7..f1bae422a228 100644
--- a/code/modules/guncrafting/lathe.dm
+++ b/code/modules/guncrafting/lathe.dm
@@ -204,7 +204,7 @@
 			to_chat(user, "You have [steps_left] steps left.")
 			user.adjustStaminaLoss(DECONSTRUCT_STAMINA_USE)
 			tool_required = pick(tools_required)
-			balloon_alert(user, "You need a [tool_required.name] next.")
+			balloon_alert(user, "You need a tool with [tool_required] next.")
 			work_on_part(user)
 		else
 			fabricate_part(user)

From e7a6c2b67a7f2b57e7ea08aec27bb91851034324 Mon Sep 17 00:00:00 2001
From: FalloutFalcon <falloutfalconplays@gmail.com>
Date: Wed, 3 Apr 2024 21:44:31 -0500
Subject: [PATCH 66/89] wow surpised it already builds

---
 code/controllers/subsystem/traumas.dm         |   1 -
 code/game/gamemodes/objective.dm              |  25 ---
 code/game/objects/items/storage/belt.dm       |  27 ----
 .../antagonists/survivalist/survivalist.dm    |  14 --
 .../antagonists/wizard/equipment/spellbook.dm |  47 ------
 code/modules/antagonists/wizard/wizard.dm     |   1 -
 code/modules/cargo/exports/lavaland.dm        |   4 +-
 code/modules/events/wizard/magicarp.dm        |   8 +-
 code/modules/mining/equipment/survival_pod.dm |   4 -
 .../mining/lavaland/necropolis_chests.dm      |   4 +-
 .../modules/mob/dead/new_player/new_player.dm |   2 -
 .../projectiles/ammunition/special/magic.dm   |   4 +-
 code/modules/projectiles/guns/magic/staff.dm  | 142 ------------------
 .../guns/{magic/wand.dm => misc/debug.dm}     | 140 -----------------
 code/modules/projectiles/projectile/debug.dm  |  23 +++
 code/modules/projectiles/projectile/magic.dm  |  50 ------
 .../spells/spell_types/rightandwrong.dm       | 101 +------------
 code/modules/vending/autodrobe.dm             |   1 -
 shiptest.dme                                  |   4 +-
 19 files changed, 40 insertions(+), 562 deletions(-)
 delete mode 100644 code/modules/projectiles/guns/magic/staff.dm
 rename code/modules/projectiles/guns/{magic/wand.dm => misc/debug.dm} (51%)
 create mode 100644 code/modules/projectiles/projectile/debug.dm

diff --git a/code/controllers/subsystem/traumas.dm b/code/controllers/subsystem/traumas.dm
index 1e697327c844..9b6fd4b65daa 100644
--- a/code/controllers/subsystem/traumas.dm
+++ b/code/controllers/subsystem/traumas.dm
@@ -132,7 +132,6 @@ SUBSYSTEM_DEF(traumas)
 			/obj/item/soulstone,
 			/obj/item/clothing/suit/wizrobe, /obj/item/clothing/head/wizard, /obj/item/spellbook, /obj/item/staff,
 			/obj/item/clothing/suit/space/hardsuit/shielded/wizard, /obj/item/clothing/suit/space/hardsuit/wizard,
-			/obj/item/gun/magic/staff, /obj/item/gun/magic/wand,
 			/obj/item/nullrod, /obj/item/clothing/under/rank/civilian/chaplain)),
 
 		"aliens"   = typecacheof(list(
diff --git a/code/game/gamemodes/objective.dm b/code/game/gamemodes/objective.dm
index 82735ff9d522..65e161f2176b 100644
--- a/code/game/gamemodes/objective.dm
+++ b/code/game/gamemodes/objective.dm
@@ -883,31 +883,6 @@ GLOBAL_LIST_EMPTY(possible_items_special)
 	explanation_text = "Steal at least five guns!"
 	wanted_items = list(/obj/item/gun)
 
-/datum/objective/steal_five_of_type/summon_magic
-	name = "steal magic"
-	explanation_text = "Steal at least five magical artefacts!"
-	wanted_items = list()
-
-/datum/objective/steal_five_of_type/summon_magic/New()
-	wanted_items = GLOB.summoned_magic_objectives
-	..()
-
-/datum/objective/steal_five_of_type/summon_magic/check_completion()
-	var/list/datum/mind/owners = get_owners()
-	var/stolen_count = 0
-	for(var/datum/mind/M in owners)
-		if(!isliving(M.current))
-			continue
-		var/list/all_items = M.current.GetAllContents()	//this should get things in cheesewheels, books, etc.
-		for(var/obj/I in all_items) //Check for wanted items
-			if(istype(I, /obj/item/book/granter/spell))
-				var/obj/item/book/granter/spell/spellbook = I
-				if(!spellbook.used || !spellbook.oneuse) //if the book still has powers...
-					stolen_count++ //it counts. nice.
-			else if(is_type_in_typecache(I, wanted_items))
-				stolen_count++
-	return stolen_count >= 5
-
 //Created by admin tools
 /datum/objective/custom
 	name = "custom"
diff --git a/code/game/objects/items/storage/belt.dm b/code/game/objects/items/storage/belt.dm
index d6ef29b86233..216bf5b23485 100644
--- a/code/game/objects/items/storage/belt.dm
+++ b/code/game/objects/items/storage/belt.dm
@@ -592,33 +592,6 @@
 		/obj/item/multitool = 1)
 	generate_items_inside(items_inside,src)
 
-
-/obj/item/storage/belt/wands
-	name = "wand belt"
-	desc = "A belt designed to hold various rods of power. A veritable fanny pack of exotic magic."
-	icon_state = "soulstone"
-	item_state = "soulstone"
-
-/obj/item/storage/belt/wands/ComponentInitialize()
-	. = ..()
-	var/datum/component/storage/STR = GetComponent(/datum/component/storage)
-	STR.max_items = 6
-	STR.set_holdable(list(
-		/obj/item/gun/magic/wand
-		))
-
-/obj/item/storage/belt/wands/full/PopulateContents()
-	new /obj/item/gun/magic/wand/death(src)
-	new /obj/item/gun/magic/wand/resurrection(src)
-	new /obj/item/gun/magic/wand/polymorph(src)
-	new /obj/item/gun/magic/wand/teleport(src)
-	new /obj/item/gun/magic/wand/door(src)
-	new /obj/item/gun/magic/wand/fireball(src)
-
-	for(var/obj/item/gun/magic/wand/W in contents) //All wands in this pack come in the best possible condition
-		W.max_charges = initial(W.max_charges)
-		W.charges = W.max_charges
-
 /obj/item/storage/belt/janitor
 	name = "janibelt"
 	desc = "A belt used to hold most janitorial supplies."
diff --git a/code/modules/antagonists/survivalist/survivalist.dm b/code/modules/antagonists/survivalist/survivalist.dm
index 0e38dc57105d..1fb457eea64b 100644
--- a/code/modules/antagonists/survivalist/survivalist.dm
+++ b/code/modules/antagonists/survivalist/survivalist.dm
@@ -26,17 +26,3 @@
 	guns.owner = owner
 	objectives += guns
 	..()
-
-/datum/antagonist/survivalist/magic
-	name = "Amateur Magician"
-	greet_message = "Grow your newfound talent! Grab as many magical artefacts as possible, by any means necessary. Kill anyone who gets in your way."
-
-/datum/antagonist/survivalist/magic/greet()
-	..()
-	to_chat(owner, "<span class='notice'>As a wonderful magician, you should remember that spellbooks don't mean anything if they are used up.</span>")
-
-/datum/antagonist/survivalist/magic/forge_objectives()
-	var/datum/objective/steal_five_of_type/summon_magic/magic = new
-	magic.owner = owner
-	objectives += magic
-	..()
diff --git a/code/modules/antagonists/wizard/equipment/spellbook.dm b/code/modules/antagonists/wizard/equipment/spellbook.dm
index cf85a922dbb6..690cf94cd9a3 100644
--- a/code/modules/antagonists/wizard/equipment/spellbook.dm
+++ b/code/modules/antagonists/wizard/equipment/spellbook.dm
@@ -279,47 +279,6 @@
 		dat += "[surplus] left.<br>"
 	return dat
 
-/datum/spellbook_entry/item/staffchange
-	name = "Staff of Change"
-	desc = "An artefact that spits bolts of coruscating energy which cause the target's very form to reshape itself."
-	item_path = /obj/item/gun/magic/staff/change
-
-/datum/spellbook_entry/item/staffanimation
-	name = "Staff of Animation"
-	desc = "An arcane staff capable of shooting bolts of eldritch energy which cause inanimate objects to come to life. This magic doesn't affect machines."
-	item_path = /obj/item/gun/magic/staff/animate
-	category = "Assistance"
-
-/datum/spellbook_entry/item/staffchaos
-	name = "Staff of Chaos"
-	desc = "A caprious tool that can fire all sorts of magic without any rhyme or reason. Using it on people you care about is not recommended."
-	item_path = /obj/item/gun/magic/staff/chaos
-
-/datum/spellbook_entry/item/spellblade
-	name = "Spellblade"
-	desc = "A sword capable of firing blasts of energy which rip targets limb from limb."
-	item_path = /obj/item/gun/magic/staff/spellblade
-
-/datum/spellbook_entry/item/staffdoor
-	name = "Staff of Door Creation"
-	desc = "A particular staff that can mold solid walls into ornate doors. Useful for getting around in the absence of other transportation. Does not work on glass."
-	item_path = /obj/item/gun/magic/staff/door
-	cost = 1
-	category = "Mobility"
-
-/datum/spellbook_entry/item/staffhealing
-	name = "Staff of Healing"
-	desc = "An altruistic staff that can heal the lame and raise the dead."
-	item_path = /obj/item/gun/magic/staff/healing
-	cost = 1
-	category = "Defensive"
-
-/datum/spellbook_entry/item/lockerstaff
-	name = "Staff of the Locker"
-	desc = "A staff that shoots lockers. It eats anyone it hits on its way, leaving a welded locker with your victims behind."
-	item_path = /obj/item/gun/magic/staff/locker
-	category = "Defensive"
-
 /datum/spellbook_entry/item/scryingorb
 	name = "Scrying Orb"
 	desc = "An incandescent orb of crackling energy. Using it will allow you to release your ghost while alive, allowing you to spy upon others and talk to the deceased. In addition, buying it will permanently grant you X-ray vision."
@@ -344,12 +303,6 @@
 	item_path = /obj/item/necromantic_stone
 	category = "Assistance"
 
-/datum/spellbook_entry/item/wands
-	name = "Wand Assortment"
-	desc = "A collection of wands that allow for a wide variety of utility. Wands have a limited number of charges, so be conservative with their use. Comes in a handy belt."
-	item_path = /obj/item/storage/belt/wands/full
-	category = "Defensive"
-
 /datum/spellbook_entry/item/armor
 	name = "Mastercrafted Armor Set"
 	desc = "An artefact suit of armor that allows you to cast spells while providing more protection against attacks and the void of space."
diff --git a/code/modules/antagonists/wizard/wizard.dm b/code/modules/antagonists/wizard/wizard.dm
index 14cf56d51ae0..96a41b2ac07b 100644
--- a/code/modules/antagonists/wizard/wizard.dm
+++ b/code/modules/antagonists/wizard/wizard.dm
@@ -204,7 +204,6 @@
 		if(APPRENTICE_HEALING)
 			owner.AddSpell(new /obj/effect/proc_holder/spell/targeted/charge(null))
 			owner.AddSpell(new /obj/effect/proc_holder/spell/targeted/forcewall(null))
-			H.put_in_hands(new /obj/item/gun/magic/staff/healing(H))
 			to_chat(owner, "<B>Your service has not gone unrewarded, however. Studying under [master.current.real_name], you have learned life-saving survival spells. You are able to cast charge and forcewall.")
 		if(APPRENTICE_ROBELESS)
 			owner.AddSpell(new /obj/effect/proc_holder/spell/aoe_turf/knock(null))
diff --git a/code/modules/cargo/exports/lavaland.dm b/code/modules/cargo/exports/lavaland.dm
index 9b0adbf0d106..e325b8e8d09b 100644
--- a/code/modules/cargo/exports/lavaland.dm
+++ b/code/modules/cargo/exports/lavaland.dm
@@ -23,7 +23,6 @@
 						/obj/item/lava_staff,
 						/obj/item/ship_in_a_bottle,
 						/obj/item/clothing/shoes/clown_shoes/banana_shoes,
-						/obj/item/gun/magic/staff/honk,
 						/obj/item/kitchen/knife/envy,
 						/obj/item/veilrender/vealrender,
 						/obj/item/nullrod/scythe/talking/necro,
@@ -54,8 +53,7 @@
 						/obj/machinery/anomalous_crystal,
 						/obj/item/mayhem,
 						/obj/item/blood_contract,
-						/obj/item/guardiancreator/miner/choose,//this is basically the most valulable mining loot so good luck getting a miner to part ways
-						/obj/item/gun/magic/staff/spellblade,
+						/obj/item/guardiancreator/miner/choose//this is basically the most valulable mining loot so good luck getting a miner to part ways
 						)
 
 /datum/export/lavaland/trophycommon
diff --git a/code/modules/events/wizard/magicarp.dm b/code/modules/events/wizard/magicarp.dm
index 68a38f0479e1..2546b1ebbb18 100644
--- a/code/modules/events/wizard/magicarp.dm
+++ b/code/modules/events/wizard/magicarp.dm
@@ -41,8 +41,8 @@
 	food_type = list()
 	tame_chance = 0
 	bonus_tame_chance = 0
-	var/allowed_projectile_types = list(/obj/projectile/magic/change, /obj/projectile/magic/animate, /obj/projectile/magic/resurrection,
-	/obj/projectile/magic/death, /obj/projectile/magic/teleport, /obj/projectile/magic/door, /obj/projectile/magic/aoe/fireball,
+	var/allowed_projectile_types = list(/obj/projectile/magic/change, /obj/projectile/magic/animate,
+	/obj/projectile/magic/teleport, /obj/projectile/magic/door, /obj/projectile/magic/aoe/fireball,
 	/obj/projectile/magic/spellblade, /obj/projectile/magic/arcane_barrage)
 
 /mob/living/simple_animal/hostile/carp/ranged/Initialize()
@@ -69,7 +69,7 @@
 
 /mob/living/simple_animal/hostile/carp/ranged/chaos/xenobiology
 	gold_core_spawnable = HOSTILE_SPAWN
-	allowed_projectile_types = list(/obj/projectile/magic/change, /obj/projectile/magic/animate, /obj/projectile/magic/resurrection,
-	/obj/projectile/magic/death, /obj/projectile/magic/teleport, /obj/projectile/magic/door, /obj/projectile/magic/aoe/fireball,
+	allowed_projectile_types = list(/obj/projectile/magic/change, /obj/projectile/magic/animate,
+	/obj/projectile/magic/teleport, /obj/projectile/magic/door, /obj/projectile/magic/aoe/fireball,
 	/obj/projectile/magic/spellblade, /obj/projectile/magic/arcane_barrage, /obj/projectile/magic/locker, /obj/projectile/magic/nothing,
 	/obj/projectile/magic/aoe/lightning, /obj/projectile/magic/necropotence, /obj/projectile/magic/fortify, /obj/projectile/magic/spell/magic_missile)//now THIS is chaos
diff --git a/code/modules/mining/equipment/survival_pod.dm b/code/modules/mining/equipment/survival_pod.dm
index 5e012735b706..9cee3f8742f4 100644
--- a/code/modules/mining/equipment/survival_pod.dm
+++ b/code/modules/mining/equipment/survival_pod.dm
@@ -313,10 +313,6 @@
 						/obj/item/hierophant_club,
 						/obj/item/gun/energy/minigun,
 						/obj/item/gun/ballistic/automatic/hmg/l6_saw,
-						/obj/item/gun/magic/staff/chaos,
-						/obj/item/gun/magic/staff/spellblade,
-						/obj/item/gun/magic/wand/death,
-						/obj/item/gun/magic/wand/fireball,
 						/obj/item/stack/telecrystal/twenty,
 						/obj/item/nuke_core,
 						/obj/item/phylactery,
diff --git a/code/modules/mining/lavaland/necropolis_chests.dm b/code/modules/mining/lavaland/necropolis_chests.dm
index 985c5212299b..4edc13071932 100644
--- a/code/modules/mining/lavaland/necropolis_chests.dm
+++ b/code/modules/mining/lavaland/necropolis_chests.dm
@@ -1493,14 +1493,12 @@
 /obj/structure/closet/crate/necropolis/bubblegum/PopulateContents()
 	new /obj/item/clothing/suit/space/hostile_environment(src)
 	new /obj/item/clothing/head/helmet/space/hostile_environment(src)
-	var/loot = rand(1,3)
+	var/loot = rand(1,2)
 	switch(loot)
 		if(1)
 			new /obj/item/mayhem(src)
 		if(2)
 			new /obj/item/blood_contract(src)
-		if(3)
-			new /obj/item/gun/magic/staff/spellblade(src)
 
 /obj/structure/closet/crate/necropolis/bubblegum/crusher
 	name = "bloody bubblegum chest"
diff --git a/code/modules/mob/dead/new_player/new_player.dm b/code/modules/mob/dead/new_player/new_player.dm
index 9baa46f526b5..46d5240e922b 100644
--- a/code/modules/mob/dead/new_player/new_player.dm
+++ b/code/modules/mob/dead/new_player/new_player.dm
@@ -335,8 +335,6 @@
 
 		if(GLOB.summon_guns_triggered)
 			give_guns(humanc)
-		if(GLOB.summon_magic_triggered)
-			give_magic(humanc)
 		if(GLOB.curse_of_madness_triggered)
 			give_madness(humanc, GLOB.curse_of_madness_triggered)
 		if(CONFIG_GET(flag/roundstart_traits))
diff --git a/code/modules/projectiles/ammunition/special/magic.dm b/code/modules/projectiles/ammunition/special/magic.dm
index 4d9aae44329d..5d30ba97690e 100644
--- a/code/modules/projectiles/ammunition/special/magic.dm
+++ b/code/modules/projectiles/ammunition/special/magic.dm
@@ -12,11 +12,11 @@
 	projectile_type = /obj/projectile/magic/animate
 
 /obj/item/ammo_casing/magic/heal
-	projectile_type = /obj/projectile/magic/resurrection
+	projectile_type = /obj/projectile/debug/resurrection
 	harmful = FALSE
 
 /obj/item/ammo_casing/magic/death
-	projectile_type = /obj/projectile/magic/death
+	projectile_type = /obj/projectile/debug/death
 
 /obj/item/ammo_casing/magic/teleport
 	projectile_type = /obj/projectile/magic/teleport
diff --git a/code/modules/projectiles/guns/magic/staff.dm b/code/modules/projectiles/guns/magic/staff.dm
deleted file mode 100644
index e8f1683d21a1..000000000000
--- a/code/modules/projectiles/guns/magic/staff.dm
+++ /dev/null
@@ -1,142 +0,0 @@
-/obj/item/gun/magic/staff
-	slot_flags = ITEM_SLOT_BACK
-	lefthand_file = 'icons/mob/inhands/weapons/staves_lefthand.dmi'
-	righthand_file = 'icons/mob/inhands/weapons/staves_righthand.dmi'
-	item_flags = NEEDS_PERMIT | NO_MAT_REDEMPTION
-
-/obj/item/gun/magic/staff/change
-	name = "staff of change"
-	desc = "An artefact that spits bolts of coruscating energy which cause the target's very form to reshape itself."
-	fire_sound = 'sound/magic/staff_change.ogg'
-	ammo_type = /obj/item/ammo_casing/magic/change
-	icon_state = "staffofchange"
-	item_state = "staffofchange"
-
-/obj/item/gun/magic/staff/animate
-	name = "staff of animation"
-	desc = "An artefact that spits bolts of life-force which causes objects which are hit by it to animate and come to life! This magic doesn't affect machines."
-	fire_sound = 'sound/magic/staff_animation.ogg'
-	ammo_type = /obj/item/ammo_casing/magic/animate
-	icon_state = "staffofanimation"
-	item_state = "staffofanimation"
-
-/obj/item/gun/magic/staff/healing
-	name = "staff of healing"
-	desc = "An artefact that spits bolts of restoring magic which can remove ailments of all kinds and even raise the dead."
-	fire_sound = 'sound/magic/staff_healing.ogg'
-	ammo_type = /obj/item/ammo_casing/magic/heal
-	icon_state = "staffofhealing"
-	item_state = "staffofhealing"
-
-/obj/item/gun/magic/staff/healing/handle_suicide() //Stops people trying to commit suicide to heal themselves
-	return
-
-/obj/item/gun/magic/staff/chaos
-	name = "staff of chaos"
-	desc = "An artefact that spits bolts of chaotic magic that can potentially do anything."
-	fire_sound = 'sound/magic/staff_chaos.ogg'
-	ammo_type = /obj/item/ammo_casing/magic/chaos
-	icon_state = "staffofchaos"
-	item_state = "staffofchaos"
-	max_charges = 10
-	recharge_rate = 2
-	no_den_usage = 1
-	var/allowed_projectile_types = list(/obj/projectile/magic/change, /obj/projectile/magic/animate, /obj/projectile/magic/resurrection,
-	/obj/projectile/magic/death, /obj/projectile/magic/teleport, /obj/projectile/magic/door, /obj/projectile/magic/aoe/fireball,
-	/obj/projectile/magic/spellblade, /obj/projectile/magic/arcane_barrage, /obj/projectile/magic/locker, /obj/projectile/magic/flying,
-	/obj/projectile/magic/bounty, /obj/projectile/magic/antimagic, /obj/projectile/magic/fetch, /obj/projectile/magic/sapping,
-	/obj/projectile/magic/necropotence, /obj/projectile/magic, /obj/projectile/temp/chill, /obj/projectile/magic/wipe)
-
-/obj/item/gun/magic/staff/chaos/process_fire(atom/target, mob/living/user, message = TRUE, params = null, zone_override = "", bonus_spread = 0)
-	chambered.projectile_type = pick(allowed_projectile_types)
-	. = ..()
-
-/obj/item/gun/magic/staff/door
-	name = "staff of door creation"
-	desc = "An artefact that spits bolts of transformative magic that can create doors in walls."
-	fire_sound = 'sound/magic/staff_door.ogg'
-	ammo_type = /obj/item/ammo_casing/magic/door
-	icon_state = "staffofdoor"
-	item_state = "staffofdoor"
-	max_charges = 10
-	recharge_rate = 2
-	no_den_usage = 1
-
-/obj/item/gun/magic/staff/honk
-	name = "staff of the honkmother"
-	desc = "Honk."
-	fire_sound = 'sound/items/airhorn.ogg'
-	ammo_type = /obj/item/ammo_casing/magic/honk
-	icon_state = "honker"
-	item_state = "honker"
-	max_charges = 4
-	recharge_rate = 8
-
-/obj/item/gun/magic/staff/spellblade
-	name = "spellblade"
-	desc = "A deadly combination of laziness and boodlust, this blade allows the user to dismember their enemies without all the hard work of actually swinging the sword."
-	fire_sound = 'sound/magic/fireball.ogg'
-	ammo_type = /obj/item/ammo_casing/magic/spellblade
-	icon_state = "spellblade"
-	item_state = "spellblade"
-	lefthand_file = 'icons/mob/inhands/weapons/swords_lefthand.dmi'
-	righthand_file = 'icons/mob/inhands/weapons/swords_righthand.dmi'
-	hitsound = 'sound/weapons/rapierhit.ogg'
-	force = 20
-	armour_penetration = 75
-	block_chance = 50
-	sharpness = IS_SHARP
-	max_charges = 4
-
-/obj/item/gun/magic/staff/spellblade/Initialize()
-	. = ..()
-	AddComponent(/datum/component/butchering, 15, 125, 0, hitsound)
-
-/obj/item/gun/magic/staff/spellblade/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(attack_type == PROJECTILE_ATTACK)
-		final_block_chance = 0
-	return ..()
-
-/obj/item/gun/magic/staff/locker
-	name = "staff of the locker"
-	desc = "An artefact that expells encapsulating bolts, for incapacitating thy enemy."
-	fire_sound = 'sound/magic/staff_change.ogg'
-	ammo_type = /obj/item/ammo_casing/magic/locker
-	icon_state = "locker"
-	item_state = "locker"
-	max_charges = 6
-	recharge_rate = 4
-
-//yes, they don't have sounds. they're admin staves, and their projectiles will play the chaos bolt sound anyway so why bother?
-
-/obj/item/gun/magic/staff/flying
-	name = "staff of flying"
-	desc = "An artefact that spits bolts of graceful magic that can make something fly."
-	fire_sound = 'sound/magic/staff_healing.ogg'
-	ammo_type = /obj/item/ammo_casing/magic/flying
-	icon_state = "staffofflight"
-	item_state = "staffofflight"
-
-/obj/item/gun/magic/staff/sapping
-	name = "staff of sapping"
-	desc = "An artefact that spits bolts of sapping magic that can make something sad."
-	fire_sound = 'sound/magic/staff_change.ogg'
-	ammo_type = /obj/item/ammo_casing/magic/sapping
-	icon_state = "staffofsapping"
-	item_state = "staffofsapping"
-
-/obj/item/gun/magic/staff/necropotence
-	name = "staff of necropotence"
-	desc = "An artefact that spits bolts of death magic that can repurpose the soul."
-	fire_sound = 'sound/magic/staff_change.ogg'
-	ammo_type = /obj/item/ammo_casing/magic/necropotence
-	icon_state = "staffofnecropotence"
-	item_state = "staffofnecropotence"
-
-/obj/item/gun/magic/staff/wipe
-	name = "staff of possession"
-	desc = "An artefact that spits bolts of mind-unlocking magic that can let ghosts invade the victim's mind."
-	fire_sound = 'sound/magic/staff_change.ogg'
-	ammo_type = /obj/item/ammo_casing/magic/wipe
-	icon_state = "staffofwipe"
-	item_state = "staffofwipe"
diff --git a/code/modules/projectiles/guns/magic/wand.dm b/code/modules/projectiles/guns/misc/debug.dm
similarity index 51%
rename from code/modules/projectiles/guns/magic/wand.dm
rename to code/modules/projectiles/guns/misc/debug.dm
index c6a25127878a..607dbec425b5 100644
--- a/code/modules/projectiles/guns/magic/wand.dm
+++ b/code/modules/projectiles/guns/misc/debug.dm
@@ -1,6 +1,3 @@
-//For use in prob() to determine if an empty wand will shoot once then break.
-#define WAND_WREST_CHANCE (1/121)
-
 /obj/item/gun/magic/wand
 	name = "wand"
 	desc = "You shouldn't have this."
@@ -57,24 +54,11 @@
 		return
 	update_appearance()
 
-/obj/item/gun/magic/wand/shoot_with_empty_chamber(mob/living/user)
-	if(prob(100*WAND_WREST_CHANCE))
-		to_chat(user,"<span class='danger'>You manage to activate [src] one last time.</span>")
-		charges++
-		recharge_newshot()
-		return TRUE
-	return ..()
-
 /obj/item/gun/magic/wand/proc/zap_self(mob/living/user)
 	user.visible_message("<span class='danger'>[user] zaps [user.p_them()]self with [src].</span>")
 	playsound(user, fire_sound, 50, TRUE)
 	user.log_message("zapped [user.p_them()]self with a <b>[src]</b>", LOG_ATTACK)
 
-
-/////////////////////////////////////
-//WAND OF DEATH
-/////////////////////////////////////
-
 /obj/item/gun/magic/wand/death
 	name = "wand of death"
 	desc = "This deadly wand overwhelms the victim's body with pure energy, slaying them without fail."
@@ -108,11 +92,6 @@
 	can_charge = TRUE
 	recharge_rate = 1
 
-
-/////////////////////////////////////
-//WAND OF HEALING
-/////////////////////////////////////
-
 /obj/item/gun/magic/wand/resurrection
 	name = "wand of healing"
 	desc = "This wand uses healing magics to heal and revive. They are rarely utilized within the Wizard Federation for some reason."
@@ -145,122 +124,3 @@
 	variable_charges = FALSE
 	can_charge = TRUE
 	recharge_rate = 1
-
-/////////////////////////////////////
-//WAND OF POLYMORPH
-/////////////////////////////////////
-
-/obj/item/gun/magic/wand/polymorph
-	name = "wand of polymorph"
-	desc = "This wand is attuned to chaos and will radically alter the victim's form."
-	ammo_type = /obj/item/ammo_casing/magic/change
-	icon_state = "polywand"
-	base_icon_state = "polywand"
-	fire_sound = 'sound/magic/staff_change.ogg'
-	max_charges = 10 //10, 5, 5, 4
-
-/obj/item/gun/magic/wand/polymorph/zap_self(mob/living/user)
-	..() //because the user mob ceases to exists by the time wabbajack fully resolves
-
-	wabbajack(user)
-	charges--
-
-/////////////////////////////////////
-//WAND OF TELEPORTATION
-/////////////////////////////////////
-
-/obj/item/gun/magic/wand/teleport
-	name = "wand of teleportation"
-	desc = "This wand will wrench targets through space and time to move them somewhere else."
-	ammo_type = /obj/item/ammo_casing/magic/teleport
-	fire_sound = 'sound/magic/wand_teleport.ogg'
-	icon_state = "telewand"
-	base_icon_state = "telewand"
-	max_charges = 10 //10, 5, 5, 4
-	no_den_usage = TRUE
-
-/obj/item/gun/magic/wand/teleport/zap_self(mob/living/user)
-	if(do_teleport(user, user, 10, channel = TELEPORT_CHANNEL_MAGIC))
-		var/datum/effect_system/smoke_spread/smoke = new
-		smoke.set_up(3, user.loc)
-		smoke.start()
-		charges--
-	..()
-
-/obj/item/gun/magic/wand/safety
-	name = "wand of safety"
-	desc = "This wand will use the lightest of bluespace currents to gently place the target somewhere safe."
-	ammo_type = /obj/item/ammo_casing/magic/safety
-	fire_sound = 'sound/magic/wand_teleport.ogg'
-	icon_state = "telewand"
-	base_icon_state = "telewand"
-	max_charges = 10 //10, 5, 5, 4
-	no_den_usage = FALSE
-
-/obj/item/gun/magic/wand/safety/zap_self(mob/living/user)
-	var/turf/origin = get_turf(user)
-	var/turf/destination = find_safe_turf()
-
-	if(do_teleport(user, destination, channel=TELEPORT_CHANNEL_MAGIC))
-		for(var/t in list(origin, destination))
-			var/datum/effect_system/smoke_spread/smoke = new
-			smoke.set_up(0, t)
-			smoke.start()
-	..()
-
-/obj/item/gun/magic/wand/safety/debug
-	desc = "This wand has 'find_safe_turf()' engraved into its blue wood. Perhaps it's a secret message?"
-	max_charges = 500
-	variable_charges = FALSE
-	can_charge = TRUE
-	recharge_rate = 1
-
-
-/////////////////////////////////////
-//WAND OF DOOR CREATION
-/////////////////////////////////////
-
-/obj/item/gun/magic/wand/door
-	name = "wand of door creation"
-	desc = "This particular wand can create doors in any wall for the unscrupulous wizard who shuns teleportation magics."
-	ammo_type = /obj/item/ammo_casing/magic/door
-	icon_state = "doorwand"
-	base_icon_state = "doorwand"
-	fire_sound = 'sound/magic/staff_door.ogg'
-	max_charges = 20 //20, 10, 10, 7
-	no_den_usage = 1
-
-/obj/item/gun/magic/wand/door/zap_self(mob/living/user)
-	to_chat(user, "<span class='notice'>You feel vaguely more open with your feelings.</span>")
-	charges--
-	..()
-
-/////////////////////////////////////
-//WAND OF FIREBALL
-/////////////////////////////////////
-
-/obj/item/gun/magic/wand/fireball
-	name = "wand of fireball"
-	desc = "This wand shoots scorching balls of fire that explode into destructive flames."
-	fire_sound = 'sound/magic/fireball.ogg'
-	ammo_type = /obj/item/ammo_casing/magic/fireball
-	icon_state = "firewand"
-	base_icon_state = "firewand"
-	max_charges = 8 //8, 4, 4, 3
-
-/obj/item/gun/magic/wand/fireball/zap_self(mob/living/user)
-	..()
-	explosion(user.loc, -1, 0, 2, 3, 0, flame_range = 2)
-	charges--
-
-/////////////////////////////////////
-//WAND OF NOTHING
-/////////////////////////////////////
-
-/obj/item/gun/magic/wand/nothing
-	name = "wand of nothing"
-	desc = "It's not just a stick, it's a MAGIC stick?"
-	ammo_type = /obj/item/ammo_casing/magic/nothing
-
-
-#undef WAND_WREST_CHANCE
diff --git a/code/modules/projectiles/projectile/debug.dm b/code/modules/projectiles/projectile/debug.dm
new file mode 100644
index 000000000000..06b1ea7ca3e1
--- /dev/null
+++ b/code/modules/projectiles/projectile/debug.dm
@@ -0,0 +1,23 @@
+/obj/projectile/debug/death
+	name = "bolt of death"
+	icon_state = "pulse1_bl"
+
+/obj/projectile/debug/death/on_hit(target)
+	. = ..()
+	if(ismob(target))
+		var/mob/M = target
+		M.death(0)
+
+/obj/projectile/debug/resurrection
+	name = "bolt of resurrection"
+	icon_state = "ion"
+	nodamage = TRUE
+
+/obj/projectile/debug/resurrection/on_hit(mob/living/carbon/target)
+	. = ..()
+	if(isliving(target))
+		if(target.revive(full_heal = TRUE, admin_revive = TRUE))
+			target.grab_ghost(force = TRUE) // even suicides
+			to_chat(target, "<span class='notice'>You rise with a start, you're alive!!!</span>")
+		else if(target.stat != DEAD)
+			to_chat(target, "<span class='notice'>You feel great!</span>")
diff --git a/code/modules/projectiles/projectile/magic.dm b/code/modules/projectiles/projectile/magic.dm
index 458c19d053da..544e2cc95005 100644
--- a/code/modules/projectiles/projectile/magic.dm
+++ b/code/modules/projectiles/projectile/magic.dm
@@ -7,56 +7,6 @@
 	armour_penetration = 100
 	flag = "magic"
 
-/obj/projectile/magic/death
-	name = "bolt of death"
-	icon_state = "pulse1_bl"
-
-/obj/projectile/magic/death/on_hit(target)
-	. = ..()
-	if(ismob(target))
-		var/mob/M = target
-		if(M.anti_magic_check())
-			M.visible_message("<span class='warning'>[src] vanishes on contact with [target]!</span>")
-			return BULLET_ACT_BLOCK
-		if(isliving(M))
-			var/mob/living/L = M
-			if(L.mob_biotypes & MOB_UNDEAD) //negative energy heals the undead
-				if(L.hellbound && L.stat == DEAD)
-					return BULLET_ACT_BLOCK
-				if(L.revive(full_heal = TRUE, admin_revive = TRUE))
-					L.grab_ghost(force = TRUE)
-					to_chat(L, "<span class='notice'>You rise with a start, you're undead!!!</span>")
-				else if(L.stat != DEAD)
-					to_chat(L, "<span class='notice'>You feel great!</span>")
-			else
-				L.death(0)
-		else
-			M.death(0)
-
-/obj/projectile/magic/resurrection
-	name = "bolt of resurrection"
-	icon_state = "ion"
-	damage = 0
-	damage_type = OXY
-	nodamage = TRUE
-
-/obj/projectile/magic/resurrection/on_hit(mob/living/carbon/target)
-	. = ..()
-	if(isliving(target))
-		if(target.anti_magic_check())
-			target.visible_message("<span class='warning'>[src] vanishes on contact with [target]!</span>")
-			return BULLET_ACT_BLOCK
-		if(target.mob_biotypes & MOB_UNDEAD) //positive energy harms the undead
-			target.death(0)
-		else
-			if(target.hellbound && target.stat == DEAD)
-				return BULLET_ACT_BLOCK
-			if(target.revive(full_heal = TRUE, admin_revive = TRUE))
-				target.grab_ghost(force = TRUE) // even suicides
-				to_chat(target, "<span class='notice'>You rise with a start, you're alive!!!</span>")
-			else if(target.stat != DEAD)
-				to_chat(target, "<span class='notice'>You feel great!</span>")
-
 /obj/projectile/magic/teleport
 	name = "bolt of teleportation"
 	icon_state = "bluespace"
diff --git a/code/modules/spells/spell_types/rightandwrong.dm b/code/modules/spells/spell_types/rightandwrong.dm
index e79ffb8a491e..ed6d9a9b957d 100644
--- a/code/modules/spells/spell_types/rightandwrong.dm
+++ b/code/modules/spells/spell_types/rightandwrong.dm
@@ -49,60 +49,8 @@ GLOBAL_LIST_INIT(summoned_guns, list(
 	/obj/item/gun/energy/laser/scatter,
 	/obj/item/gun/energy/gravity_gun))
 
-//if you add anything that isn't covered by the typepaths below, add it to summon_magic_objective_types
-GLOBAL_LIST_INIT(summoned_magic, list(
-	/obj/item/book/granter/spell/fireball,
-	/obj/item/book/granter/spell/smoke,
-	/obj/item/book/granter/spell/blind,
-	/obj/item/book/granter/spell/mindswap,
-	/obj/item/book/granter/spell/forcewall,
-	/obj/item/book/granter/spell/knock,
-	/obj/item/book/granter/spell/barnyard,
-	/obj/item/book/granter/spell/charge,
-	/obj/item/book/granter/spell/summonitem,
-	/obj/item/gun/magic/wand/nothing,
-	/obj/item/gun/magic/wand/death,
-	/obj/item/gun/magic/wand/resurrection,
-	/obj/item/gun/magic/wand/polymorph,
-	/obj/item/gun/magic/wand/teleport,
-	/obj/item/gun/magic/wand/door,
-	/obj/item/gun/magic/wand/fireball,
-	/obj/item/gun/magic/staff/healing,
-	/obj/item/gun/magic/staff/door,
-	/obj/item/scrying,
-	/obj/item/voodoo,
-	/obj/item/warpwhistle,
-	/obj/item/clothing/suit/space/hardsuit/shielded/wizard,
-	/obj/item/immortality_talisman,
-	/obj/item/melee/ghost_sword))
-
-GLOBAL_LIST_INIT(summoned_special_magic, list(
-	/obj/item/gun/magic/staff/change,
-	/obj/item/gun/magic/staff/animate,
-	/obj/item/storage/belt/wands/full,
-	/obj/item/antag_spawner/contract,
-	/obj/item/gun/magic/staff/chaos,
-	/obj/item/necromantic_stone,
-	/obj/item/blood_contract))
-
-//everything above except for single use spellbooks, because they are counted separately (and are for basic bitches anyways)
-GLOBAL_LIST_INIT(summoned_magic_objectives, list(
-	/obj/item/antag_spawner/contract,
-	/obj/item/blood_contract,
-	/obj/item/clothing/suit/space/hardsuit/shielded/wizard,
-	/obj/item/gun/magic,
-	/obj/item/immortality_talisman,
-	/obj/item/melee/ghost_sword,
-	/obj/item/necromantic_stone,
-	/obj/item/scrying,
-	/obj/item/spellbook,
-	/obj/item/storage/belt/wands/full,
-	/obj/item/voodoo,
-	/obj/item/warpwhistle))
-
 // If true, it's the probability of triggering "survivor" antag.
 GLOBAL_VAR_INIT(summon_guns_triggered, FALSE)
-GLOBAL_VAR_INIT(summon_magic_triggered, FALSE)
 
 /proc/give_guns(mob/living/carbon/human/H)
 	if(H.stat == DEAD || !(H.client))
@@ -125,54 +73,19 @@ GLOBAL_VAR_INIT(summon_magic_triggered, FALSE)
 
 	to_chat(H, "<span class='warning'>\A [G] appears [in_hand ? "in your hand" : "at your feet"]!</span>")
 
-/proc/give_magic(mob/living/carbon/human/H)
-	if(H.stat == DEAD || !(H.client))
-		return
-	if(H.mind)
-		if(iswizard(H) || H.mind.has_antag_datum(/datum/antagonist/survivalist/magic))
-			return
-
-	if(prob(GLOB.summon_magic_triggered) && !(H.mind.has_antag_datum(/datum/antagonist)))
-		H.mind.add_antag_datum(/datum/antagonist/survivalist/magic)
-		H.log_message("was made into a survivalist, and trusts no one!</font>", LOG_ATTACK, color="red")
-
-	var/magic_type = pick(GLOB.summoned_magic)
-	var/lucky = FALSE
-	if(prob(SPECIALIST_MAGIC_PROB))
-		magic_type = pick(GLOB.summoned_special_magic)
-		lucky = TRUE
-
-	var/obj/item/M = new magic_type(get_turf(H))
-	playsound(get_turf(H),'sound/magic/summon_magic.ogg', 50, TRUE)
-
-	var/in_hand = H.put_in_hands(M)
-
-	to_chat(H, "<span class='warning'>\A [M] appears [in_hand ? "in your hand" : "at your feet"]!</span>")
-	if(lucky)
-		to_chat(H, "<span class='notice'>You feel incredibly lucky.</span>")
-
-
-/proc/rightandwrong(summon_type, mob/user, survivor_probability)
-	if(user) //in this case either someone holding a spellbook or a badmin
-		to_chat(user, "<span class='warning'>You summoned [summon_type]!</span>")
-		message_admins("[ADMIN_LOOKUPFLW(user)] summoned [summon_type]!")
-		log_game("[key_name(user)] summoned [summon_type]!")
+/proc/rightandwrong(mob/user, survivor_probability)
+	if(user) //in this case someone is a badmin
+		to_chat(user, "<span class='warning'>You summoned guns!</span>")
+		message_admins("[ADMIN_LOOKUPFLW(user)] summoned guns!")
+		log_game("[key_name(user)] summoned guns!")
 
-	if(summon_type == SUMMON_MAGIC)
-		GLOB.summon_magic_triggered = survivor_probability
-	else if(summon_type == SUMMON_GUNS)
-		GLOB.summon_guns_triggered = survivor_probability
-	else
-		CRASH("Bad summon_type given: [summon_type]")
+	GLOB.summon_guns_triggered = survivor_probability
 
 	for(var/mob/living/carbon/human/H in GLOB.player_list)
 		var/turf/T = get_turf(H)
 		if(T && is_away_level(T))
 			continue
-		if(summon_type == SUMMON_MAGIC)
-			give_magic(H)
-		else
-			give_guns(H)
+		give_guns(H)
 
 /proc/summonevents()
 	if(!SSevents.wizardmode)
diff --git a/code/modules/vending/autodrobe.dm b/code/modules/vending/autodrobe.dm
index b1d85fb3fcbb..6cca888295a2 100644
--- a/code/modules/vending/autodrobe.dm
+++ b/code/modules/vending/autodrobe.dm
@@ -115,7 +115,6 @@
 		/obj/item/clothing/head/powdered_wig = 1,
 		/obj/item/clothing/accessory/fan_mime_pin = 1,
 		/obj/item/clothing/accessory/fan_clown_pin = 1,
-		/obj/item/gun/magic/wand/nothing = 2,
 		/obj/item/clothing/glasses/sunglasses/garb = 2,
 		/obj/item/clothing/glasses/blindfold = 1,
 		/obj/item/clothing/mask/muzzle = 2)
diff --git a/shiptest.dme b/shiptest.dme
index 79563ae65d92..9131ace1bffd 100644
--- a/shiptest.dme
+++ b/shiptest.dme
@@ -3031,17 +3031,17 @@
 #include "code\modules\projectiles\guns\energy\special.dm"
 #include "code\modules\projectiles\guns\energy\stun.dm"
 #include "code\modules\projectiles\guns\faction\gezena\energy_gunsword.dm"
-#include "code\modules\projectiles\guns\magic\staff.dm"
-#include "code\modules\projectiles\guns\magic\wand.dm"
 #include "code\modules\projectiles\guns\misc\beam_rifle.dm"
 #include "code\modules\projectiles\guns\misc\blastcannon.dm"
 #include "code\modules\projectiles\guns\misc\bow.dm"
 #include "code\modules\projectiles\guns\misc\chem_gun.dm"
+#include "code\modules\projectiles\guns\misc\debug.dm"
 #include "code\modules\projectiles\guns\misc\grenade_launcher.dm"
 #include "code\modules\projectiles\guns\misc\medbeam.dm"
 #include "code\modules\projectiles\guns\misc\syringe_gun.dm"
 #include "code\modules\projectiles\projectile\beams.dm"
 #include "code\modules\projectiles\projectile\bullets.dm"
+#include "code\modules\projectiles\projectile\debug.dm"
 #include "code\modules\projectiles\projectile\magic.dm"
 #include "code\modules\projectiles\projectile\bullets\_incendiary.dm"
 #include "code\modules\projectiles\projectile\bullets\dart_syringe.dm"

From 6564855fbb7b63676fba1a064ff3bcefb9294aa3 Mon Sep 17 00:00:00 2001
From: FalloutFalcon <falloutfalconplays@gmail.com>
Date: Wed, 3 Apr 2024 22:03:43 -0500
Subject: [PATCH 67/89] regenerate and Atomproc call admin tools make these
 pointless

---
 code/modules/clothing/outfits/standard.dm     |   2 -
 .../projectiles/ammunition/special/magic.dm   |   7 -
 code/modules/projectiles/guns/misc/debug.dm   | 126 ------------------
 code/modules/projectiles/projectile/debug.dm  |  23 ----
 shiptest.dme                                  |   2 -
 5 files changed, 160 deletions(-)
 delete mode 100644 code/modules/projectiles/guns/misc/debug.dm
 delete mode 100644 code/modules/projectiles/projectile/debug.dm

diff --git a/code/modules/clothing/outfits/standard.dm b/code/modules/clothing/outfits/standard.dm
index d039d06dae35..100cc7ff0f52 100644
--- a/code/modules/clothing/outfits/standard.dm
+++ b/code/modules/clothing/outfits/standard.dm
@@ -226,8 +226,6 @@
 	backpack_contents = list(
 		/obj/item/melee/transforming/energy/axe=1,\
 		/obj/item/storage/part_replacer/bluespace/tier4=1,\
-		/obj/item/gun/magic/wand/resurrection/debug=1,\
-		/obj/item/gun/magic/wand/death/debug=1,\
 		/obj/item/debug/human_spawner=1,\
 		/obj/item/debug/omnitool=1
 		)
diff --git a/code/modules/projectiles/ammunition/special/magic.dm b/code/modules/projectiles/ammunition/special/magic.dm
index 5d30ba97690e..8459e5b93e9c 100644
--- a/code/modules/projectiles/ammunition/special/magic.dm
+++ b/code/modules/projectiles/ammunition/special/magic.dm
@@ -11,13 +11,6 @@
 /obj/item/ammo_casing/magic/animate
 	projectile_type = /obj/projectile/magic/animate
 
-/obj/item/ammo_casing/magic/heal
-	projectile_type = /obj/projectile/debug/resurrection
-	harmful = FALSE
-
-/obj/item/ammo_casing/magic/death
-	projectile_type = /obj/projectile/debug/death
-
 /obj/item/ammo_casing/magic/teleport
 	projectile_type = /obj/projectile/magic/teleport
 	harmful = FALSE
diff --git a/code/modules/projectiles/guns/misc/debug.dm b/code/modules/projectiles/guns/misc/debug.dm
deleted file mode 100644
index 607dbec425b5..000000000000
--- a/code/modules/projectiles/guns/misc/debug.dm
+++ /dev/null
@@ -1,126 +0,0 @@
-/obj/item/gun/magic/wand
-	name = "wand"
-	desc = "You shouldn't have this."
-	ammo_type = /obj/item/ammo_casing/magic
-	icon_state = "nothingwand"
-	item_state = "wand"
-	base_icon_state = "nothingwand"
-	w_class = WEIGHT_CLASS_SMALL
-	can_charge = FALSE
-	max_charges = 100 //100, 50, 50, 34 (max charge distribution by 25%ths)
-	var/variable_charges = TRUE
-
-/obj/item/gun/magic/wand/Initialize()
-	if(prob(75) && variable_charges) //25% chance of listed max charges, 50% chance of 1/2 max charges, 25% chance of 1/3 max charges
-		if(prob(33))
-			max_charges = CEILING(max_charges / 3, 1)
-		else
-			max_charges = CEILING(max_charges / 2, 1)
-	return ..()
-
-/obj/item/gun/magic/wand/examine(mob/user)
-	. = ..()
-	. += "Has [charges] charge\s remaining."
-
-/obj/item/gun/magic/wand/update_icon_state()
-	icon_state = "[base_icon_state][charges ? null : "-drained"]"
-	return ..()
-
-/obj/item/gun/magic/wand/attack(atom/target, mob/living/user)
-	if(target == user)
-		return
-	..()
-
-/obj/item/gun/magic/wand/afterattack(atom/target, mob/living/user)
-	var/wrested = FALSE
-	if(!charges)
-		wrested = shoot_with_empty_chamber(user)
-		if(!wrested)
-			return
-	if(target == user)
-		if(no_den_usage)
-			var/area/A = get_area(user)
-			if(istype(A, /area/wizard_station))
-				to_chat(user, "<span class='warning'>You know better than to violate the security of The Den, best wait until you leave to use [src].</span>")
-				return
-			else
-				no_den_usage = 0
-		zap_self(user)
-	else
-		. = ..()
-	if(wrested)
-		to_chat(user,"<span class='danger'>[src] overloads and disintegrates.</span>")
-		qdel(src)
-		return
-	update_appearance()
-
-/obj/item/gun/magic/wand/proc/zap_self(mob/living/user)
-	user.visible_message("<span class='danger'>[user] zaps [user.p_them()]self with [src].</span>")
-	playsound(user, fire_sound, 50, TRUE)
-	user.log_message("zapped [user.p_them()]self with a <b>[src]</b>", LOG_ATTACK)
-
-/obj/item/gun/magic/wand/death
-	name = "wand of death"
-	desc = "This deadly wand overwhelms the victim's body with pure energy, slaying them without fail."
-	fire_sound = 'sound/magic/wandodeath.ogg'
-	ammo_type = /obj/item/ammo_casing/magic/death
-	icon_state = "deathwand"
-	base_icon_state = "deathwand"
-	max_charges = 3 //3, 2, 2, 1
-
-/obj/item/gun/magic/wand/death/zap_self(mob/living/user)
-	..()
-	charges--
-	if(user.anti_magic_check())
-		user.visible_message("<span class='warning'>[src] has no effect on [user]!</span>")
-		return
-	if(isliving(user))
-		var/mob/living/L = user
-		if(L.mob_biotypes & MOB_UNDEAD) //negative energy heals the undead
-			user.revive(full_heal = TRUE, admin_revive = TRUE)
-			to_chat(user, "<span class='notice'>You feel great!</span>")
-			return
-	to_chat(user, "<span class='warning'>You irradiate yourself with pure negative energy! \
-	[pick("Do not pass go. Do not collect 200 zorkmids.","You feel more confident in your spell casting skills.","You Die...","Do you want your possessions identified?")]\
-	</span>")
-	user.death(FALSE)
-
-/obj/item/gun/magic/wand/death/debug
-	desc = "In some obscure circles, this is known as the 'cloning tester's friend'."
-	max_charges = 500
-	variable_charges = FALSE
-	can_charge = TRUE
-	recharge_rate = 1
-
-/obj/item/gun/magic/wand/resurrection
-	name = "wand of healing"
-	desc = "This wand uses healing magics to heal and revive. They are rarely utilized within the Wizard Federation for some reason."
-	ammo_type = /obj/item/ammo_casing/magic/heal
-	fire_sound = 'sound/magic/staff_healing.ogg'
-	icon_state = "revivewand"
-	base_icon_state = "revivewand"
-	max_charges = 10 //10, 5, 5, 4
-
-/obj/item/gun/magic/wand/resurrection/zap_self(mob/living/user)
-	..()
-	charges--
-	if(user.anti_magic_check())
-		user.visible_message("<span class='warning'>[src] has no effect on [user]!</span>")
-		return
-	if(isliving(user))
-		var/mob/living/L = user
-		if(L.mob_biotypes & MOB_UNDEAD) //positive energy harms the undead
-			to_chat(user, "<span class='warning'>You irradiate yourself with pure positive energy! \
-			[pick("Do not pass go. Do not collect 200 zorkmids.","You feel more confident in your spell casting skills.","You Die...","Do you want your possessions identified?")]\
-			</span>")
-			user.death(0)
-			return
-	user.revive(full_heal = TRUE, admin_revive = TRUE)
-	to_chat(user, "<span class='notice'>You feel great!</span>")
-
-/obj/item/gun/magic/wand/resurrection/debug //for testing
-	desc = "Is it possible for something to be even more powerful than regular magic? This wand is."
-	max_charges = 500
-	variable_charges = FALSE
-	can_charge = TRUE
-	recharge_rate = 1
diff --git a/code/modules/projectiles/projectile/debug.dm b/code/modules/projectiles/projectile/debug.dm
deleted file mode 100644
index 06b1ea7ca3e1..000000000000
--- a/code/modules/projectiles/projectile/debug.dm
+++ /dev/null
@@ -1,23 +0,0 @@
-/obj/projectile/debug/death
-	name = "bolt of death"
-	icon_state = "pulse1_bl"
-
-/obj/projectile/debug/death/on_hit(target)
-	. = ..()
-	if(ismob(target))
-		var/mob/M = target
-		M.death(0)
-
-/obj/projectile/debug/resurrection
-	name = "bolt of resurrection"
-	icon_state = "ion"
-	nodamage = TRUE
-
-/obj/projectile/debug/resurrection/on_hit(mob/living/carbon/target)
-	. = ..()
-	if(isliving(target))
-		if(target.revive(full_heal = TRUE, admin_revive = TRUE))
-			target.grab_ghost(force = TRUE) // even suicides
-			to_chat(target, "<span class='notice'>You rise with a start, you're alive!!!</span>")
-		else if(target.stat != DEAD)
-			to_chat(target, "<span class='notice'>You feel great!</span>")
diff --git a/shiptest.dme b/shiptest.dme
index 9131ace1bffd..59fc9bc5997a 100644
--- a/shiptest.dme
+++ b/shiptest.dme
@@ -3035,13 +3035,11 @@
 #include "code\modules\projectiles\guns\misc\blastcannon.dm"
 #include "code\modules\projectiles\guns\misc\bow.dm"
 #include "code\modules\projectiles\guns\misc\chem_gun.dm"
-#include "code\modules\projectiles\guns\misc\debug.dm"
 #include "code\modules\projectiles\guns\misc\grenade_launcher.dm"
 #include "code\modules\projectiles\guns\misc\medbeam.dm"
 #include "code\modules\projectiles\guns\misc\syringe_gun.dm"
 #include "code\modules\projectiles\projectile\beams.dm"
 #include "code\modules\projectiles\projectile\bullets.dm"
-#include "code\modules\projectiles\projectile\debug.dm"
 #include "code\modules\projectiles\projectile\magic.dm"
 #include "code\modules\projectiles\projectile\bullets\_incendiary.dm"
 #include "code\modules\projectiles\projectile\bullets\dart_syringe.dm"

From 32ad922cfdd81fa93c8036936f897c604d975f52 Mon Sep 17 00:00:00 2001
From: FalloutFalcon <falloutfalconplays@gmail.com>
Date: Wed, 3 Apr 2024 22:11:43 -0500
Subject: [PATCH 68/89] how did i readd this

---
 .../syndicate/syndicate_luxembourg.dmm        | 3314 -----------------
 1 file changed, 3314 deletions(-)
 delete mode 100644 _maps/shuttles/syndicate/syndicate_luxembourg.dmm

diff --git a/_maps/shuttles/syndicate/syndicate_luxembourg.dmm b/_maps/shuttles/syndicate/syndicate_luxembourg.dmm
deleted file mode 100644
index cff4c84386e0..000000000000
--- a/_maps/shuttles/syndicate/syndicate_luxembourg.dmm
+++ /dev/null
@@ -1,3314 +0,0 @@
-//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE
-"aB" = (
-/turf/open/floor/plasteel/dark,
-/area/ship/hallway/central)
-"aD" = (
-/obj/structure/cable{
-	icon_state = "1-2"
-	},
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer2,
-/obj/machinery/atmospherics/pipe/manifold/supply/hidden/layer4{
-	dir = 4
-	},
-/turf/open/floor/carpet/red_gold,
-/area/ship/crew/dorm)
-"aK" = (
-/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer4{
-	dir = 9
-	},
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer2{
-	dir = 9
-	},
-/obj/effect/decal/cleanable/dirt,
-/obj/item/radio/intercom/directional/south,
-/obj/machinery/navbeacon/wayfinding{
-	codes_txt = "patrol;next_patrol=lux_engine";
-	location = "lux_crew"
-	},
-/turf/open/floor/plasteel/dark,
-/area/ship/crew/dorm)
-"bi" = (
-/obj/machinery/button/door{
-	id = "syndiefuck";
-	name = "Loading Shutters Control";
-	pixel_x = -25;
-	pixel_y = -7;
-	dir = 4
-	},
-/obj/machinery/button/door{
-	id = "warehouse";
-	name = "Warehouse Control";
-	pixel_x = -25;
-	pixel_y = 5;
-	dir = 4
-	},
-/obj/machinery/button/door{
-	id = "cargodoors";
-	name = "Cargo Bay Shutter Control";
-	pixel_x = -35;
-	pixel_y = 5;
-	dir = 4
-	},
-/obj/machinery/button/door{
-	id = "externalshutters";
-	name = "External Shutters Control";
-	pixel_x = -35;
-	pixel_y = -7;
-	dir = 4
-	},
-/obj/machinery/computer/cargo/express{
-	dir = 4
-	},
-/turf/open/floor/plasteel/mono/dark,
-/area/ship/hallway/central)
-"bp" = (
-/obj/effect/turf_decal/siding/blue/corner{
-	dir = 8
-	},
-/obj/effect/turf_decal/corner/opaque/blue/half{
-	dir = 1
-	},
-/turf/open/floor/plasteel/dark,
-/area/ship/hallway/central)
-"bt" = (
-/obj/structure/cable{
-	icon_state = "1-8"
-	},
-/obj/effect/decal/cleanable/dirt,
-/obj/machinery/atmospherics/components/binary/volume_pump{
-	dir = 8
-	},
-/obj/structure/catwalk/over/plated_catwalk/white,
-/turf/open/floor/plating,
-/area/ship/engineering)
-"bB" = (
-/obj/structure/rack,
-/obj/machinery/light/directional/north,
-/obj/effect/turf_decal/corner/opaque/brown/border{
-	dir = 9
-	},
-/obj/item/gps/mining,
-/obj/item/paicard,
-/turf/open/floor/plasteel/mono/dark,
-/area/ship/cargo)
-"bN" = (
-/obj/structure/cable{
-	icon_state = "4-8"
-	},
-/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer4,
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer2,
-/turf/open/floor/plasteel/dark,
-/area/ship/crew/dorm)
-"bV" = (
-/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer4{
-	dir = 4
-	},
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer2{
-	dir = 4
-	},
-/obj/structure/displaycase,
-/obj/effect/turf_decal/corner/opaque/neutral/mono,
-/turf/open/floor/plasteel/mono/dark,
-/area/ship/hallway/central)
-"cb" = (
-/obj/structure/cable{
-	icon_state = "1-2"
-	},
-/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer4,
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer2,
-/turf/open/floor/carpet/red_gold,
-/area/ship/crew/dorm)
-"cq" = (
-/obj/machinery/power/apc/auto_name/directional/east,
-/obj/structure/cable{
-	icon_state = "0-8"
-	},
-/obj/machinery/computer/mech_bay_power_console{
-	dir = 8
-	},
-/turf/open/floor/plasteel/mono/dark,
-/area/ship/storage)
-"cs" = (
-/obj/effect/turf_decal/siding/blue{
-	dir = 8
-	},
-/obj/effect/turf_decal/siding/blue/corner,
-/turf/open/floor/plasteel/dark,
-/area/ship/hallway/central)
-"cB" = (
-/obj/item/toy/figure/cargotech,
-/obj/item/clothing/suit/hooded/wintercoat/cargo,
-/obj/item/stack/sheet/cardboard/fifty,
-/obj/item/hand_labeler,
-/obj/item/hand_labeler_refill,
-/obj/item/clothing/under/syndicate/donk,
-/obj/item/clothing/suit/hazardvest/donk,
-/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{
-	dir = 8
-	},
-/obj/item/stack/wrapping_paper,
-/obj/item/stack/packageWrap,
-/obj/structure/closet/wall{
-	dir = 8;
-	icon_door = "orange_wall";
-	name = "employee closet";
-	pixel_x = 28
-	},
-/turf/open/floor/plasteel/mono/dark,
-/area/ship/engineering)
-"cI" = (
-/obj/structure/rack,
-/obj/item/rack_parts,
-/obj/item/rack_parts,
-/obj/item/rack_parts,
-/obj/item/rack_parts,
-/obj/item/rack_parts,
-/obj/item/rack_parts,
-/obj/item/rack_parts,
-/obj/item/rack_parts,
-/obj/item/rack_parts,
-/obj/item/rack_parts,
-/obj/item/rack_parts,
-/obj/item/rack_parts,
-/obj/item/rack_parts,
-/obj/item/rack_parts,
-/obj/item/rack_parts,
-/obj/item/rack_parts,
-/obj/effect/turf_decal/corner/opaque/neutral/mono,
-/turf/open/floor/plasteel/mono/dark,
-/area/ship/hallway/central)
-"dp" = (
-/obj/structure/displaycase,
-/obj/effect/turf_decal/corner/opaque/neutral/mono,
-/turf/open/floor/plasteel/mono/dark,
-/area/ship/hallway/central)
-"dA" = (
-/obj/structure/chair/comfy/shuttle{
-	dir = 1
-	},
-/turf/open/floor/carpet/red_gold,
-/area/ship/hallway/central)
-"dC" = (
-/obj/machinery/atmospherics/pipe/layer_manifold{
-	dir = 4
-	},
-/obj/machinery/space_heater,
-/obj/item/radio/intercom/directional/north,
-/turf/open/floor/plasteel/tech/techmaint,
-/area/ship/engineering)
-"dH" = (
-/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer4{
-	dir = 8
-	},
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer2{
-	dir = 4
-	},
-/obj/structure/displaycase,
-/obj/effect/turf_decal/corner/opaque/neutral/mono,
-/turf/open/floor/plasteel/mono/dark,
-/area/ship/hallway/central)
-"dL" = (
-/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer4,
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer2,
-/obj/machinery/door/firedoor/border_only{
-	dir = 1
-	},
-/obj/machinery/door/firedoor/border_only,
-/obj/machinery/door/airlock/engineering{
-	name = "Engineering"
-	},
-/turf/open/floor/plasteel/tech/techmaint,
-/area/ship/engineering)
-"dM" = (
-/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer4,
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer2{
-	dir = 5
-	},
-/obj/effect/decal/cleanable/dirt,
-/turf/open/floor/plasteel/tech/techmaint,
-/area/ship/engineering)
-"eD" = (
-/obj/item/storage/belt/utility,
-/obj/item/storage/belt/utility,
-/obj/structure/table,
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer2{
-	dir = 10
-	},
-/obj/item/storage/toolbox/syndicate,
-/obj/item/storage/toolbox/syndicate,
-/turf/open/floor/plasteel/tech/techmaint,
-/area/ship/engineering)
-"eF" = (
-/obj/structure/sink{
-	dir = 8;
-	pixel_x = 12
-	},
-/obj/structure/mirror{
-	pixel_x = 24
-	},
-/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{
-	dir = 8
-	},
-/obj/item/storage/firstaid/regular,
-/obj/item/storage/firstaid/medical{
-	pixel_x = -5;
-	pixel_y = -4
-	},
-/obj/structure/closet/wall/white/med{
-	dir = 1;
-	name = "medicine locker";
-	pixel_y = -28
-	},
-/turf/open/floor/plasteel/patterned,
-/area/ship/crew/dorm)
-"eL" = (
-/obj/structure/cable{
-	icon_state = "1-2"
-	},
-/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer4,
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer2,
-/obj/machinery/door/firedoor/border_only,
-/obj/machinery/door/firedoor/border_only{
-	dir = 1
-	},
-/obj/structure/catwalk/over/plated_catwalk/white,
-/obj/machinery/door/airlock/engineering{
-	name = "Engineering"
-	},
-/turf/open/floor/plasteel/tech/techmaint,
-/area/ship/engineering)
-"eX" = (
-/obj/effect/turf_decal/siding/blue{
-	dir = 8
-	},
-/obj/effect/turf_decal/siding/blue{
-	dir = 4
-	},
-/turf/open/floor/plasteel/dark,
-/area/ship/hallway/central)
-"fn" = (
-/obj/machinery/light/directional/east,
-/obj/structure/table,
-/obj/machinery/microwave,
-/turf/open/floor/plasteel/mono/dark,
-/area/ship/crew/canteen)
-"fo" = (
-/obj/item/card/emag,
-/obj/item/tank/internals/emergency_oxygen/double,
-/obj/item/storage/backpack/duffelbag/syndie{
-	name = "manager's duffel bag"
-	},
-/obj/item/clothing/under/syndicate/donk/qm,
-/obj/item/clothing/suit/hazardvest/donk/qm,
-/obj/item/melee/classic_baton/telescopic,
-/obj/item/radio/headset/syndicate/alt/leader,
-/obj/item/spacecash/bundle/c1000,
-/obj/item/spacecash/bundle/c1000,
-/obj/item/spacecash/bundle/c1000,
-/obj/item/spacecash/bundle/c1000,
-/obj/item/spacecash/bundle/c1000,
-/obj/item/spacecash/bundle/c1000,
-/obj/structure/closet/secure_closet/wall{
-	dir = 4;
-	icon_state = "solgov_wall";
-	name = "manager's locker";
-	pixel_x = -28;
-	req_access_txt = "41"
-	},
-/obj/machinery/light_switch{
-	pixel_y = 22
-	},
-/turf/open/floor/plasteel/mono/dark,
-/area/ship/engineering)
-"fv" = (
-/obj/machinery/selling_pad,
-/obj/effect/turf_decal/box,
-/turf/open/floor/plasteel/mono/dark,
-/area/ship/hallway/central)
-"fy" = (
-/obj/structure/cable{
-	icon_state = "1-2"
-	},
-/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer4,
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer2,
-/obj/effect/turf_decal/trimline/opaque/brown/filled/warning,
-/obj/structure/cable{
-	icon_state = "2-8"
-	},
-/turf/open/floor/plasteel/mono/dark,
-/area/ship/cargo)
-"fB" = (
-/obj/effect/decal/cleanable/oil,
-/obj/effect/turf_decal/corner/opaque/brown/border{
-	dir = 8
-	},
-/turf/open/floor/plasteel/mono/dark,
-/area/ship/cargo)
-"ga" = (
-/obj/structure/table/reinforced,
-/obj/machinery/door/window{
-	dir = 4
-	},
-/obj/machinery/door/firedoor,
-/obj/machinery/door/poddoor/shutters{
-	dir = 4;
-	id = "cargodoors"
-	},
-/obj/item/radio/intercom/directional/north{
-	pixel_y = 22
-	},
-/turf/open/floor/plasteel/dark,
-/area/ship/cargo)
-"gf" = (
-/obj/machinery/atmospherics/pipe/manifold/supply/hidden/layer4{
-	dir = 8
-	},
-/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer2{
-	dir = 4
-	},
-/obj/structure/cable{
-	icon_state = "1-2"
-	},
-/turf/open/floor/plasteel/mono/dark,
-/area/ship/cargo)
-"gj" = (
-/obj/machinery/light/directional/north,
-/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer4{
-	dir = 4
-	},
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer2{
-	dir = 6
-	},
-/obj/structure/closet/secure_closet/engineering_welding,
-/turf/open/floor/plasteel/tech/techmaint,
-/area/ship/engineering)
-"gC" = (
-/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer4,
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer2,
-/obj/effect/turf_decal/siding/blue{
-	dir = 8
-	},
-/obj/effect/turf_decal/siding/blue{
-	dir = 4
-	},
-/turf/open/floor/plasteel/dark,
-/area/ship/hallway/central)
-"hd" = (
-/obj/machinery/atmospherics/components/unary/outlet_injector/on{
-	dir = 1
-	},
-/turf/open/floor/plating,
-/area/ship/engineering)
-"hi" = (
-/turf/open/floor/plasteel/mono/dark,
-/area/ship/cargo)
-"hm" = (
-/obj/structure/cable{
-	icon_state = "1-2"
-	},
-/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer4,
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer2,
-/obj/effect/decal/cleanable/dirt,
-/turf/open/floor/plasteel/patterned/cargo_one,
-/area/ship/storage)
-"hs" = (
-/turf/closed/wall/mineral/plastitanium/nodiagonal,
-/area/ship/cargo)
-"hu" = (
-/obj/effect/decal/cleanable/dirt,
-/obj/machinery/firealarm/directional/east,
-/obj/effect/turf_decal/corner/opaque/brown/border{
-	dir = 4
-	},
-/obj/machinery/suit_storage_unit/inherit/industrial,
-/obj/item/clothing/suit/space/syndicate,
-/obj/item/clothing/head/helmet/space/syndicate,
-/obj/item/clothing/mask/breath,
-/turf/open/floor/plasteel/mono/dark,
-/area/ship/cargo)
-"hX" = (
-/obj/effect/decal/cleanable/dirt,
-/obj/effect/turf_decal/corner/opaque/brown/border{
-	dir = 8
-	},
-/turf/open/floor/plasteel/mono/dark,
-/area/ship/cargo)
-"if" = (
-/obj/machinery/cryopod{
-	dir = 4
-	},
-/obj/machinery/computer/cryopod/directional/south,
-/obj/machinery/light/small/directional/west,
-/turf/open/floor/plasteel/tech/techmaint,
-/area/ship/crew/dorm)
-"it" = (
-/obj/effect/decal/cleanable/dirt,
-/obj/machinery/power/shieldwallgen/atmos{
-	anchored = 1;
-	dir = 1;
-	id = "luxembourg_cargo";
-	locked = 1
-	},
-/obj/structure/cable{
-	icon_state = "0-4"
-	},
-/obj/machinery/door/poddoor/shutters{
-	dir = 4;
-	id = "syndiefuck"
-	},
-/turf/open/floor/plasteel/mono/dark,
-/area/ship/cargo)
-"iF" = (
-/obj/structure/cable{
-	icon_state = "1-4"
-	},
-/obj/effect/decal/cleanable/dirt,
-/obj/structure/closet/crate,
-/obj/item/vending_refill/engineering,
-/obj/item/vending_refill/engineering,
-/obj/item/vending_refill/engivend,
-/obj/item/vending_refill/engivend,
-/obj/item/vending_refill/hydronutrients,
-/obj/item/vending_refill/hydronutrients,
-/obj/item/vending_refill/boozeomat,
-/obj/item/vending_refill/boozeomat,
-/obj/item/vending_refill/medical,
-/obj/item/vending_refill/medical,
-/obj/item/vending_refill/cigarette,
-/obj/item/vending_refill/cigarette,
-/obj/item/vending_refill/snack,
-/obj/item/vending_refill/snack,
-/obj/item/vending_refill/sovietsoda,
-/obj/item/vending_refill/cola,
-/obj/item/vending_refill/cola,
-/turf/open/floor/plasteel/mono/dark,
-/area/ship/storage)
-"iO" = (
-/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer4{
-	dir = 10
-	},
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer2{
-	dir = 10
-	},
-/turf/open/floor/plasteel/patterned/cargo_one,
-/area/ship/storage)
-"iR" = (
-/obj/machinery/power/shuttle/engine/fueled/plasma{
-	dir = 1
-	},
-/obj/machinery/atmospherics/pipe/layer_manifold,
-/turf/open/floor/plating,
-/area/ship/engineering)
-"iZ" = (
-/obj/structure/cable{
-	icon_state = "1-2"
-	},
-/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer4{
-	dir = 9
-	},
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer2{
-	dir = 9
-	},
-/obj/structure/catwalk/over/plated_catwalk/white,
-/obj/machinery/atmospherics/components/unary/portables_connector{
-	dir = 4
-	},
-/turf/open/floor/plating,
-/area/ship/engineering)
-"jr" = (
-/turf/open/floor/carpet/red_gold,
-/area/ship/hallway/central)
-"jv" = (
-/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{
-	dir = 4
-	},
-/obj/structure/rack,
-/obj/effect/turf_decal/corner/opaque/neutral/mono,
-/turf/open/floor/plasteel/mono/dark,
-/area/ship/hallway/central)
-"jH" = (
-/obj/structure/table,
-/obj/item/radio/intercom/wideband/table{
-	dir = 4
-	},
-/obj/machinery/light_switch{
-	pixel_y = 22
-	},
-/turf/open/floor/plasteel/mono/dark,
-/area/ship/hallway/central)
-"jK" = (
-/obj/machinery/air_sensor/atmos/air_tank,
-/turf/open/floor/engine/air,
-/area/ship/engineering)
-"ke" = (
-/obj/machinery/mech_bay_recharge_port{
-	dir = 1
-	},
-/obj/effect/decal/cleanable/dirt,
-/turf/open/floor/plasteel/mono/dark,
-/area/ship/storage)
-"ks" = (
-/obj/structure/closet/crate,
-/obj/item/gun_voucher,
-/obj/item/gun_voucher,
-/obj/item/gun_voucher,
-/obj/item/gun_voucher,
-/obj/item/gun_voucher,
-/obj/item/gun_voucher,
-/obj/item/gun_voucher,
-/obj/item/gun_voucher,
-/obj/item/gun_voucher,
-/obj/item/gun_voucher,
-/turf/open/floor/plasteel/mono/dark,
-/area/ship/storage)
-"kE" = (
-/obj/machinery/chem_master/condimaster,
-/turf/open/floor/plasteel/mono/dark,
-/area/ship/crew/canteen)
-"kI" = (
-/obj/structure/cable{
-	icon_state = "1-2"
-	},
-/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer4{
-	dir = 5
-	},
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer2{
-	dir = 5
-	},
-/turf/open/floor/plasteel/patterned/cargo_one,
-/area/ship/storage)
-"kZ" = (
-/obj/effect/spawner/structure/window/plasma/reinforced/plastitanium,
-/obj/machinery/door/poddoor/shutters{
-	dir = 4;
-	id = "externalshutters"
-	},
-/turf/open/floor/plating,
-/area/ship/hallway/central)
-"lb" = (
-/obj/structure/cable{
-	icon_state = "1-8"
-	},
-/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer4{
-	dir = 4
-	},
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer2{
-	dir = 8
-	},
-/obj/machinery/portable_atmospherics/scrubber,
-/turf/open/floor/plasteel/tech/techmaint,
-/area/ship/engineering)
-"lg" = (
-/obj/structure/cable{
-	icon_state = "1-2"
-	},
-/obj/structure/cable{
-	icon_state = "2-4"
-	},
-/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer4,
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer2,
-/turf/open/floor/plasteel/patterned/cargo_one,
-/area/ship/storage)
-"lt" = (
-/obj/machinery/atmospherics/components/binary/volume_pump,
-/obj/structure/catwalk/over/plated_catwalk/white,
-/turf/open/floor/plating,
-/area/ship/engineering)
-"lK" = (
-/obj/effect/turf_decal/siding/blue/corner{
-	dir = 8
-	},
-/obj/effect/turf_decal/siding/blue/corner{
-	dir = 1
-	},
-/turf/open/floor/plasteel/dark,
-/area/ship/hallway/central)
-"lQ" = (
-/obj/structure/cable{
-	icon_state = "1-2"
-	},
-/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer4,
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer2,
-/obj/machinery/door/firedoor/border_only,
-/obj/machinery/door/firedoor/border_only{
-	dir = 1
-	},
-/obj/machinery/door/poddoor/shutters{
-	id = "warehouse"
-	},
-/turf/open/floor/plasteel/tech/techmaint,
-/area/ship/storage)
-"lW" = (
-/obj/structure/cable{
-	icon_state = "4-8"
-	},
-/obj/machinery/atmospherics/pipe/manifold/orange/visible{
-	dir = 1
-	},
-/obj/structure/catwalk/over/plated_catwalk/white,
-/turf/open/floor/plating,
-/area/ship/engineering)
-"mi" = (
-/obj/effect/spawner/structure/window/plasma/reinforced/plastitanium,
-/obj/machinery/door/poddoor/shutters{
-	dir = 4;
-	id = "externalshutters"
-	},
-/turf/open/floor/plating,
-/area/ship/crew/dorm)
-"mm" = (
-/obj/item/toy/figure/cargotech,
-/obj/item/clothing/suit/hooded/wintercoat/cargo,
-/obj/item/stack/sheet/cardboard/fifty,
-/obj/item/hand_labeler,
-/obj/item/hand_labeler_refill,
-/obj/item/clothing/under/syndicate/donk,
-/obj/item/clothing/suit/hazardvest/donk,
-/obj/item/stack/wrapping_paper,
-/obj/item/stack/packageWrap,
-/obj/structure/railing,
-/obj/structure/closet/wall{
-	dir = 4;
-	icon_door = "orange_wall";
-	name = "employee closet";
-	pixel_x = -28
-	},
-/turf/open/floor/plasteel/mono/dark,
-/area/ship/engineering)
-"mE" = (
-/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer4,
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer2,
-/obj/structure/catwalk/over/plated_catwalk/dark,
-/obj/effect/turf_decal/kfp_small/left{
-	dir = 4
-	},
-/turf/open/floor/plating,
-/area/ship/engineering)
-"mK" = (
-/obj/machinery/light/directional/south,
-/obj/machinery/computer/atmos_control/tank/air_tank{
-	dir = 4
-	},
-/obj/machinery/airalarm/directional/west,
-/turf/open/floor/plasteel/tech/techmaint,
-/area/ship/engineering)
-"na" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer2,
-/turf/closed/wall/mineral/plastitanium/nodiagonal,
-/area/ship/engineering)
-"nz" = (
-/obj/structure/sign/donk{
-	pixel_x = -32
-	},
-/obj/structure/rack,
-/obj/item/radio/headset,
-/obj/item/radio/headset,
-/obj/item/radio/headset,
-/obj/item/radio/headset,
-/obj/item/radio/headset,
-/obj/item/radio/headset,
-/turf/open/floor/plasteel/dark,
-/area/ship/crew/dorm)
-"ow" = (
-/obj/effect/spawner/structure/window/plasma/reinforced/plastitanium,
-/obj/machinery/door/poddoor/shutters{
-	id = "externalshutters"
-	},
-/turf/open/floor/plating,
-/area/ship/crew/canteen)
-"pd" = (
-/obj/machinery/light/directional/east,
-/obj/structure/closet/crate/large{
-	name = "Donk! Co. Powerloader In a Box"
-	},
-/obj/effect/decal/cleanable/oil,
-/obj/effect/turf_decal/rechargefloor,
-/obj/mecha/working/ripley/cargo{
-	name = "\improper Donk! Co. Cargo Loading Device"
-	},
-/turf/open/floor/plasteel/mono/dark,
-/area/ship/storage)
-"pt" = (
-/turf/closed/wall/mineral/plastitanium,
-/area/ship/engineering)
-"pJ" = (
-/obj/machinery/firealarm/directional/south,
-/obj/machinery/autolathe,
-/turf/open/floor/plasteel/tech/techmaint,
-/area/ship/engineering)
-"pL" = (
-/obj/effect/turf_decal/siding/blue{
-	dir = 1
-	},
-/obj/effect/turf_decal/siding/blue/corner{
-	dir = 8
-	},
-/turf/open/floor/plasteel/dark,
-/area/ship/hallway/central)
-"pR" = (
-/obj/machinery/power/smes/engineering,
-/obj/structure/cable{
-	icon_state = "0-2"
-	},
-/obj/machinery/door/firedoor/border_only,
-/obj/machinery/door/firedoor/border_only{
-	dir = 1
-	},
-/turf/open/floor/plating,
-/area/ship/engineering)
-"qe" = (
-/obj/effect/turf_decal/atmos/air,
-/turf/open/floor/engine/air,
-/area/ship/engineering)
-"qf" = (
-/obj/structure/table,
-/obj/machinery/door/firedoor,
-/obj/item/radio/intercom/directional/north,
-/turf/open/floor/plasteel/mono/dark,
-/area/ship/crew/canteen)
-"qh" = (
-/obj/machinery/airalarm/directional/west,
-/obj/item/stack/sheet/cardboard/fifty,
-/obj/item/hand_labeler,
-/obj/effect/turf_decal/corner/opaque/brown/border{
-	dir = 8
-	},
-/obj/machinery/navbeacon/wayfinding{
-	codes_txt = "patrol;next_patrol=lux_shopfloor";
-	location = "lux_lobby"
-	},
-/turf/open/floor/plasteel/mono/dark,
-/area/ship/cargo)
-"ql" = (
-/obj/structure/cable{
-	icon_state = "4-8"
-	},
-/obj/machinery/atmospherics/pipe/simple/orange/visible{
-	dir = 4
-	},
-/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{
-	dir = 4
-	},
-/obj/structure/catwalk/over/plated_catwalk,
-/turf/open/floor/plating,
-/area/ship/engineering)
-"qO" = (
-/obj/structure/cable{
-	icon_state = "2-4"
-	},
-/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer4{
-	dir = 8
-	},
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer2{
-	dir = 4
-	},
-/obj/structure/chair/plastic{
-	dir = 4
-	},
-/obj/effect/turf_decal/siding/red{
-	dir = 8
-	},
-/obj/effect/turf_decal/corner/opaque/neutral/border{
-	dir = 4
-	},
-/turf/open/floor/plasteel/mono/dark,
-/area/ship/hallway/central)
-"qP" = (
-/obj/machinery/door/airlock/external,
-/obj/effect/mapping_helpers/airlock/cyclelink_helper{
-	dir = 1
-	},
-/obj/machinery/atmospherics/pipe/simple/orange/visible{
-	dir = 5
-	},
-/turf/open/floor/plating,
-/area/ship/engineering)
-"qR" = (
-/turf/open/floor/engine/air,
-/area/ship/engineering)
-"qV" = (
-/obj/item/toy/sword,
-/obj/structure/closet/crate/wooden/toy,
-/obj/item/ammo_box/magazine/toy/smgm45/riot,
-/obj/item/ammo_box/magazine/toy/smgm45/riot,
-/obj/item/gun/ballistic/automatic/smg/c20r/toy/riot,
-/obj/item/soap/syndie,
-/obj/item/soap/syndie,
-/obj/item/soap/syndie,
-/obj/item/soap/syndie,
-/obj/item/soap/syndie,
-/obj/item/soap/syndie,
-/obj/item/soap/syndie,
-/obj/item/soap/syndie,
-/turf/open/floor/plasteel/mono/dark,
-/area/ship/storage)
-"rh" = (
-/obj/effect/turf_decal/siding/blue/corner{
-	dir = 8
-	},
-/obj/effect/turf_decal/siding/blue/corner,
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer2,
-/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer4,
-/obj/effect/turf_decal/trimline/opaque/blue/filled/warning{
-	dir = 1
-	},
-/turf/open/floor/plasteel/dark,
-/area/ship/hallway/central)
-"rm" = (
-/obj/structure/cable{
-	icon_state = "1-2"
-	},
-/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer4{
-	dir = 9
-	},
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer2{
-	dir = 9
-	},
-/obj/effect/decal/cleanable/dirt,
-/turf/open/floor/carpet/red_gold,
-/area/ship/crew/dorm)
-"rq" = (
-/obj/machinery/door/firedoor/border_only{
-	dir = 4
-	},
-/obj/machinery/door/firedoor/border_only{
-	dir = 8
-	},
-/obj/machinery/door/window{
-	dir = 8;
-	name = "Canteen"
-	},
-/obj/effect/turf_decal/siding/red,
-/turf/open/floor/plasteel/mono/dark,
-/area/ship/crew/canteen)
-"rG" = (
-/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4,
-/obj/effect/turf_decal/corner/opaque/neutral/mono,
-/turf/open/floor/plasteel/mono/dark,
-/area/ship/crew/canteen)
-"rU" = (
-/obj/structure/cable{
-	icon_state = "1-2"
-	},
-/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer4,
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer2,
-/obj/effect/turf_decal/trimline/opaque/orange/filled/warning,
-/turf/open/floor/plasteel/patterned/cargo_one,
-/area/ship/storage)
-"rV" = (
-/obj/machinery/atmospherics/components/unary/vent_pump/high_volume/siphon/atmos/air_output{
-	dir = 4
-	},
-/obj/structure/window/plasma/reinforced/spawner/east,
-/turf/open/floor/engine/air,
-/area/ship/engineering)
-"sh" = (
-/obj/machinery/power/shuttle/engine/fueled/plasma{
-	dir = 1
-	},
-/turf/open/floor/plating,
-/area/ship/engineering)
-"sk" = (
-/obj/effect/turf_decal/atmos/plasma,
-/turf/open/floor/engine/plasma,
-/area/ship/engineering)
-"sF" = (
-/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{
-	dir = 8
-	},
-/obj/effect/turf_decal/corner/opaque/neutral/mono,
-/turf/open/floor/plasteel/mono/dark,
-/area/ship/crew/canteen)
-"sI" = (
-/obj/structure/cable{
-	icon_state = "1-2"
-	},
-/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer2{
-	dir = 8
-	},
-/obj/effect/decal/cleanable/dirt,
-/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer4{
-	dir = 6
-	},
-/obj/effect/turf_decal/industrial/traffic{
-	dir = 8
-	},
-/turf/open/floor/plasteel/dark,
-/area/ship/crew/dorm)
-"sV" = (
-/mob/living/simple_animal/bot/mulebot{
-	bot_name = "\proper Christine";
-	desc = "A Multiple Utility Load Effector bot. This one seems oddly menacing...";
-	id = "Christine";
-	name = "\proper Christine"
-	},
-/obj/effect/turf_decal/corner/opaque/brown/bordercee,
-/obj/machinery/navbeacon/wayfinding{
-	codes_txt = null;
-	location = "mulestation"
-	},
-/turf/open/floor/plasteel/mono/dark,
-/area/ship/cargo)
-"tx" = (
-/obj/machinery/power/port_gen/pacman,
-/obj/structure/cable/yellow{
-	icon_state = "0-4"
-	},
-/obj/item/stack/sheet/mineral/plasma/five,
-/turf/open/floor/plasteel/mono/dark,
-/area/ship/engineering)
-"tF" = (
-/obj/structure/bed/pod,
-/obj/item/bedsheet/blue,
-/obj/structure/curtain/bounty,
-/turf/open/floor/plasteel/dark,
-/area/ship/crew/dorm)
-"tH" = (
-/obj/structure/cable{
-	icon_state = "1-2"
-	},
-/obj/effect/turf_decal/siding/red{
-	dir = 10
-	},
-/obj/effect/turf_decal/corner/opaque/neutral/bordercorner{
-	dir = 4
-	},
-/turf/open/floor/plasteel/mono/dark,
-/area/ship/hallway/central)
-"tO" = (
-/obj/effect/turf_decal/siding/blue/corner,
-/obj/effect/turf_decal/siding/blue/corner{
-	dir = 8
-	},
-/obj/effect/turf_decal/siding/blue/corner{
-	dir = 4
-	},
-/turf/open/floor/plasteel/dark,
-/area/ship/hallway/central)
-"tU" = (
-/obj/machinery/camera{
-	dir = 10
-	},
-/turf/open/floor/plating,
-/area/template_noop)
-"tV" = (
-/obj/machinery/door/firedoor/border_only{
-	dir = 4
-	},
-/obj/machinery/door/firedoor/border_only{
-	dir = 8
-	},
-/obj/machinery/button/door{
-	id = "cargodoors";
-	pixel_x = 8;
-	pixel_y = -24
-	},
-/obj/machinery/door/window{
-	dir = 8;
-	name = "Cargo Bay"
-	},
-/obj/machinery/door/poddoor/shutters{
-	dir = 4;
-	id = "cargodoors"
-	},
-/turf/open/floor/plasteel/dark,
-/area/ship/cargo)
-"ug" = (
-/obj/structure/table/reinforced,
-/obj/machinery/door/window/eastright,
-/obj/machinery/door/firedoor,
-/obj/machinery/door/poddoor/shutters{
-	dir = 4;
-	id = "cargodoors"
-	},
-/turf/open/floor/plasteel/dark,
-/area/ship/cargo)
-"ul" = (
-/obj/structure/cable/yellow{
-	icon_state = "0-8"
-	},
-/obj/machinery/power/port_gen/pacman,
-/obj/item/stack/sheet/mineral/plasma/five,
-/obj/effect/decal/cleanable/dirt,
-/turf/open/floor/plasteel/mono/dark,
-/area/ship/engineering)
-"uo" = (
-/obj/structure/cable{
-	icon_state = "1-2"
-	},
-/obj/machinery/atmospherics/components/binary/pump{
-	dir = 4
-	},
-/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer4{
-	dir = 5
-	},
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer2,
-/obj/structure/catwalk/over/plated_catwalk,
-/turf/open/floor/plating,
-/area/ship/engineering)
-"uB" = (
-/obj/structure/table,
-/obj/machinery/reagentgrinder,
-/obj/item/reagent_containers/food/drinks/shaker{
-	pixel_x = 10
-	},
-/obj/item/kitchen/knife{
-	pixel_x = -8
-	},
-/turf/open/floor/plasteel/mono/dark,
-/area/ship/crew/canteen)
-"uK" = (
-/obj/machinery/atmospherics/components/unary/outlet_injector/atmos/toxin_input{
-	dir = 8
-	},
-/obj/structure/window/plasma/reinforced/spawner/west,
-/turf/open/floor/engine/plasma,
-/area/ship/engineering)
-"uX" = (
-/obj/machinery/power/apc/auto_name/directional/east,
-/obj/structure/cable{
-	icon_state = "0-8"
-	},
-/obj/effect/turf_decal/corner/opaque/brown/border{
-	dir = 4
-	},
-/obj/machinery/suit_storage_unit/inherit/industrial,
-/obj/item/clothing/suit/space/syndicate/green,
-/obj/item/clothing/head/helmet/space/syndicate/green,
-/obj/item/clothing/mask/breath,
-/turf/open/floor/plasteel/mono/dark,
-/area/ship/cargo)
-"vb" = (
-/obj/machinery/door/firedoor/border_only,
-/obj/machinery/door/firedoor/border_only{
-	dir = 1
-	},
-/obj/machinery/door/poddoor/shutters{
-	id = "warehouse"
-	},
-/obj/effect/decal/cleanable/dirt,
-/turf/open/floor/plasteel/tech/techmaint,
-/area/ship/storage)
-"vf" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer2{
-	dir = 4
-	},
-/obj/machinery/atmospherics/pipe/manifold/supply/hidden/layer4,
-/obj/effect/turf_decal/siding/blue{
-	dir = 8
-	},
-/turf/open/floor/plasteel/dark,
-/area/ship/hallway/central)
-"vp" = (
-/turf/closed/wall/mineral/plastitanium/nodiagonal,
-/area/ship/engineering)
-"vw" = (
-/obj/machinery/camera{
-	dir = 1
-	},
-/turf/open/floor/plating,
-/area/template_noop)
-"vz" = (
-/obj/machinery/atmospherics/components/unary/shuttle/heater{
-	dir = 1
-	},
-/obj/structure/window/reinforced/spawner,
-/obj/machinery/door/poddoor/shutters{
-	id = "externalshutters"
-	},
-/turf/open/floor/plasteel/tech/techmaint,
-/area/ship/engineering)
-"vT" = (
-/obj/structure/closet/crate,
-/obj/item/grenade/c4,
-/obj/item/grenade/c4,
-/obj/item/grenade/c4,
-/obj/item/grenade/c4,
-/obj/item/grenade/c4,
-/obj/item/grenade/c4,
-/obj/item/grenade/c4,
-/obj/item/grenade/c4,
-/obj/item/grenade/c4,
-/obj/item/grenade/c4,
-/turf/open/floor/plasteel/mono/dark,
-/area/ship/storage)
-"wd" = (
-/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2,
-/obj/effect/turf_decal/siding/blue{
-	dir = 4
-	},
-/turf/open/floor/plasteel/dark,
-/area/ship/hallway/central)
-"wN" = (
-/obj/structure/table,
-/obj/machinery/chem_dispenser/drinks,
-/obj/machinery/light/directional/north,
-/turf/open/floor/plasteel/mono/dark,
-/area/ship/crew/canteen)
-"wP" = (
-/obj/structure/cable{
-	icon_state = "2-4"
-	},
-/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer4,
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer2,
-/obj/effect/decal/cleanable/dirt,
-/obj/structure/cable{
-	icon_state = "1-2"
-	},
-/turf/open/floor/plasteel/mono/dark,
-/area/ship/cargo)
-"wT" = (
-/obj/machinery/atmospherics/components/unary/vent_pump/siphon/atmos/toxin_output{
-	dir = 8
-	},
-/obj/structure/window/plasma/reinforced/spawner/west,
-/turf/open/floor/engine/plasma,
-/area/ship/engineering)
-"xa" = (
-/obj/effect/turf_decal/siding/blue,
-/obj/effect/turf_decal/corner/opaque/blue/half{
-	dir = 1
-	},
-/turf/open/floor/plasteel/dark,
-/area/ship/hallway/central)
-"xc" = (
-/obj/structure/cable{
-	icon_state = "1-2"
-	},
-/obj/structure/chair/plastic{
-	dir = 4
-	},
-/obj/effect/turf_decal/siding/red{
-	dir = 8
-	},
-/obj/effect/turf_decal/corner/opaque/neutral/border{
-	dir = 4
-	},
-/turf/open/floor/plasteel/mono/dark,
-/area/ship/hallway/central)
-"xt" = (
-/obj/machinery/light/directional/east,
-/obj/item/clothing/head/HoS/beret/syndicate,
-/obj/item/radio/headset/syndicate/alt,
-/obj/item/gun/ballistic/shotgun/doublebarrel,
-/obj/item/clothing/under/rank/civilian/bartender,
-/obj/structure/closet/secure_closet/bar{
-	req_access = null;
-	req_one_access_txt = list(25,41)
-	},
-/turf/open/floor/plasteel/mono/dark,
-/area/ship/engineering)
-"xw" = (
-/obj/structure/cable{
-	icon_state = "1-8"
-	},
-/obj/effect/decal/cleanable/dirt,
-/obj/machinery/vending/clothing{
-	default_price = 0;
-	extra_price = 0
-	},
-/obj/machinery/light/small/directional/east,
-/turf/open/floor/plasteel/dark,
-/area/ship/crew/dorm)
-"yd" = (
-/obj/structure/table,
-/obj/machinery/chem_dispenser/drinks/beer,
-/turf/open/floor/plasteel/mono/dark,
-/area/ship/crew/canteen)
-"yf" = (
-/obj/effect/turf_decal/siding/blue/corner{
-	dir = 4
-	},
-/obj/effect/turf_decal/siding/blue{
-	dir = 10
-	},
-/turf/open/floor/plasteel/dark,
-/area/ship/hallway/central)
-"yh" = (
-/obj/machinery/light_switch{
-	dir = 8;
-	pixel_x = 24;
-	pixel_y = 5
-	},
-/obj/effect/turf_decal/corner/opaque/brown/border{
-	dir = 4
-	},
-/obj/effect/turf_decal/corner/opaque/brown/bordercorner{
-	dir = 1
-	},
-/turf/open/floor/plasteel/mono/dark,
-/area/ship/cargo)
-"ym" = (
-/obj/effect/turf_decal/siding/blue{
-	dir = 8
-	},
-/turf/open/floor/plasteel/dark,
-/area/ship/hallway/central)
-"yQ" = (
-/obj/structure/cable/yellow{
-	icon_state = "2-8"
-	},
-/obj/structure/cable/yellow{
-	icon_state = "2-4"
-	},
-/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer4,
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer2,
-/obj/structure/catwalk/over/plated_catwalk/dark,
-/turf/open/floor/plating,
-/area/ship/engineering)
-"yX" = (
-/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer4,
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer2,
-/obj/effect/turf_decal/siding/blue/corner{
-	dir = 8
-	},
-/obj/effect/turf_decal/siding/blue/corner,
-/obj/effect/turf_decal/siding/blue/corner{
-	dir = 1
-	},
-/obj/effect/turf_decal/siding/blue/corner{
-	dir = 4
-	},
-/obj/machinery/navbeacon/wayfinding{
-	codes_txt = "patrol;next_patrol=lux_kitchen";
-	location = "lux_shopfloor"
-	},
-/obj/machinery/holopad/emergency/cargo,
-/turf/open/floor/plasteel/dark,
-/area/ship/hallway/central)
-"zc" = (
-/obj/structure/rack,
-/obj/effect/turf_decal/corner/opaque/neutral/mono,
-/obj/machinery/airalarm/directional/east,
-/turf/open/floor/plasteel/mono/dark,
-/area/ship/hallway/central)
-"zW" = (
-/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer4{
-	dir = 6
-	},
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer2{
-	dir = 6
-	},
-/turf/open/floor/carpet/red_gold,
-/area/ship/crew/dorm)
-"Ai" = (
-/obj/structure/cable{
-	icon_state = "1-2"
-	},
-/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer4,
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer2,
-/obj/machinery/door/airlock{
-	name = "Dormitory"
-	},
-/turf/open/floor/plasteel/tech/techmaint,
-/area/ship/crew/dorm)
-"AE" = (
-/obj/machinery/door/airlock/external,
-/obj/effect/mapping_helpers/airlock/cyclelink_helper,
-/obj/machinery/atmospherics/pipe/layer_manifold,
-/turf/open/floor/plating,
-/area/ship/engineering)
-"AL" = (
-/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{
-	dir = 4
-	},
-/obj/effect/decal/cleanable/dirt,
-/turf/open/floor/plasteel/mono/dark,
-/area/ship/cargo)
-"Bt" = (
-/turf/closed/wall/mineral/plastitanium,
-/area/ship/crew/canteen)
-"Bw" = (
-/turf/closed/wall/mineral/plastitanium,
-/area/ship/cargo)
-"BM" = (
-/obj/structure/bed/pod,
-/obj/item/bedsheet/blue,
-/obj/structure/window/reinforced/tinted/frosted,
-/obj/structure/curtain/bounty,
-/obj/machinery/power/apc/auto_name/directional/west,
-/obj/structure/cable{
-	icon_state = "0-4"
-	},
-/obj/machinery/light_switch{
-	dir = 4;
-	pixel_x = -19;
-	pixel_y = 12
-	},
-/turf/open/floor/carpet/red_gold,
-/area/ship/crew/dorm)
-"BX" = (
-/obj/machinery/airalarm/directional/west,
-/obj/machinery/cryopod{
-	dir = 4
-	},
-/turf/open/floor/plasteel/tech/techmaint,
-/area/ship/crew/dorm)
-"BZ" = (
-/obj/effect/decal/cleanable/dirt,
-/obj/effect/turf_decal/corner/opaque/brown/border{
-	dir = 4
-	},
-/turf/open/floor/plasteel/mono/dark,
-/area/ship/cargo)
-"CC" = (
-/obj/effect/decal/cleanable/dirt,
-/turf/open/floor/plasteel/mono/dark,
-/area/ship/cargo)
-"CI" = (
-/obj/effect/turf_decal/siding/blue/corner{
-	dir = 1
-	},
-/obj/effect/turf_decal/siding/blue{
-	dir = 6
-	},
-/turf/open/floor/plasteel/dark,
-/area/ship/hallway/central)
-"CM" = (
-/obj/structure/cable{
-	icon_state = "2-4"
-	},
-/obj/structure/cable{
-	icon_state = "2-8"
-	},
-/obj/machinery/atmospherics/pipe/manifold4w/supply/hidden/layer4,
-/obj/machinery/atmospherics/pipe/manifold4w/scrubbers/hidden/layer2,
-/obj/structure/catwalk/over/plated_catwalk,
-/turf/open/floor/plating,
-/area/ship/engineering)
-"CT" = (
-/obj/machinery/computer/atmos_control/tank/toxin_tank{
-	dir = 8
-	},
-/obj/machinery/light/directional/south,
-/turf/open/floor/plasteel/tech/techmaint,
-/area/ship/engineering)
-"CV" = (
-/obj/structure/cable{
-	icon_state = "1-2"
-	},
-/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer4,
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer2,
-/obj/effect/turf_decal/siding/red,
-/obj/structure/cable{
-	icon_state = "2-8"
-	},
-/turf/open/floor/plasteel/mono/dark,
-/area/ship/crew/canteen)
-"CW" = (
-/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer4{
-	dir = 4
-	},
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer2{
-	dir = 8
-	},
-/obj/structure/closet/secure_closet/engineering_electrical,
-/obj/item/stack/circuit_stack/full,
-/obj/item/stack/circuit_stack/full,
-/obj/item/stack/circuit_stack/full,
-/obj/item/stack/circuit_stack/full,
-/obj/machinery/light/directional/north,
-/turf/open/floor/plasteel/tech/techmaint,
-/area/ship/engineering)
-"Da" = (
-/obj/structure/cable{
-	icon_state = "1-2"
-	},
-/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer4,
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer2,
-/obj/machinery/door/firedoor/border_only{
-	dir = 1
-	},
-/obj/machinery/door/firedoor/border_only,
-/obj/machinery/door/airlock{
-	name = "Canteen"
-	},
-/turf/open/floor/plasteel/tech/techmaint,
-/area/ship/crew/canteen)
-"Dq" = (
-/obj/structure/cable{
-	icon_state = "1-2"
-	},
-/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer4,
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer2,
-/obj/effect/turf_decal/corner/opaque/neutral/mono,
-/obj/machinery/navbeacon/wayfinding{
-	codes_txt = "patrol;next_patrol=lux_crew";
-	location = "lux_kitchen"
-	},
-/turf/open/floor/plasteel/mono/dark,
-/area/ship/crew/canteen)
-"Dw" = (
-/obj/structure/table,
-/obj/structure/window/plasma/reinforced,
-/obj/item/reagent_containers/food/drinks/shaker,
-/obj/machinery/door/firedoor,
-/turf/open/floor/plasteel/mono/dark,
-/area/ship/crew/canteen)
-"DA" = (
-/obj/effect/turf_decal/siding/red,
-/obj/machinery/firealarm/directional/south,
-/obj/machinery/light_switch{
-	dir = 1;
-	pixel_x = 6;
-	pixel_y = -24
-	},
-/obj/machinery/airalarm/directional/east,
-/obj/machinery/vending/dinnerware,
-/turf/open/floor/plasteel/mono/dark,
-/area/ship/crew/canteen)
-"DE" = (
-/obj/structure/rack,
-/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{
-	dir = 8
-	},
-/obj/effect/turf_decal/corner/opaque/neutral/mono,
-/turf/open/floor/plasteel/mono/dark,
-/area/ship/hallway/central)
-"DG" = (
-/obj/machinery/light/directional/south,
-/obj/structure/rack,
-/obj/effect/turf_decal/corner/opaque/neutral/mono,
-/turf/open/floor/plasteel/mono/dark,
-/area/ship/hallway/central)
-"DJ" = (
-/obj/machinery/atmospherics/pipe/manifold/supply/hidden/layer4{
-	dir = 8
-	},
-/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer2{
-	dir = 4
-	},
-/obj/structure/catwalk/over/plated_catwalk/dark,
-/obj/effect/turf_decal/number/five{
-	dir = 4
-	},
-/turf/open/floor/plating,
-/area/ship/engineering)
-"DW" = (
-/obj/effect/decal/cleanable/dirt,
-/obj/machinery/light_switch{
-	dir = 8;
-	pixel_x = 24
-	},
-/obj/structure/chair/plastic,
-/turf/open/floor/carpet/red_gold,
-/area/ship/crew/dorm)
-"Ee" = (
-/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer4{
-	dir = 4
-	},
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer2{
-	dir = 4
-	},
-/obj/effect/turf_decal/corner/opaque/brown/border{
-	dir = 4
-	},
-/turf/open/floor/plasteel/mono/dark,
-/area/ship/cargo)
-"Ej" = (
-/obj/machinery/modular_computer/console/preset/command{
-	dir = 4
-	},
-/turf/open/floor/plasteel/mono/dark,
-/area/ship/hallway/central)
-"Er" = (
-/obj/machinery/atmospherics/pipe/simple/orange/visible{
-	dir = 9
-	},
-/turf/closed/wall/mineral/plastitanium/nodiagonal,
-/area/ship/engineering)
-"EG" = (
-/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{
-	dir = 8
-	},
-/obj/effect/turf_decal/trimline/opaque/brown/filled/warning{
-	dir = 4
-	},
-/turf/open/floor/plasteel/mono/dark,
-/area/ship/cargo)
-"EO" = (
-/turf/closed/wall/mineral/plastitanium/nodiagonal,
-/area/ship/crew/dorm)
-"EW" = (
-/turf/open/floor/engine/plasma,
-/area/ship/engineering)
-"EZ" = (
-/obj/item/radio/headset/syndicate/alt,
-/obj/item/toy/figure/cargotech,
-/obj/item/clothing/suit/hooded/wintercoat/cargo,
-/obj/item/stack/sheet/cardboard/fifty,
-/obj/item/hand_labeler,
-/obj/item/hand_labeler_refill,
-/obj/item/clothing/under/syndicate/donk,
-/obj/item/clothing/suit/hazardvest/donk,
-/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{
-	dir = 4
-	},
-/obj/item/stack/wrapping_paper,
-/obj/item/stack/packageWrap,
-/obj/structure/closet/wall{
-	dir = 4;
-	icon_door = "orange_wall";
-	name = "employee closet";
-	pixel_x = -28
-	},
-/turf/open/floor/plasteel/mono/dark,
-/area/ship/engineering)
-"Fj" = (
-/obj/structure/cable{
-	icon_state = "4-8"
-	},
-/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer4,
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer2,
-/obj/item/paper{
-	desc = "A piece of paper depicting a extremely pissed up upper manager";
-	default_raw_text = "YOU DAMNNED FOOLS! YOU ARENT SUPPOSED TO USE YOUR STOCK, YOU'RE SUPPOSED TO SELL THEM!! WE AREN'T WASTING MY MONEY ARE WE!?! NOW GET BACK TO WORK!!!";
-	name = "angry letter from upper management"
-	},
-/turf/open/floor/plasteel/patterned/cargo_one,
-/area/ship/storage)
-"Fq" = (
-/obj/structure/cable{
-	icon_state = "4-8"
-	},
-/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer4{
-	dir = 8
-	},
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer2{
-	dir = 4
-	},
-/obj/machinery/holopad/emergency/bar,
-/obj/effect/turf_decal/corner/opaque/neutral/mono,
-/turf/open/floor/plasteel/mono/dark,
-/area/ship/crew/canteen)
-"FV" = (
-/obj/structure/cable{
-	icon_state = "1-2"
-	},
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer2,
-/obj/machinery/atmospherics/pipe/manifold/supply/hidden/layer4{
-	dir = 8
-	},
-/turf/open/floor/plasteel/patterned,
-/area/ship/crew/dorm)
-"Ga" = (
-/obj/machinery/computer/helm,
-/turf/open/floor/plasteel/mono/dark,
-/area/ship/hallway/central)
-"Gr" = (
-/obj/structure/cable{
-	icon_state = "4-8"
-	},
-/obj/machinery/atmospherics/pipe/simple/orange/visible{
-	dir = 4
-	},
-/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{
-	dir = 8
-	},
-/obj/structure/catwalk/over/plated_catwalk,
-/turf/open/floor/plating,
-/area/ship/engineering)
-"GD" = (
-/obj/docking_port/stationary{
-	width = 30;
-	height = 15;
-	dir = 8;
-	dwidth = 15
-	},
-/turf/template_noop,
-/area/template_noop)
-"GG" = (
-/obj/structure/cable{
-	icon_state = "4-8"
-	},
-/obj/machinery/atmospherics/pipe/simple/orange/visible{
-	dir = 6
-	},
-/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer2{
-	dir = 1
-	},
-/obj/effect/decal/cleanable/dirt,
-/obj/structure/catwalk/over/plated_catwalk,
-/turf/open/floor/plating,
-/area/ship/engineering)
-"Hx" = (
-/turf/closed/wall/mineral/plastitanium,
-/area/ship/crew/dorm)
-"HG" = (
-/obj/machinery/power/shieldwallgen/atmos{
-	anchored = 1;
-	id = "luxembourg_cargo";
-	locked = 1
-	},
-/obj/structure/cable{
-	icon_state = "0-4"
-	},
-/obj/machinery/door/poddoor/shutters{
-	dir = 4;
-	id = "syndiefuck"
-	},
-/turf/open/floor/plasteel/mono/dark,
-/area/ship/cargo)
-"HK" = (
-/obj/structure/rack,
-/obj/effect/turf_decal/corner/opaque/neutral/mono,
-/obj/machinery/light/directional/east,
-/turf/open/floor/plasteel/mono/dark,
-/area/ship/hallway/central)
-"HZ" = (
-/obj/structure/table,
-/obj/item/reagent_containers/glass/rag,
-/obj/machinery/door/firedoor,
-/turf/open/floor/plasteel/mono/dark,
-/area/ship/crew/canteen)
-"Id" = (
-/obj/structure/cable{
-	icon_state = "1-2"
-	},
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer2,
-/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer4,
-/obj/structure/cable{
-	icon_state = "2-8"
-	},
-/turf/open/floor/carpet/red_gold,
-/area/ship/crew/dorm)
-"Ij" = (
-/obj/effect/spawner/structure/window/plasma/reinforced/plastitanium,
-/obj/docking_port/mobile{
-	can_move_docking_ports = 1;
-	dir = 2;
-	launch_status = 0
-	},
-/obj/machinery/door/poddoor/shutters{
-	id = "externalshutters"
-	},
-/turf/open/floor/plating,
-/area/ship/hallway/central)
-"Ip" = (
-/obj/item/toy/figure/cargotech,
-/obj/item/clothing/suit/hooded/wintercoat/cargo,
-/obj/item/stack/sheet/cardboard/fifty,
-/obj/item/hand_labeler,
-/obj/item/hand_labeler_refill,
-/obj/item/clothing/under/syndicate/donk,
-/obj/item/clothing/suit/hazardvest/donk,
-/obj/item/stack/wrapping_paper,
-/obj/item/stack/packageWrap,
-/obj/structure/railing,
-/obj/structure/closet/wall{
-	dir = 8;
-	icon_door = "orange_wall";
-	name = "employee closet";
-	pixel_x = 28
-	},
-/turf/open/floor/plasteel/mono/dark,
-/area/ship/engineering)
-"Iv" = (
-/obj/effect/turf_decal/siding/blue{
-	dir = 4
-	},
-/obj/effect/turf_decal/siding/blue{
-	dir = 8
-	},
-/turf/open/floor/plasteel/dark,
-/area/ship/hallway/central)
-"IT" = (
-/obj/machinery/power/apc/auto_name/directional/east,
-/obj/structure/cable,
-/obj/effect/turf_decal/siding/blue,
-/obj/machinery/light_switch{
-	dir = 8;
-	pixel_x = 20;
-	pixel_y = 11
-	},
-/turf/open/floor/plasteel/dark,
-/area/ship/hallway/central)
-"Je" = (
-/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer4,
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer2,
-/obj/structure/cable{
-	icon_state = "1-2"
-	},
-/turf/open/floor/plasteel/mono/dark,
-/area/ship/cargo)
-"Ji" = (
-/obj/structure/bed/pod,
-/obj/item/bedsheet/blue,
-/obj/structure/curtain/bounty,
-/turf/open/floor/carpet/red_gold,
-/area/ship/crew/dorm)
-"Jq" = (
-/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer4,
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer2,
-/obj/effect/turf_decal/siding/blue/corner{
-	dir = 1
-	},
-/obj/effect/turf_decal/siding/blue/corner{
-	dir = 4
-	},
-/turf/open/floor/plasteel/dark,
-/area/ship/hallway/central)
-"Jr" = (
-/obj/effect/turf_decal/siding/blue{
-	dir = 1
-	},
-/obj/effect/turf_decal/siding/blue/corner,
-/turf/open/floor/plasteel/dark,
-/area/ship/hallway/central)
-"JO" = (
-/obj/structure/closet/crate/science,
-/obj/item/circuitboard/machine/chem_dispenser/drinks,
-/obj/item/circuitboard/machine/chem_dispenser/drinks,
-/obj/item/circuitboard/machine/chem_dispenser/drinks,
-/obj/item/circuitboard/machine/chem_dispenser/drinks/beer,
-/obj/item/circuitboard/machine/chem_dispenser/drinks/beer,
-/obj/item/circuitboard/machine/chem_dispenser/drinks/beer,
-/obj/item/circuitboard/machine/deep_fryer,
-/obj/item/circuitboard/machine/deep_fryer,
-/obj/item/circuitboard/machine/deep_fryer,
-/obj/item/circuitboard/machine/mechfab,
-/obj/item/circuitboard/machine/mechfab,
-/obj/item/circuitboard/machine/mechfab,
-/obj/item/circuitboard/machine/mechfab,
-/obj/item/circuitboard/machine/mechfab,
-/obj/item/circuitboard/machine/ore_redemption,
-/obj/item/circuitboard/machine/ore_redemption,
-/obj/item/circuitboard/machine/ore_redemption,
-/obj/item/circuitboard/machine/microwave,
-/obj/item/circuitboard/machine/microwave,
-/obj/item/circuitboard/machine/microwave,
-/obj/machinery/firealarm/directional/east,
-/obj/machinery/light_switch{
-	pixel_x = 6;
-	pixel_y = 24
-	},
-/turf/open/floor/plasteel/mono/dark,
-/area/ship/storage)
-"JT" = (
-/obj/machinery/door/poddoor/shutters{
-	dir = 4;
-	id = "syndiefuck"
-	},
-/turf/open/floor/plasteel/mono/dark,
-/area/ship/cargo)
-"JU" = (
-/obj/effect/turf_decal/corner/opaque/brown/border{
-	dir = 6
-	},
-/obj/machinery/suit_storage_unit/inherit/industrial,
-/obj/item/clothing/suit/space/syndicate/blue,
-/obj/item/clothing/head/helmet/space/syndicate/blue,
-/obj/item/clothing/mask/breath,
-/turf/open/floor/plasteel/mono/dark,
-/area/ship/cargo)
-"JV" = (
-/obj/effect/turf_decal/corner/opaque/brown/bordercorner{
-	dir = 1
-	},
-/obj/structure/cable{
-	icon_state = "4-8"
-	},
-/turf/open/floor/plasteel/mono/dark,
-/area/ship/cargo)
-"Ka" = (
-/turf/closed/wall/mineral/plastitanium/nodiagonal,
-/area/ship/storage)
-"Kg" = (
-/obj/effect/decal/cleanable/dirt,
-/obj/machinery/shower{
-	dir = 4
-	},
-/obj/structure/window/reinforced/tinted/frosted,
-/obj/structure/curtain,
-/obj/effect/turf_decal/steeldecal/steel_decals10{
-	dir = 8
-	},
-/obj/machinery/light_switch{
-	pixel_y = 23;
-	pixel_x = 11
-	},
-/turf/open/floor/plasteel/patterned,
-/area/ship/crew/dorm)
-"Kk" = (
-/obj/machinery/air_sensor/atmos/toxin_tank,
-/turf/open/floor/engine/plasma,
-/area/ship/engineering)
-"Ko" = (
-/obj/structure/cable{
-	icon_state = "2-8"
-	},
-/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2,
-/obj/effect/decal/cleanable/dirt,
-/obj/machinery/navbeacon/wayfinding{
-	codes_txt = "patrol;next_patrol=lux_lobby";
-	location = "lux_warehouse"
-	},
-/turf/open/floor/plasteel/patterned/cargo_one,
-/area/ship/storage)
-"KH" = (
-/obj/effect/decal/cleanable/dirt,
-/obj/machinery/vending/autodrobe/all_access{
-	default_price = 0;
-	extra_price = 0
-	},
-/obj/machinery/firealarm/directional/south,
-/turf/open/floor/plasteel/dark,
-/area/ship/crew/dorm)
-"KX" = (
-/obj/structure/closet/crate,
-/obj/item/construction/rcd/combat,
-/obj/item/construction/rcd/combat,
-/obj/item/construction/rcd/combat,
-/obj/item/construction/rcd/combat,
-/obj/item/construction/rcd/combat,
-/obj/item/construction/rcd/combat,
-/obj/item/construction/rcd/combat,
-/obj/item/construction/rcd/combat,
-/obj/item/construction/rcd/combat,
-/obj/item/construction/rcd/combat,
-/turf/open/floor/plasteel/mono/dark,
-/area/ship/storage)
-"KZ" = (
-/obj/effect/turf_decal/siding/red,
-/obj/structure/closet/secure_closet/freezer/wall{
-	dir = 1;
-	name = "refrigerator";
-	pixel_y = -32
-	},
-/obj/item/storage/box/donkpockets/donkpocketteriyaki,
-/obj/item/storage/box/donkpockets/donkpocketteriyaki,
-/obj/item/storage/box/donkpockets/donkpocketteriyaki,
-/obj/item/storage/box/donkpockets/donkpocketteriyaki,
-/obj/item/storage/box/donkpockets/donkpocketspicy,
-/obj/item/storage/box/donkpockets/donkpocketspicy,
-/obj/item/storage/box/donkpockets/donkpocketspicy,
-/obj/item/storage/box/donkpockets/donkpocketspicy,
-/obj/item/storage/box/donkpockets/donkpockethonk,
-/obj/item/storage/box/donkpockets/donkpockethonk,
-/obj/item/storage/box/donkpockets/donkpockethonk,
-/obj/item/storage/box/donkpockets/donkpockethonk,
-/obj/item/storage/box/donkpockets,
-/obj/item/storage/box/donkpockets,
-/obj/item/storage/box/donkpockets,
-/obj/item/storage/box/donkpockets,
-/turf/open/floor/plasteel/mono/dark,
-/area/ship/crew/canteen)
-"La" = (
-/obj/effect/turf_decal/corner/opaque/blue{
-	dir = 4
-	},
-/obj/machinery/button/door{
-	id = "cargodoors";
-	pixel_y = 25
-	},
-/turf/open/floor/plasteel/dark,
-/area/ship/hallway/central)
-"Lr" = (
-/obj/structure/cable{
-	icon_state = "4-8"
-	},
-/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer4{
-	dir = 8
-	},
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer2{
-	dir = 4
-	},
-/obj/structure/table,
-/obj/item/reagent_containers/food/drinks/drinkingglass{
-	pixel_x = -4;
-	pixel_y = -4
-	},
-/obj/item/paper{
-	desc = "A piece of paper depicting a extremely pissed up upper manager";
-	default_raw_text = "YOU ARENT SUPPOSED TO BE MINING, HEAR ME!?!! YOU'RE SUPPOSED TO BE SELLING SHIT TO THE CONSUMERS YOU HEAR!! AS PUNISHMENT FOR THE LAST SHIFT, I HAVE REMOVED ALLL OF YOUR MINING TOOLS!! NOW GET BACK TO WORK!!";
-	name = "angry letter from upper management"
-	},
-/obj/machinery/door/firedoor,
-/turf/open/floor/plasteel/mono/dark,
-/area/ship/crew/canteen)
-"Lu" = (
-/obj/structure/chair/plastic{
-	dir = 1
-	},
-/turf/open/floor/carpet/red_gold,
-/area/ship/crew/dorm)
-"LU" = (
-/obj/machinery/atmospherics/components/unary/outlet_injector/atmos/air_input{
-	dir = 4
-	},
-/obj/structure/window/plasma/reinforced/spawner/east,
-/turf/open/floor/engine/air,
-/area/ship/engineering)
-"LV" = (
-/obj/machinery/vending/boozeomat/all_access{
-	default_price = 0;
-	extra_price = 0
-	},
-/turf/open/floor/plasteel/mono/dark,
-/area/ship/crew/canteen)
-"LY" = (
-/obj/machinery/firealarm/directional/west,
-/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{
-	dir = 8
-	},
-/obj/structure/closet/crate,
-/obj/item/card/emag/limited,
-/obj/item/card/emag/limited,
-/obj/item/card/emag/limited,
-/obj/item/card/emag/limited,
-/obj/item/card/emag/limited,
-/obj/item/card/emag/limited,
-/obj/item/card/emag/limited,
-/obj/item/card/emag/limited,
-/obj/item/card/emag/limited,
-/obj/item/card/emag/limited,
-/obj/item/radio/intercom/directional/east,
-/turf/open/floor/plasteel/mono/dark,
-/area/ship/storage)
-"Mg" = (
-/obj/structure/cable{
-	icon_state = "2-8"
-	},
-/obj/machinery/atmospherics/pipe/manifold/supply/hidden/layer4{
-	dir = 4
-	},
-/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer2{
-	dir = 1
-	},
-/obj/effect/turf_decal/corner/opaque/neutral/mono,
-/turf/open/floor/plasteel/mono/dark,
-/area/ship/crew/canteen)
-"Mi" = (
-/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer4{
-	dir = 4
-	},
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer2{
-	dir = 4
-	},
-/obj/effect/decal/cleanable/dirt,
-/obj/structure/table/reinforced,
-/obj/structure/window/plasma/reinforced,
-/obj/machinery/door/window/eastright,
-/obj/machinery/door/firedoor,
-/obj/machinery/door/poddoor/shutters{
-	dir = 4;
-	id = "cargodoors"
-	},
-/turf/open/floor/plasteel/dark,
-/area/ship/cargo)
-"Mj" = (
-/obj/machinery/atmospherics/components/binary/dp_vent_pump,
-/obj/machinery/advanced_airlock_controller{
-	pixel_x = -25
-	},
-/turf/open/floor/plating,
-/area/ship/engineering)
-"Mx" = (
-/obj/effect/turf_decal/siding/blue{
-	dir = 8
-	},
-/obj/machinery/light_switch{
-	dir = 1;
-	pixel_x = 10;
-	pixel_y = -21
-	},
-/obj/machinery/firealarm/directional/south,
-/obj/effect/turf_decal/trimline/opaque/blue/filled/warning,
-/turf/open/floor/plasteel/dark,
-/area/ship/hallway/central)
-"Mz" = (
-/obj/structure/tank_dispenser/oxygen,
-/obj/effect/decal/cleanable/dirt,
-/obj/effect/turf_decal/corner/opaque/brown/border{
-	dir = 9
-	},
-/turf/open/floor/plasteel/mono/dark,
-/area/ship/cargo)
-"MT" = (
-/obj/effect/spawner/structure/window/plasma/reinforced/plastitanium,
-/obj/machinery/door/poddoor/shutters{
-	dir = 4;
-	id = "externalshutters"
-	},
-/turf/open/floor/plating,
-/area/ship/cargo)
-"MU" = (
-/obj/machinery/door/window/brigdoor{
-	name = "Bridge";
-	req_access_txt = "41"
-	},
-/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer4{
-	dir = 6
-	},
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer2{
-	dir = 10
-	},
-/turf/open/floor/carpet/red_gold,
-/area/ship/hallway/central)
-"Nr" = (
-/turf/template_noop,
-/area/template_noop)
-"NH" = (
-/obj/effect/turf_decal/siding/blue/corner,
-/obj/effect/turf_decal/corner/opaque/blue/half{
-	dir = 1
-	},
-/turf/open/floor/plasteel/dark,
-/area/ship/hallway/central)
-"NJ" = (
-/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer4{
-	dir = 4
-	},
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer2{
-	dir = 4
-	},
-/turf/open/floor/plasteel/dark,
-/area/ship/hallway/central)
-"NQ" = (
-/obj/machinery/light/directional/west,
-/obj/effect/decal/cleanable/dirt,
-/obj/structure/table,
-/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{
-	dir = 4
-	},
-/obj/item/storage/fancy/cigarettes/cigpack_syndicate{
-	pixel_x = 6
-	},
-/obj/item/lighter/greyscale{
-	pixel_x = -3;
-	pixel_y = 4
-	},
-/turf/open/floor/carpet/red_gold,
-/area/ship/crew/dorm)
-"On" = (
-/obj/item/storage/toolbox/syndicate,
-/obj/item/storage/toolbox/syndicate,
-/obj/item/storage/toolbox/syndicate,
-/obj/item/storage/toolbox/syndicate,
-/obj/item/storage/toolbox/syndicate,
-/obj/item/storage/toolbox/syndicate,
-/obj/item/storage/toolbox/syndicate,
-/obj/item/storage/toolbox/syndicate,
-/obj/item/storage/toolbox/syndicate,
-/obj/item/storage/toolbox/syndicate,
-/obj/item/storage/toolbox/syndicate,
-/obj/structure/closet/crate,
-/turf/open/floor/plasteel/mono/dark,
-/area/ship/storage)
-"Op" = (
-/obj/effect/spawner/structure/window/plasma/reinforced/plastitanium,
-/obj/machinery/door/poddoor/shutters{
-	dir = 4;
-	id = "externalshutters"
-	},
-/turf/open/floor/plating,
-/area/ship/crew/canteen)
-"Oq" = (
-/obj/structure/table,
-/obj/item/toy/cards/deck/syndicate,
-/turf/open/floor/carpet/red_gold,
-/area/ship/crew/dorm)
-"Oz" = (
-/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4,
-/obj/effect/turf_decal/siding/blue{
-	dir = 8
-	},
-/turf/open/floor/plasteel/dark,
-/area/ship/hallway/central)
-"OR" = (
-/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer4{
-	dir = 6
-	},
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer2{
-	dir = 6
-	},
-/obj/effect/decal/cleanable/oil,
-/obj/structure/cable{
-	icon_state = "2-8"
-	},
-/turf/open/floor/plasteel/mono/dark,
-/area/ship/cargo)
-"OY" = (
-/obj/structure/closet/crate/trashcart,
-/obj/effect/spawner/lootdrop/maintenance/eight,
-/obj/effect/turf_decal/corner/opaque/brown/border{
-	dir = 9
-	},
-/obj/machinery/button/shieldwallgen{
-	id = "luxembourg_cargo";
-	pixel_x = -10;
-	pixel_y = 25
-	},
-/obj/structure/cable{
-	icon_state = "4-8"
-	},
-/obj/machinery/button/door{
-	id = "syndiefuck";
-	pixel_x = -20;
-	pixel_y = 26
-	},
-/turf/open/floor/plasteel/mono/dark,
-/area/ship/cargo)
-"Pb" = (
-/obj/effect/decal/cleanable/dirt,
-/turf/closed/wall/mineral/plastitanium/nodiagonal,
-/area/ship/crew/dorm)
-"Ph" = (
-/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer4,
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer2,
-/obj/structure/catwalk/over/plated_catwalk/dark,
-/obj/effect/turf_decal/number/zero{
-	dir = 4
-	},
-/turf/open/floor/plating,
-/area/ship/engineering)
-"Ps" = (
-/obj/machinery/light/directional/south,
-/obj/item/banner/cargo,
-/obj/effect/turf_decal/corner/opaque/brown/border{
-	dir = 10
-	},
-/obj/machinery/button/shieldwallgen{
-	dir = 1;
-	id = "luxembourg_cargo";
-	pixel_x = -10;
-	pixel_y = -25
-	},
-/obj/structure/cable{
-	icon_state = "4-8"
-	},
-/obj/machinery/button/door{
-	dir = 1;
-	id = "syndiefuck";
-	pixel_x = -20;
-	pixel_y = -26
-	},
-/turf/open/floor/plasteel/mono/dark,
-/area/ship/cargo)
-"PO" = (
-/obj/structure/sign/poster/contraband/syndicate_recruitment{
-	pixel_x = 4;
-	pixel_y = -30
-	},
-/obj/effect/turf_decal/siding/blue{
-	dir = 4
-	},
-/obj/effect/turf_decal/trimline/opaque/blue/filled/warning,
-/turf/open/floor/plasteel/dark,
-/area/ship/hallway/central)
-"PW" = (
-/obj/structure/sign/donk{
-	pixel_x = -32
-	},
-/obj/structure/rack,
-/obj/effect/turf_decal/corner/opaque/neutral/mono,
-/turf/open/floor/plasteel/mono/dark,
-/area/ship/hallway/central)
-"QG" = (
-/obj/machinery/light/directional/west,
-/obj/machinery/vending/toyliberationstation,
-/obj/structure/window/plasma/reinforced,
-/turf/open/floor/plasteel/mono/dark,
-/area/ship/hallway/central)
-"QQ" = (
-/obj/structure/window/plasma/reinforced,
-/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{
-	dir = 4
-	},
-/turf/open/floor/carpet/red_gold,
-/area/ship/hallway/central)
-"QT" = (
-/obj/machinery/light/directional/east,
-/obj/structure/window/plasma/reinforced,
-/obj/machinery/computer/selling_pad_control{
-	dir = 8
-	},
-/obj/machinery/airalarm/directional/north,
-/turf/open/floor/plasteel/mono/dark,
-/area/ship/hallway/central)
-"QU" = (
-/obj/structure/cable{
-	icon_state = "1-2"
-	},
-/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer4,
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer2,
-/obj/machinery/button/door{
-	id = "warehouse";
-	pixel_x = 24;
-	pixel_y = 21
-	},
-/turf/open/floor/plasteel/patterned/cargo_one,
-/area/ship/storage)
-"Rk" = (
-/obj/structure/rack,
-/obj/effect/turf_decal/corner/opaque/neutral/mono,
-/obj/machinery/light/directional/west,
-/turf/open/floor/plasteel/mono/dark,
-/area/ship/hallway/central)
-"Ro" = (
-/obj/structure/cable{
-	icon_state = "1-2"
-	},
-/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer4,
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer2,
-/obj/machinery/door/firedoor/border_only{
-	dir = 1
-	},
-/obj/machinery/door/firedoor/border_only,
-/obj/structure/catwalk/over/plated_catwalk/white,
-/obj/machinery/door/airlock/engineering{
-	name = "Engineering"
-	},
-/turf/open/floor/plasteel/tech/techmaint,
-/area/ship/engineering)
-"Rp" = (
-/turf/open/floor/carpet/red_gold,
-/area/ship/crew/dorm)
-"RH" = (
-/obj/effect/spawner/structure/window/plasma/reinforced/plastitanium,
-/obj/machinery/door/poddoor/shutters{
-	id = "externalshutters"
-	},
-/turf/open/floor/plating,
-/area/ship/cargo)
-"RM" = (
-/obj/effect/turf_decal/trimline/opaque/brown/filled/warning,
-/obj/structure/cable{
-	icon_state = "4-8"
-	},
-/turf/open/floor/plasteel/mono/dark,
-/area/ship/cargo)
-"Sn" = (
-/obj/effect/turf_decal/siding/blue,
-/obj/effect/turf_decal/siding/blue{
-	dir = 1
-	},
-/turf/open/floor/plasteel/dark,
-/area/ship/hallway/central)
-"SS" = (
-/obj/item/radio/headset/syndicate/alt,
-/obj/item/toy/figure/cargotech,
-/obj/item/clothing/suit/hooded/wintercoat/cargo,
-/obj/item/stack/sheet/cardboard/fifty,
-/obj/item/hand_labeler,
-/obj/item/hand_labeler_refill,
-/obj/item/clothing/under/syndicate/donk,
-/obj/item/clothing/suit/hazardvest/donk,
-/obj/item/stack/wrapping_paper,
-/obj/item/stack/packageWrap,
-/obj/structure/closet/wall{
-	dir = 4;
-	icon_door = "orange_wall";
-	name = "employee closet";
-	pixel_x = -28
-	},
-/turf/open/floor/plasteel/mono/dark,
-/area/ship/engineering)
-"Tj" = (
-/obj/effect/turf_decal/siding/red,
-/obj/machinery/power/apc/auto_name/directional/south,
-/obj/structure/cable{
-	icon_state = "0-4"
-	},
-/obj/machinery/light_switch{
-	dir = 1;
-	pixel_x = 11;
-	pixel_y = -16
-	},
-/turf/open/floor/plasteel/mono/dark,
-/area/ship/crew/canteen)
-"Ty" = (
-/obj/machinery/light/directional/east,
-/obj/structure/closet/crate/large,
-/obj/item/mecha_parts/mecha_equipment/mining_scanner,
-/mob/living/simple_animal/bot/secbot/grievous/toy,
-/obj/effect/decal/cleanable/blood/old,
-/obj/item/hand_labeler_refill,
-/obj/item/mecha_parts/mecha_equipment/hydraulic_clamp,
-/obj/item/mecha_parts/mecha_equipment/rcd,
-/obj/item/mecha_parts/mecha_equipment/cable_layer,
-/turf/open/floor/plasteel/mono/dark,
-/area/ship/storage)
-"TB" = (
-/obj/effect/turf_decal/siding/blue{
-	dir = 8
-	},
-/obj/effect/turf_decal/siding/blue{
-	dir = 4
-	},
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer2,
-/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer4,
-/turf/open/floor/plasteel/dark,
-/area/ship/hallway/central)
-"TJ" = (
-/obj/effect/spawner/structure/window/plasma/reinforced/plastitanium,
-/obj/machinery/door/poddoor/shutters{
-	dir = 4;
-	id = "externalshutters"
-	},
-/turf/open/floor/plating,
-/area/ship/storage)
-"TP" = (
-/obj/structure/rack,
-/obj/effect/turf_decal/corner/opaque/neutral/mono,
-/turf/open/floor/plasteel/mono/dark,
-/area/ship/hallway/central)
-"TY" = (
-/obj/effect/turf_decal/corner/opaque/brown/bordercorner{
-	dir = 1
-	},
-/turf/open/floor/plasteel/mono/dark,
-/area/ship/cargo)
-"Ud" = (
-/obj/effect/turf_decal/siding/blue,
-/turf/open/floor/plasteel/dark,
-/area/ship/hallway/central)
-"Uk" = (
-/turf/closed/wall/mineral/plastitanium,
-/area/ship/storage)
-"Uo" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer2,
-/obj/machinery/atmospherics/components/binary/volume_pump,
-/obj/structure/catwalk/over/plated_catwalk,
-/turf/open/floor/plating,
-/area/ship/engineering)
-"Uu" = (
-/obj/structure/cable{
-	icon_state = "1-2"
-	},
-/obj/machinery/atmospherics/pipe/manifold/supply/hidden/layer4{
-	dir = 1
-	},
-/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer2{
-	dir = 4
-	},
-/turf/open/floor/plasteel/patterned/cargo_one,
-/area/ship/storage)
-"Uw" = (
-/obj/structure/toilet{
-	dir = 4
-	},
-/obj/structure/curtain,
-/obj/machinery/airalarm/directional/south,
-/turf/open/floor/plasteel/patterned,
-/area/ship/crew/dorm)
-"UE" = (
-/turf/open/floor/plating,
-/area/ship/engineering)
-"UI" = (
-/obj/effect/turf_decal/corner/opaque/neutral/mono,
-/turf/open/floor/plasteel/mono/dark,
-/area/ship/crew/canteen)
-"UO" = (
-/obj/machinery/atmospherics/pipe/layer_manifold,
-/turf/closed/wall/mineral/plastitanium/nodiagonal,
-/area/ship/engineering)
-"Va" = (
-/obj/structure/cable{
-	icon_state = "1-8"
-	},
-/obj/structure/cable{
-	icon_state = "1-4"
-	},
-/obj/machinery/atmospherics/pipe/simple/orange/visible{
-	dir = 4
-	},
-/obj/structure/cable{
-	icon_state = "4-8"
-	},
-/obj/machinery/atmospherics/pipe/manifold/supply/hidden/layer4{
-	dir = 8
-	},
-/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer2{
-	dir = 4
-	},
-/obj/structure/catwalk/over/plated_catwalk,
-/turf/open/floor/plating,
-/area/ship/engineering)
-"Vb" = (
-/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer4,
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer2,
-/obj/effect/turf_decal/trimline/opaque/blue/filled/warning,
-/turf/open/floor/plasteel/dark,
-/area/ship/hallway/central)
-"Vi" = (
-/obj/structure/cable{
-	icon_state = "2-4"
-	},
-/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2,
-/obj/effect/turf_decal/industrial/traffic{
-	dir = 8
-	},
-/turf/open/floor/plasteel/dark,
-/area/ship/crew/dorm)
-"Vn" = (
-/obj/effect/decal/cleanable/dirt,
-/obj/effect/decal/cleanable/dirt,
-/obj/effect/turf_decal/corner/opaque/brown/border{
-	dir = 4
-	},
-/turf/open/floor/plasteel/mono/dark,
-/area/ship/cargo)
-"Vs" = (
-/obj/machinery/atmospherics/components/binary/volume_pump,
-/obj/structure/catwalk/over/plated_catwalk,
-/turf/open/floor/plating,
-/area/ship/engineering)
-"VG" = (
-/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer4,
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer2,
-/obj/effect/decal/cleanable/dirt,
-/obj/structure/catwalk/over/plated_catwalk/dark,
-/obj/effect/turf_decal/number/two{
-	dir = 4
-	},
-/turf/open/floor/plating,
-/area/ship/engineering)
-"VR" = (
-/turf/closed/wall/r_wall/syndicate/nodiagonal,
-/area/ship/engineering)
-"VS" = (
-/obj/structure/closet/crate,
-/obj/item/stack/sheet/metal/fifty,
-/obj/item/stack/sheet/glass/fifty,
-/obj/item/stack/sheet/plastitaniumglass{
-	amount = 20
-	},
-/obj/item/stack/sheet/mineral/plastitanium{
-	amount = 20
-	},
-/obj/item/stack/sheet/metal/fifty,
-/obj/item/stack/sheet/glass/fifty,
-/obj/effect/decal/cleanable/dirt,
-/obj/item/hand_labeler_refill,
-/obj/item/stack/sheet/mineral/wood/fifty,
-/turf/open/floor/plasteel/mono/dark,
-/area/ship/storage)
-"Wh" = (
-/obj/structure/cable{
-	icon_state = "1-2"
-	},
-/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer4,
-/obj/effect/turf_decal/trimline/opaque/orange/filled/warning,
-/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer2{
-	dir = 8
-	},
-/turf/open/floor/plasteel/patterned,
-/area/ship/crew/dorm)
-"Wt" = (
-/obj/machinery/smartfridge/bloodbank/preloaded,
-/turf/closed/wall/mineral/plastitanium/nodiagonal,
-/area/ship/storage)
-"WB" = (
-/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer4{
-	dir = 4
-	},
-/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer2,
-/obj/effect/turf_decal/siding/blue{
-	dir = 4
-	},
-/turf/open/floor/plasteel/dark,
-/area/ship/hallway/central)
-"WE" = (
-/turf/closed/wall/mineral/plastitanium/nodiagonal,
-/area/ship/hallway/central)
-"WQ" = (
-/obj/machinery/firealarm/directional/east,
-/obj/machinery/suit_storage_unit/inherit{
-	req_access_txt = "41"
-	},
-/obj/item/clothing/suit/space/syndicate,
-/obj/item/clothing/head/helmet/space/syndicate,
-/obj/item/clothing/mask/breath,
-/turf/open/floor/plasteel/mono/dark,
-/area/ship/engineering)
-"WU" = (
-/obj/effect/turf_decal/siding/blue{
-	dir = 8
-	},
-/obj/effect/turf_decal/siding/blue{
-	dir = 4
-	},
-/obj/machinery/atmospherics/pipe/manifold4w/supply/hidden/layer4,
-/obj/machinery/atmospherics/pipe/manifold4w/scrubbers/hidden/layer2,
-/turf/open/floor/plasteel/dark,
-/area/ship/hallway/central)
-"Xf" = (
-/obj/machinery/power/terminal{
-	dir = 8
-	},
-/obj/machinery/power/terminal{
-	dir = 4
-	},
-/obj/structure/cable/yellow,
-/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer4,
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer2,
-/obj/machinery/door/firedoor/border_only,
-/obj/machinery/door/firedoor/border_only{
-	dir = 1
-	},
-/obj/machinery/navbeacon/wayfinding{
-	codes_txt = "patrol;next_patrol=lux_warehouse";
-	location = "lux_engine"
-	},
-/turf/open/floor/plasteel/tech/techmaint,
-/area/ship/engineering)
-"Xw" = (
-/obj/machinery/washing_machine,
-/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{
-	dir = 8
-	},
-/obj/machinery/light/small/directional/north,
-/turf/open/floor/plasteel/patterned,
-/area/ship/crew/dorm)
-"XM" = (
-/obj/structure/cable{
-	icon_state = "1-4"
-	},
-/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer4{
-	dir = 4
-	},
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer2{
-	dir = 4
-	},
-/obj/effect/decal/cleanable/dirt,
-/obj/machinery/portable_atmospherics/pump,
-/turf/open/floor/plasteel/tech/techmaint,
-/area/ship/engineering)
-"XS" = (
-/obj/machinery/atmospherics/components/unary/shuttle/heater{
-	dir = 1
-	},
-/obj/structure/window/reinforced/spawner,
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer2,
-/obj/machinery/door/poddoor/shutters{
-	id = "externalshutters"
-	},
-/turf/open/floor/plasteel/tech/techmaint,
-/area/ship/engineering)
-"Yd" = (
-/obj/structure/cable{
-	icon_state = "4-8"
-	},
-/obj/machinery/atmospherics/pipe/manifold/orange/visible{
-	dir = 1
-	},
-/obj/effect/decal/cleanable/dirt,
-/obj/structure/catwalk/over/plated_catwalk/white,
-/obj/structure/cable{
-	icon_state = "1-8"
-	},
-/turf/open/floor/plating,
-/area/ship/engineering)
-"Yq" = (
-/obj/machinery/atmospherics/pipe/manifold/supply/hidden/layer4{
-	dir = 8
-	},
-/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer2{
-	dir = 4
-	},
-/obj/effect/turf_decal/siding/blue{
-	dir = 8
-	},
-/obj/effect/turf_decal/siding/blue{
-	dir = 4
-	},
-/turf/open/floor/plasteel/dark,
-/area/ship/hallway/central)
-"YE" = (
-/obj/structure/window/plasma/reinforced,
-/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{
-	dir = 8
-	},
-/obj/item/radio/intercom/directional/east{
-	pixel_y = 37
-	},
-/turf/open/floor/carpet/red_gold,
-/area/ship/hallway/central)
-"YI" = (
-/turf/closed/wall/mineral/plastitanium/nodiagonal,
-/area/ship/crew/canteen)
-"YK" = (
-/obj/machinery/airalarm/directional/west,
-/obj/item/clothing/head/collectable/chef,
-/obj/item/clothing/head/collectable/paper,
-/obj/item/clothing/head/collectable/tophat,
-/obj/item/clothing/head/collectable/captain,
-/obj/item/clothing/head/collectable/beret,
-/obj/item/clothing/head/collectable/welding,
-/obj/item/clothing/head/collectable/flatcap,
-/obj/item/clothing/head/collectable/pirate,
-/obj/item/clothing/head/collectable/kitty,
-/obj/item/clothing/head/collectable/rabbitears,
-/obj/item/clothing/head/collectable/wizard,
-/obj/item/clothing/head/collectable/hardhat,
-/obj/item/clothing/head/collectable/HoS,
-/obj/item/clothing/head/collectable/HoP,
-/obj/item/clothing/head/collectable/thunderdome,
-/obj/item/clothing/head/collectable/swat,
-/obj/item/clothing/head/collectable/slime,
-/obj/item/clothing/head/collectable/police,
-/obj/item/clothing/head/collectable/xenom,
-/obj/item/clothing/head/collectable/petehat,
-/obj/structure/closet/crate,
-/turf/open/floor/plasteel/mono/dark,
-/area/ship/storage)
-"YL" = (
-/obj/structure/chair/plastic{
-	dir = 4
-	},
-/obj/effect/turf_decal/siding/red{
-	dir = 8
-	},
-/obj/effect/turf_decal/corner/opaque/neutral/border{
-	dir = 4
-	},
-/turf/open/floor/plasteel/mono/dark,
-/area/ship/hallway/central)
-"YO" = (
-/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer4{
-	dir = 5
-	},
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer2{
-	dir = 5
-	},
-/turf/open/floor/plasteel/patterned/cargo_one,
-/area/ship/storage)
-"YZ" = (
-/obj/structure/closet/secure{
-	icon_state = "eng_secure";
-	name = "GEC Engineer's locker"
-	},
-/obj/item/clothing/gloves/color/yellow,
-/obj/item/pipe_dispenser,
-/obj/item/clothing/glasses/meson/engine,
-/obj/item/clothing/suit/toggle/hazard,
-/obj/item/clothing/head/beret/eng/hazard,
-/obj/item/clothing/head/beret/eng,
-/obj/item/holosign_creator/engineering,
-/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer4{
-	dir = 4
-	},
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer2{
-	dir = 8
-	},
-/obj/item/clothing/under/syndicate/gec,
-/obj/item/clothing/under/syndicate/gec,
-/obj/item/stack/tape/industrial/pro,
-/obj/machinery/power/apc/auto_name/directional/north,
-/obj/structure/cable{
-	icon_state = "0-2"
-	},
-/obj/machinery/light_switch{
-	pixel_y = 23;
-	pixel_x = 11
-	},
-/turf/open/floor/plasteel/tech/techmaint,
-/area/ship/engineering)
-"Zm" = (
-/obj/structure/cable{
-	icon_state = "4-8"
-	},
-/obj/machinery/atmospherics/pipe/manifold/orange/visible{
-	dir = 1
-	},
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer2{
-	dir = 9
-	},
-/obj/structure/catwalk/over/plated_catwalk,
-/turf/open/floor/plating,
-/area/ship/engineering)
-"ZV" = (
-/obj/structure/cable{
-	icon_state = "1-4"
-	},
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer2{
-	dir = 5
-	},
-/obj/structure/catwalk/over/plated_catwalk,
-/obj/machinery/atmospherics/components/unary/portables_connector{
-	dir = 8
-	},
-/turf/open/floor/plating,
-/area/ship/engineering)
-
-(1,1,1) = {"
-Nr
-Nr
-Nr
-Nr
-Nr
-Nr
-Nr
-Nr
-Nr
-GD
-Nr
-Nr
-Nr
-Nr
-Nr
-Nr
-Nr
-Nr
-Nr
-Nr
-Nr
-Nr
-Nr
-Nr
-Nr
-Nr
-Nr
-"}
-(2,1,1) = {"
-Nr
-Nr
-Nr
-Nr
-Nr
-Nr
-hs
-HG
-JT
-JT
-JT
-it
-Ka
-Nr
-Nr
-Nr
-Nr
-Nr
-Nr
-Nr
-Nr
-Nr
-Nr
-Nr
-Nr
-Nr
-Nr
-"}
-(3,1,1) = {"
-Nr
-Nr
-Nr
-Nr
-Bw
-MT
-hs
-OY
-hX
-hX
-fB
-Ps
-Ka
-TJ
-TJ
-Uk
-Nr
-Nr
-Nr
-Nr
-pt
-VR
-pt
-Nr
-Nr
-Nr
-Nr
-"}
-(4,1,1) = {"
-Nr
-Nr
-Nr
-Bw
-hs
-Mz
-qh
-JV
-AL
-hi
-CC
-RM
-vb
-VS
-qV
-Wt
-TJ
-Uk
-Nr
-Uk
-VR
-qe
-VR
-pt
-Nr
-Nr
-Nr
-"}
-(5,1,1) = {"
-Nr
-Nr
-hs
-hs
-bB
-TY
-CC
-OR
-gf
-Je
-wP
-fy
-lQ
-QU
-kI
-iF
-vT
-Ka
-TJ
-Ka
-VR
-qR
-jK
-VR
-Nr
-Nr
-Nr
-"}
-(6,1,1) = {"
-Nr
-Nr
-RH
-sV
-yh
-BZ
-Vn
-Ee
-EG
-hu
-uX
-JU
-Ka
-JO
-iO
-Fj
-YO
-YK
-ks
-On
-vp
-rV
-LU
-VR
-pt
-Nr
-Nr
-"}
-(7,1,1) = {"
-Nr
-Nr
-hs
-hs
-hs
-ga
-ug
-Mi
-tV
-hs
-hs
-hs
-Ka
-Ka
-Ty
-Ko
-Uu
-lg
-hm
-rU
-Ro
-uo
-ZV
-mK
-vp
-pt
-Nr
-"}
-(8,1,1) = {"
-Nr
-Nr
-Nr
-WE
-WE
-La
-aB
-NJ
-Ud
-TP
-Rk
-PW
-cI
-Ka
-Ka
-KX
-LY
-cq
-pd
-ke
-vp
-dC
-GG
-Uo
-XS
-iR
-hd
-"}
-(9,1,1) = {"
-tU
-WE
-kZ
-WE
-QG
-NH
-wd
-WB
-tO
-Iv
-Iv
-Iv
-yf
-DG
-Ka
-Ka
-Ka
-Ka
-Ka
-Ka
-vp
-gj
-Zm
-Vs
-vz
-sh
-Nr
-"}
-(10,1,1) = {"
-WE
-WE
-Ej
-bi
-QQ
-xa
-dp
-bV
-Sn
-TP
-TP
-jv
-pL
-Mx
-vp
-fo
-SS
-EZ
-mm
-tx
-pR
-XM
-ql
-pJ
-vp
-vp
-vp
-"}
-(11,1,1) = {"
-Ij
-Ga
-dA
-jr
-MU
-rh
-TB
-WU
-yX
-gC
-gC
-Yq
-Jq
-Vb
-dL
-VG
-Ph
-DJ
-mE
-yQ
-Xf
-CM
-Va
-dM
-AE
-Mj
-qP
-"}
-(12,1,1) = {"
-WE
-WE
-jH
-fv
-YE
-xa
-dp
-dH
-Sn
-TP
-TP
-DE
-Jr
-PO
-vp
-WQ
-xt
-cB
-Ip
-ul
-pR
-lb
-Gr
-eD
-na
-UO
-Er
-"}
-(13,1,1) = {"
-vw
-WE
-kZ
-WE
-QT
-bp
-Oz
-vf
-lK
-ym
-cs
-eX
-CI
-DG
-EO
-EO
-EO
-EO
-EO
-EO
-vp
-CW
-lW
-lt
-vz
-sh
-Nr
-"}
-(14,1,1) = {"
-Nr
-Nr
-Nr
-WE
-WE
-YL
-YL
-qO
-xc
-tH
-IT
-HK
-zc
-EO
-EO
-BX
-if
-EO
-Kg
-Uw
-vp
-YZ
-Yd
-lt
-vz
-sh
-UE
-"}
-(15,1,1) = {"
-Nr
-Nr
-YI
-YI
-YI
-qf
-HZ
-Lr
-Dw
-rq
-YI
-EO
-EO
-EO
-nz
-Vi
-sI
-Ai
-FV
-Wh
-eL
-iZ
-bt
-CT
-vp
-pt
-Nr
-"}
-(16,1,1) = {"
-Nr
-Nr
-ow
-YI
-yd
-UI
-UI
-Fq
-UI
-Tj
-YI
-Ji
-NQ
-BM
-zW
-bN
-aK
-Pb
-Xw
-eF
-vp
-uK
-wT
-VR
-pt
-Nr
-Nr
-"}
-(17,1,1) = {"
-Nr
-Nr
-Bt
-YI
-wN
-UI
-rG
-Mg
-Dq
-CV
-Da
-cb
-aD
-Id
-rm
-xw
-KH
-EO
-mi
-EO
-VR
-EW
-Kk
-VR
-Nr
-Nr
-Nr
-"}
-(18,1,1) = {"
-Nr
-Nr
-Nr
-Bt
-YI
-uB
-kE
-sF
-UI
-KZ
-YI
-Rp
-DW
-Oq
-Lu
-EO
-mi
-Hx
-Nr
-Hx
-VR
-sk
-VR
-pt
-Nr
-Nr
-Nr
-"}
-(19,1,1) = {"
-Nr
-Nr
-Nr
-Nr
-Bt
-Op
-YI
-fn
-LV
-DA
-YI
-tF
-EO
-mi
-mi
-Hx
-Nr
-Nr
-Nr
-Nr
-pt
-VR
-pt
-Nr
-Nr
-Nr
-Nr
-"}
-(20,1,1) = {"
-Nr
-Nr
-Nr
-Nr
-Nr
-Nr
-YI
-YI
-Op
-YI
-YI
-EO
-EO
-Nr
-Nr
-Nr
-Nr
-Nr
-Nr
-Nr
-Nr
-Nr
-Nr
-Nr
-Nr
-Nr
-Nr
-"}

From d5046c58fae00768de81c548caa533eb01b71024 Mon Sep 17 00:00:00 2001
From: FalloutFalcon <falloutfalconplays@gmail.com>
Date: Wed, 3 Apr 2024 22:39:27 -0500
Subject: [PATCH 69/89] more lol

---
 code/__DEFINES/DNA.dm                         |   1 -
 code/datums/components/fantasy/suffixes.dm    |   4 -
 code/datums/dna.dm                            |   2 -
 code/datums/mutations/actions.dm              |  61 --
 code/game/objects/items/dna_injector.dm       |   5 -
 .../structures/icemoon/cave_entrance.dm       |   1 -
 code/modules/admin/verbs/randomverbs.dm       |   2 -
 code/modules/events/wizard/magicarp.dm        |  75 --
 .../human/species_types/lizardpeople.dm       |   1 -
 .../projectiles/ammunition/special/magic.dm   |  55 --
 code/modules/projectiles/projectile/magic.dm  | 665 ------------------
 code/modules/research/experimentor.dm         |  10 -
 .../ruins/icemoonruin_code/hotsprings.dm      |  56 --
 code/modules/shuttle/special.dm               | 129 ----
 code/modules/spells/spell_types/aimed.dm      |   6 +-
 code/modules/spells/spell_types/devil.dm      |   2 +-
 code/modules/spells/spell_types/shapeshift.dm |   1 -
 code/modules/uplink/uplink_items.dm           |   7 -
 shiptest.dme                                  |   2 -
 19 files changed, 4 insertions(+), 1081 deletions(-)
 delete mode 100644 code/modules/events/wizard/magicarp.dm
 delete mode 100644 code/modules/ruins/icemoonruin_code/hotsprings.dm

diff --git a/code/__DEFINES/DNA.dm b/code/__DEFINES/DNA.dm
index 204e24daeab6..ac150af5505a 100644
--- a/code/__DEFINES/DNA.dm
+++ b/code/__DEFINES/DNA.dm
@@ -31,7 +31,6 @@
 #define GLOWY /datum/mutation/human/glow
 #define ANTIGLOWY /datum/mutation/human/glow/anti
 #define TELEPATHY /datum/mutation/human/telepathy
-#define FIREBREATH /datum/mutation/human/firebreath
 #define VOID /datum/mutation/human/void
 #define TONGUESPIKE /datum/mutation/human/tonguespike
 #define TONGUESPIKECHEM /datum/mutation/human/tongue_spike/chem
diff --git a/code/datums/components/fantasy/suffixes.dm b/code/datums/components/fantasy/suffixes.dm
index ec1ee58735f9..8cabee42d21c 100644
--- a/code/datums/components/fantasy/suffixes.dm
+++ b/code/datums/components/fantasy/suffixes.dm
@@ -131,11 +131,7 @@
 		/obj/projectile/bullet/honker = 15,
 		/obj/projectile/temp = 15,
 		/obj/projectile/ion = 15,
-		/obj/projectile/magic/door = 15,
-		/obj/projectile/magic/locker = 15,
-		/obj/projectile/magic/fetch = 15,
 		/obj/projectile/beam/emitter = 15,
-		/obj/projectile/magic/flying = 15,
 		/obj/projectile/energy/net = 15,
 		/obj/projectile/bullet/incendiary/c9mm = 15,
 		/obj/projectile/temp/hot = 15,
diff --git a/code/datums/dna.dm b/code/datums/dna.dm
index dde90dd5dbe8..abd20fd29212 100644
--- a/code/datums/dna.dm
+++ b/code/datums/dna.dm
@@ -659,8 +659,6 @@
 					O.Remove(src)
 					visible_message("<span class='danger'>[src] vomits up their [O.name]!</span>", "<span class='danger'>You vomit up your [O.name]</span>") //no "vomit up your the heart"
 					O.forceMove(drop_location())
-					if(prob(20))
-						O.animate_atom_living()
 			if(9 to 10)
 				ForceContractDisease(new/datum/disease/gastrolosis())
 				to_chat(src, "<span class='notice'>Oh, I actually feel quite alright!</span>")
diff --git a/code/datums/mutations/actions.dm b/code/datums/mutations/actions.dm
index f2ffe7c25fd2..53080247b827 100644
--- a/code/datums/mutations/actions.dm
+++ b/code/datums/mutations/actions.dm
@@ -88,67 +88,6 @@
 	if(direction_text)
 		to_chat(user,"<span class='notice'>You consider [tracking_target]'s scent. The trail leads <b>[direction_text].</b></span>")
 
-/datum/mutation/human/firebreath
-	name = "Fire Breath"
-	desc = "An ancient mutation that gives lizards breath of fire."
-	quality = POSITIVE
-	difficulty = 12
-	locked = TRUE
-	text_gain_indication = "<span class='notice'>Your throat is burning!</span>"
-	text_lose_indication = "<span class='notice'>Your throat is cooling down.</span>"
-	power = /obj/effect/proc_holder/spell/aimed/firebreath
-	instability = 30
-	energy_coeff = 1
-	power_coeff = 1
-
-/datum/mutation/human/firebreath/modify()
-	if(power)
-		var/obj/effect/proc_holder/spell/aimed/firebreath/S = power
-		S.strength = GET_MUTATION_POWER(src)
-
-/obj/effect/proc_holder/spell/aimed/firebreath
-	name = "Fire Breath"
-	desc = "You can breathe fire at a target."
-	school = "evocation"
-	charge_max = 600
-	clothes_req = FALSE
-	range = 20
-	projectile_type = /obj/projectile/magic/aoe/fireball/firebreath
-	base_icon_state = "fireball"
-	action_icon_state = "fireball0"
-	sound = 'sound/magic/demon_dies.ogg' //horrifying lizard noises
-	active_msg = "You built up heat in your mouth."
-	deactive_msg = "You swallow the flame."
-	var/strength = 1
-
-/obj/effect/proc_holder/spell/aimed/firebreath/before_cast(list/targets)
-	. = ..()
-	if(iscarbon(usr))
-		var/mob/living/carbon/C = usr
-		if(C.is_mouth_covered())
-			C.adjust_fire_stacks(2)
-			C.IgniteMob()
-			to_chat(C,"<span class='warning'>Something in front of your mouth caught fire!</span>")
-			return FALSE
-
-/obj/effect/proc_holder/spell/aimed/firebreath/ready_projectile(obj/projectile/P, atom/target, mob/user, iteration)
-	if(!istype(P, /obj/projectile/magic/aoe/fireball))
-		return
-	var/obj/projectile/magic/aoe/fireball/F = P
-	switch(strength)
-		if(1 to 3)
-			F.exp_light = strength-1
-		if(4 to INFINITY)
-			F.exp_heavy = strength-3
-	F.exp_fire += strength
-
-/obj/projectile/magic/aoe/fireball/firebreath
-	name = "fire breath"
-	exp_heavy = 0
-	exp_light = 0
-	exp_flash = 0
-	exp_fire= 4
-
 /datum/mutation/human/void
 	name = "Void Magnet"
 	desc = "A rare genome that attracts odd forces not usually observed."
diff --git a/code/game/objects/items/dna_injector.dm b/code/game/objects/items/dna_injector.dm
index 34563d5e649c..e44c7ca7b12b 100644
--- a/code/game/objects/items/dna_injector.dm
+++ b/code/game/objects/items/dna_injector.dm
@@ -90,11 +90,6 @@
 	desc = "This will make you big and strong, but give you a bad skin condition."
 	add_mutations = list(HULK)
 
-/obj/item/dnainjector/firebreath
-	name = "\improper DNA injector (Fire Breath)"
-	desc = "Restores the dragon ancestry."
-	add_mutations = list(FIREBREATH)
-
 /obj/item/dnainjector/xraymut
 	name = "\improper DNA injector (X-ray)"
 	desc = "Finally you can see what the Captain does."
diff --git a/code/game/objects/structures/icemoon/cave_entrance.dm b/code/game/objects/structures/icemoon/cave_entrance.dm
index 07ecef04afac..5b77da4aafc7 100644
--- a/code/game/objects/structures/icemoon/cave_entrance.dm
+++ b/code/game/objects/structures/icemoon/cave_entrance.dm
@@ -1047,7 +1047,6 @@ GLOBAL_LIST_INIT(ore_probability, list(
 			if(prob(45))
 				new /obj/item/dnainjector/dwarf(loc)
 			if(prob(35))
-				new /obj/item/dnainjector/firebreath(loc)
 				new /mob/living/simple_animal/hostile/gorilla(loc)
 			if(prob(35))
 				new /mob/living/simple_animal/hostile/gorilla(loc)
diff --git a/code/modules/admin/verbs/randomverbs.dm b/code/modules/admin/verbs/randomverbs.dm
index ae621e17d479..c6b62604a92c 100644
--- a/code/modules/admin/verbs/randomverbs.dm
+++ b/code/modules/admin/verbs/randomverbs.dm
@@ -735,8 +735,6 @@
 		M.audible_message("<span class='hear'>...wabbajack...wabbajack...</span>")
 		playsound(M.loc, 'sound/magic/staff_change.ogg', 50, TRUE, -1)
 
-		wabbajack(M)
-
 	message_admins("Mass polymorph started by [who_did_it] is complete.")
 
 
diff --git a/code/modules/events/wizard/magicarp.dm b/code/modules/events/wizard/magicarp.dm
deleted file mode 100644
index 2546b1ebbb18..000000000000
--- a/code/modules/events/wizard/magicarp.dm
+++ /dev/null
@@ -1,75 +0,0 @@
-/datum/round_event_control/wizard/magicarp //these fish is loaded
-	name = "Magicarp"
-	weight = 1
-	typepath = /datum/round_event/wizard/magicarp
-	max_occurrences = 1
-	earliest_start = 0 MINUTES
-
-/datum/round_event/wizard/magicarp
-	announceWhen	= 3
-	startWhen = 50
-
-/datum/round_event/wizard/magicarp/setup()
-	startWhen = rand(40, 60)
-
-/datum/round_event/wizard/magicarp/announce(fake)
-	priority_announce("Unknown magical entities have been detected near [station_name()], please stand-by.", "Lifesign Alert")
-
-/datum/round_event/wizard/magicarp/start()
-	for(var/obj/effect/landmark/carpspawn/C in GLOB.landmarks_list)
-		if(prob(5))
-			new /mob/living/simple_animal/hostile/carp/ranged/chaos(C.loc)
-		else
-			new /mob/living/simple_animal/hostile/carp/ranged(C.loc)
-
-/mob/living/simple_animal/hostile/carp/ranged
-	name = "magicarp"
-	desc = "50% magic, 50% carp, 100% horrible."
-	icon_state = "magicarp"
-	icon_living = "magicarp"
-	icon_dead = "magicarp_dead"
-	icon_gib = "magicarp_gib"
-	ranged = 1
-	retreat_distance = 2
-	minimum_distance = 0 //Between shots they can and will close in to nash
-	projectiletype = /obj/projectile/magic
-	projectilesound = 'sound/weapons/emitter.ogg'
-	maxHealth = 50
-	health = 50
-	gold_core_spawnable = NO_SPAWN
-	random_color = FALSE
-	food_type = list()
-	tame_chance = 0
-	bonus_tame_chance = 0
-	var/allowed_projectile_types = list(/obj/projectile/magic/change, /obj/projectile/magic/animate,
-	/obj/projectile/magic/teleport, /obj/projectile/magic/door, /obj/projectile/magic/aoe/fireball,
-	/obj/projectile/magic/spellblade, /obj/projectile/magic/arcane_barrage)
-
-/mob/living/simple_animal/hostile/carp/ranged/Initialize()
-	projectiletype = pick(allowed_projectile_types)
-	. = ..()
-
-/mob/living/simple_animal/hostile/carp/ranged/chaos
-	name = "chaos magicarp"
-	desc = "50% carp, 100% magic, 150% horrible."
-	color = "#00FFFF"
-	maxHealth = 75
-	health = 75
-	gold_core_spawnable = NO_SPAWN
-
-/mob/living/simple_animal/hostile/carp/ranged/chaos/Shoot()
-	projectiletype = pick(allowed_projectile_types)
-	..()
-
-/mob/living/simple_animal/hostile/carp/ranged/xenobiology // these are for the xenobio gold slime pool
-	gold_core_spawnable = HOSTILE_SPAWN
-	allowed_projectile_types = list(/obj/projectile/magic/animate, /obj/projectile/magic/teleport,
-	/obj/projectile/magic/door, /obj/projectile/magic/aoe/fireball, /obj/projectile/magic/spellblade, /obj/projectile/magic/arcane_barrage,
-	/obj/projectile/magic/spell/magic_missile, /obj/projectile/magic/aoe/lightning,  /obj/projectile/magic/locker) //thanks Lett1 /finally, we can synthesize the lockerfish
-
-/mob/living/simple_animal/hostile/carp/ranged/chaos/xenobiology
-	gold_core_spawnable = HOSTILE_SPAWN
-	allowed_projectile_types = list(/obj/projectile/magic/change, /obj/projectile/magic/animate,
-	/obj/projectile/magic/teleport, /obj/projectile/magic/door, /obj/projectile/magic/aoe/fireball,
-	/obj/projectile/magic/spellblade, /obj/projectile/magic/arcane_barrage, /obj/projectile/magic/locker, /obj/projectile/magic/nothing,
-	/obj/projectile/magic/aoe/lightning, /obj/projectile/magic/necropotence, /obj/projectile/magic/fortify, /obj/projectile/magic/spell/magic_missile)//now THIS is chaos
diff --git a/code/modules/mob/living/carbon/human/species_types/lizardpeople.dm b/code/modules/mob/living/carbon/human/species_types/lizardpeople.dm
index 141efed98e12..11f66ad36815 100644
--- a/code/modules/mob/living/carbon/human/species_types/lizardpeople.dm
+++ b/code/modules/mob/living/carbon/human/species_types/lizardpeople.dm
@@ -20,7 +20,6 @@
 	exotic_bloodtype = "L"
 	disliked_food = GRAIN | DAIRY | CLOTH | GROSS
 	liked_food = GORE | MEAT
-	inert_mutation = FIREBREATH
 	deathsound = 'sound/voice/lizard/deathsound.ogg'
 	wings_icons = list("Dragon")
 	species_language_holder = /datum/language_holder/lizard
diff --git a/code/modules/projectiles/ammunition/special/magic.dm b/code/modules/projectiles/ammunition/special/magic.dm
index 8459e5b93e9c..046ae7dbc078 100644
--- a/code/modules/projectiles/ammunition/special/magic.dm
+++ b/code/modules/projectiles/ammunition/special/magic.dm
@@ -4,58 +4,3 @@
 	projectile_type = /obj/projectile/magic
 	firing_effect_type = /obj/effect/temp_visual/dir_setting/firing_effect/magic
 	heavy_metal = FALSE
-
-/obj/item/ammo_casing/magic/change
-	projectile_type = /obj/projectile/magic/change
-
-/obj/item/ammo_casing/magic/animate
-	projectile_type = /obj/projectile/magic/animate
-
-/obj/item/ammo_casing/magic/teleport
-	projectile_type = /obj/projectile/magic/teleport
-	harmful = FALSE
-
-/obj/item/ammo_casing/magic/safety
-	projectile_type = /obj/projectile/magic/safety
-	harmful = FALSE
-
-/obj/item/ammo_casing/magic/door
-	projectile_type = /obj/projectile/magic/door
-	harmful = FALSE
-
-/obj/item/ammo_casing/magic/fireball
-	projectile_type = /obj/projectile/magic/aoe/fireball
-
-/obj/item/ammo_casing/magic/chaos
-	projectile_type = /obj/projectile/magic
-
-/obj/item/ammo_casing/magic/spellblade
-	projectile_type = /obj/projectile/magic/spellblade
-
-/obj/item/ammo_casing/magic/honk
-	projectile_type = /obj/projectile/bullet/honker
-
-/obj/item/ammo_casing/magic/locker
-	projectile_type = /obj/projectile/magic/locker
-
-/obj/item/ammo_casing/magic/flying
-	projectile_type = /obj/projectile/magic/flying
-
-/obj/item/ammo_casing/magic/bounty
-	projectile_type = /obj/projectile/magic/bounty
-
-/obj/item/ammo_casing/magic/antimagic
-	projectile_type = /obj/projectile/magic/antimagic
-
-/obj/item/ammo_casing/magic/sapping
-	projectile_type = /obj/projectile/magic/sapping
-
-/obj/item/ammo_casing/magic/necropotence
-	projectile_type = /obj/projectile/magic/necropotence
-
-/obj/item/ammo_casing/magic/wipe
-	projectile_type = /obj/projectile/magic/wipe
-
-/obj/item/ammo_casing/magic/nothing
-	projectile_type = /obj/projectile/magic/nothing
-	harmful = FALSE
diff --git a/code/modules/projectiles/projectile/magic.dm b/code/modules/projectiles/projectile/magic.dm
index 544e2cc95005..67a91efa0f61 100644
--- a/code/modules/projectiles/projectile/magic.dm
+++ b/code/modules/projectiles/projectile/magic.dm
@@ -7,579 +7,6 @@
 	armour_penetration = 100
 	flag = "magic"
 
-/obj/projectile/magic/teleport
-	name = "bolt of teleportation"
-	icon_state = "bluespace"
-	damage = 0
-	damage_type = OXY
-	nodamage = TRUE
-	var/inner_tele_radius = 0
-	var/outer_tele_radius = 6
-
-/obj/projectile/magic/teleport/on_hit(mob/target)
-	. = ..()
-	if(ismob(target))
-		var/mob/M = target
-		if(M.anti_magic_check())
-			M.visible_message("<span class='warning'>[src] fizzles on contact with [target]!</span>")
-			return BULLET_ACT_BLOCK
-	var/teleammount = 0
-	var/teleloc = target
-	if(!isturf(target))
-		teleloc = target.loc
-	for(var/atom/movable/stuff in teleloc)
-		if(!stuff.anchored && stuff.loc && !isobserver(stuff))
-			if(do_teleport(stuff, stuff, 10, channel = TELEPORT_CHANNEL_MAGIC))
-				teleammount++
-				var/datum/effect_system/smoke_spread/smoke = new
-				smoke.set_up(max(round(4 - teleammount),0), stuff.loc) //Smoke drops off if a lot of stuff is moved for the sake of sanity
-				smoke.start()
-
-/obj/projectile/magic/safety
-	name = "bolt of safety"
-	icon_state = "bluespace"
-	damage = 0
-	damage_type = OXY
-	nodamage = TRUE
-
-/obj/projectile/magic/safety/on_hit(atom/target)
-	. = ..()
-	if(ismob(target))
-		var/mob/M = target
-		if(M.anti_magic_check())
-			M.visible_message("<span class='warning'>[src] fizzles on contact with [target]!</span>")
-			return BULLET_ACT_BLOCK
-	if(isturf(target))
-		return BULLET_ACT_HIT
-
-	var/turf/origin_turf = get_turf(target)
-	var/turf/destination_turf = find_safe_turf()
-
-	if(do_teleport(target, destination_turf, channel=TELEPORT_CHANNEL_MAGIC))
-		for(var/t in list(origin_turf, destination_turf))
-			var/datum/effect_system/smoke_spread/smoke = new
-			smoke.set_up(0, t)
-			smoke.start()
-
-/obj/projectile/magic/door
-	name = "bolt of door creation"
-	icon_state = "energy"
-	damage = 0
-	damage_type = OXY
-	nodamage = TRUE
-	var/list/door_types = list(/obj/structure/mineral_door/wood, /obj/structure/mineral_door/iron, /obj/structure/mineral_door/silver, /obj/structure/mineral_door/gold, /obj/structure/mineral_door/uranium, /obj/structure/mineral_door/sandstone, /obj/structure/mineral_door/transparent/plasma, /obj/structure/mineral_door/transparent/diamond)
-
-/obj/projectile/magic/door/on_hit(atom/target)
-	. = ..()
-	if(istype(target, /obj/machinery/door))
-		OpenDoor(target)
-	else
-		var/turf/T = get_turf(target)
-		if(isclosedturf(T) && !isindestructiblewall(T))
-			CreateDoor(T)
-
-/obj/projectile/magic/door/proc/CreateDoor(turf/T)
-	var/door_type = pick(door_types)
-	var/obj/structure/mineral_door/D = new door_type(T)
-	T.ChangeTurf(/turf/open/floor/plating, flags = CHANGETURF_INHERIT_AIR)
-	D.Open()
-
-/obj/projectile/magic/door/proc/OpenDoor(obj/machinery/door/D)
-	if(istype(D, /obj/machinery/door/airlock))
-		var/obj/machinery/door/airlock/A = D
-		A.locked = FALSE
-	D.open()
-
-/obj/projectile/magic/change
-	name = "bolt of change"
-	icon_state = "ice_1"
-	damage = 0
-	damage_type = BURN
-	nodamage = TRUE
-
-/obj/projectile/magic/change/on_hit(atom/change)
-	. = ..()
-	if(ismob(change))
-		var/mob/M = change
-		if(M.anti_magic_check())
-			M.visible_message("<span class='warning'>[src] fizzles on contact with [M]!</span>")
-			qdel(src)
-			return BULLET_ACT_BLOCK
-	wabbajack(change)
-	qdel(src)
-
-/proc/wabbajack(mob/living/M)
-	if(!istype(M) || M.stat == DEAD || M.notransform || (GODMODE & M.status_flags))
-		return
-
-	M.notransform = TRUE
-	ADD_TRAIT(M, TRAIT_IMMOBILIZED, MAGIC_TRAIT)
-	ADD_TRAIT(M, TRAIT_HANDS_BLOCKED, MAGIC_TRAIT)
-	M.icon = null
-	M.cut_overlays()
-	M.invisibility = INVISIBILITY_ABSTRACT
-
-	var/list/contents = M.contents.Copy()
-
-	if(iscyborg(M))
-		var/mob/living/silicon/robot/Robot = M
-		// Disconnect AI's in shells
-		if(Robot.connected_ai)
-			Robot.connected_ai.disconnect_shell()
-		if(Robot.mmi)
-			qdel(Robot.mmi)
-		Robot.notify_ai(NEW_BORG)
-	else
-		for(var/obj/item/W in contents)
-			if(!M.dropItemToGround(W))
-				qdel(W)
-
-	var/mob/living/new_mob
-
-	var/randomize = pick("monkey","robot","slime","xeno","humanoid","animal")
-	switch(randomize)
-		if("monkey")
-			new_mob = new /mob/living/carbon/monkey(M.loc)
-
-		if("robot")
-			var/robot = pick(200;/mob/living/silicon/robot,
-							/mob/living/silicon/robot/modules/syndicate,
-							/mob/living/silicon/robot/modules/syndicate/medical,
-							/mob/living/silicon/robot/modules/syndicate/saboteur,
-							200;/mob/living/simple_animal/drone/polymorphed)
-			new_mob = new robot(M.loc)
-			if(issilicon(new_mob))
-				new_mob.gender = M.gender
-				new_mob.invisibility = 0
-				new_mob.job = "Cyborg"
-				var/mob/living/silicon/robot/Robot = new_mob
-				Robot.lawupdate = FALSE
-				Robot.connected_ai = null
-				Robot.mmi.transfer_identity(M)	//Does not transfer key/client.
-				Robot.clear_inherent_laws(0)
-				Robot.clear_zeroth_law(0)
-
-		if("slime")
-			new_mob = new /mob/living/simple_animal/slime/random(M.loc)
-
-		if("xeno")
-			var/Xe
-			if(M.ckey)
-				Xe = pick(/mob/living/carbon/alien/humanoid/hunter,/mob/living/carbon/alien/humanoid/sentinel)
-			else
-				Xe = pick(/mob/living/carbon/alien/humanoid/hunter,/mob/living/simple_animal/hostile/alien/sentinel)
-			new_mob = new Xe(M.loc)
-
-		if("animal")
-			var/path = pick(/mob/living/simple_animal/hostile/carp,
-							/mob/living/simple_animal/hostile/bear,
-							/mob/living/simple_animal/hostile/mushroom,
-							/mob/living/simple_animal/hostile/statue,
-							/mob/living/simple_animal/hostile/retaliate/bat,
-							/mob/living/simple_animal/hostile/retaliate/goat,
-							/mob/living/simple_animal/hostile/killertomato,
-							/mob/living/simple_animal/hostile/poison/giant_spider,
-							/mob/living/simple_animal/hostile/poison/giant_spider/hunter,
-							/mob/living/simple_animal/hostile/blob/blobbernaut/independent,
-							/mob/living/simple_animal/hostile/carp/ranged,
-							/mob/living/simple_animal/hostile/carp/ranged/chaos,
-							/mob/living/simple_animal/hostile/asteroid/basilisk/watcher,
-							/mob/living/simple_animal/hostile/asteroid/goliath/beast,
-							/mob/living/simple_animal/hostile/headcrab,
-							/mob/living/simple_animal/hostile/morph,
-							/mob/living/simple_animal/hostile/stickman,
-							/mob/living/simple_animal/hostile/stickman/dog,
-							/mob/living/simple_animal/hostile/megafauna/dragon/lesser,
-							/mob/living/simple_animal/hostile/gorilla,
-							/mob/living/simple_animal/parrot,
-							/mob/living/simple_animal/pet/dog/corgi,
-							/mob/living/simple_animal/crab,
-							/mob/living/simple_animal/pet/dog/pug,
-							/mob/living/simple_animal/pet/cat,
-							/mob/living/simple_animal/mouse,
-							/mob/living/simple_animal/chicken,
-							/mob/living/simple_animal/cow,
-							/mob/living/simple_animal/hostile/lizard,
-							/mob/living/simple_animal/pet/fox,
-							/mob/living/simple_animal/butterfly,
-							/mob/living/simple_animal/pet/cat/cak,
-							/mob/living/simple_animal/chick)
-			new_mob = new path(M.loc)
-
-		if("humanoid")
-			new_mob = new /mob/living/carbon/human(M.loc)
-
-			if(prob(50))
-				var/list/chooseable_races = list()
-				for(var/speciestype in subtypesof(/datum/species))
-					var/datum/species/S = speciestype
-					if(initial(S.changesource_flags) & WABBAJACK)
-						chooseable_races += speciestype
-
-				if(chooseable_races.len)
-					new_mob.set_species(pick(chooseable_races))
-
-			var/datum/preferences/A = new()	//Randomize appearance for the human
-			A.copy_to(new_mob, icon_updates=0)
-
-			var/mob/living/carbon/human/H = new_mob
-			H.update_hair()
-			H.update_body_parts(TRUE)
-			H.dna.update_dna_identity()
-
-	if(!new_mob)
-		return
-
-	// Some forms can still wear some items
-	for(var/obj/item/W in contents)
-		new_mob.equip_to_appropriate_slot(W)
-
-	M.log_message("became [new_mob.real_name]", LOG_ATTACK, color="orange")
-
-	new_mob.a_intent = INTENT_HARM
-
-	M.wabbajack_act(new_mob)
-
-	to_chat(new_mob, "<span class='warning'>Your form morphs into that of a [randomize].</span>")
-
-	var/poly_msg = get_policy(POLICY_POLYMORPH)
-	if(poly_msg)
-		to_chat(new_mob, poly_msg)
-
-	M.transfer_observers_to(new_mob)
-
-	qdel(M)
-	return new_mob
-
-/obj/projectile/magic/animate
-	name = "bolt of animation"
-	icon_state = "red_1"
-	damage = 0
-	damage_type = BURN
-	nodamage = TRUE
-
-/obj/projectile/magic/animate/on_hit(atom/target, blocked = FALSE)
-	target.animate_atom_living(firer)
-	..()
-
-/atom/proc/animate_atom_living(mob/living/owner = null)
-	if((isitem(src) || isstructure(src)) && !is_type_in_list(src, GLOB.protected_objects))
-		if(istype(src, /obj/structure/statue/petrified))
-			var/obj/structure/statue/petrified/P = src
-			if(P.petrified_mob)
-				var/mob/living/L = P.petrified_mob
-				var/mob/living/simple_animal/hostile/statue/S = new(P.loc, owner)
-				S.name = "statue of [L.name]"
-				if(owner)
-					S.faction = list("[REF(owner)]")
-				S.icon = P.icon
-				S.icon_state = P.icon_state
-				S.copy_overlays(P, TRUE)
-				S.color = P.color
-				S.atom_colours = P.atom_colours.Copy()
-				if(L.mind)
-					L.mind.transfer_to(S)
-					if(owner)
-						to_chat(S, "<span class='userdanger'>You are an animate statue. You cannot move when monitored, but are nearly invincible and deadly when unobserved! Do not harm [owner], your creator.</span>")
-				P.forceMove(S)
-				return
-		else
-			var/obj/O = src
-			if(istype(O, /obj/item/gun))
-				new /mob/living/simple_animal/hostile/mimic/copy/ranged(loc, src, owner)
-			else
-				new /mob/living/simple_animal/hostile/mimic/copy(loc, src, owner)
-
-	else if(istype(src, /mob/living/simple_animal/hostile/mimic/copy))
-		// Change our allegiance!
-		var/mob/living/simple_animal/hostile/mimic/copy/C = src
-		if(owner)
-			C.ChangeOwner(owner)
-
-/obj/projectile/magic/spellblade
-	name = "blade energy"
-	icon_state = "lavastaff"
-	damage = 15
-	damage_type = BURN
-	flag = "magic"
-	dismemberment = 50
-	nodamage = FALSE
-
-/obj/projectile/magic/spellblade/on_hit(target)
-	if(ismob(target))
-		var/mob/M = target
-		if(M.anti_magic_check())
-			M.visible_message("<span class='warning'>[src] vanishes on contact with [target]!</span>")
-			qdel(src)
-			return BULLET_ACT_BLOCK
-	. = ..()
-
-/obj/projectile/magic/arcane_barrage
-	name = "arcane bolt"
-	icon_state = "arcane_barrage"
-	damage = 20
-	damage_type = BURN
-	nodamage = FALSE
-	armour_penetration = 0
-	flag = "magic"
-	hitsound = 'sound/weapons/barragespellhit.ogg'
-
-/obj/projectile/magic/arcane_barrage/on_hit(target)
-	if(ismob(target))
-		var/mob/M = target
-		if(M.anti_magic_check())
-			M.visible_message("<span class='warning'>[src] vanishes on contact with [target]!</span>")
-			qdel(src)
-			return BULLET_ACT_BLOCK
-	. = ..()
-
-
-/obj/projectile/magic/locker
-	name = "locker bolt"
-	icon_state = "locker"
-	nodamage = TRUE
-	flag = "magic"
-	var/weld = TRUE
-	var/created = FALSE //prevents creation of more then one locker if it has multiple hits
-	var/locker_suck = TRUE
-	var/obj/structure/closet/locker_temp_instance = /obj/structure/closet/decay
-
-/obj/projectile/magic/locker/Initialize()
-	. = ..()
-	locker_temp_instance = new(src)
-
-/obj/projectile/magic/locker/prehit_pierce(atom/A)
-	. = ..()
-	if(isliving(A) && locker_suck)
-		var/mob/living/M = A
-		if(M.anti_magic_check())			// no this doesn't check if ..() returned to phase through do I care no it's magic ain't gotta explain shit
-			M.visible_message("<span class='warning'>[src] vanishes on contact with [A]!</span>")
-			return PROJECTILE_DELETE_WITHOUT_HITTING
-		if(!locker_temp_instance.insertion_allowed(M))
-			return
-		M.forceMove(src)
-		return PROJECTILE_PIERCE_PHASE
-
-/obj/projectile/magic/locker/on_hit(target)
-	if(created)
-		return ..()
-	if(LAZYLEN(contents))
-		for(var/atom/movable/AM in contents)
-			locker_temp_instance.insert(AM)
-		locker_temp_instance.welded = weld
-		locker_temp_instance.update_appearance()
-	created = TRUE
-	return ..()
-
-/obj/projectile/magic/locker/Destroy()
-	locker_suck = FALSE
-	RemoveElement(/datum/element/connect_loc, projectile_connections) //We do this manually so the forcemoves don't "hit" us. This behavior is kinda dumb, someone refactor this
-	for(var/atom/movable/AM in contents)
-		AM.forceMove(get_turf(src))
-	. = ..()
-
-/obj/structure/closet/decay
-	breakout_time = 600
-	icon_welded = null
-	var/magic_icon = "cursed"
-	var/weakened_icon = "decursed"
-	var/auto_destroy = TRUE
-
-/obj/structure/closet/decay/Initialize()
-	. = ..()
-	if(auto_destroy)
-		addtimer(CALLBACK(src, PROC_REF(bust_open)), 5 MINUTES)
-	addtimer(CALLBACK(src, PROC_REF(magicly_lock)), 5)
-
-/obj/structure/closet/decay/proc/magicly_lock()
-	if(!welded)
-		return
-	icon_state = magic_icon
-	update_appearance()
-
-/obj/structure/closet/decay/after_weld(weld_state)
-	if(weld_state)
-		unmagify()
-
-/obj/structure/closet/decay/proc/decay()
-	animate(src, alpha = 0, time = 30)
-	addtimer(CALLBACK(GLOBAL_PROC, GLOBAL_PROC_REF(qdel), src), 30)
-
-/obj/structure/closet/decay/open(mob/living/user, force = FALSE)
-	. = ..()
-	if(.)
-		if(icon_state == magic_icon) //check if we used the magic icon at all before giving it the lesser magic icon
-			unmagify()
-		else
-			addtimer(CALLBACK(src, PROC_REF(decay)), 15 SECONDS)
-
-/obj/structure/closet/decay/proc/unmagify()
-	icon_state = weakened_icon
-	update_appearance()
-	addtimer(CALLBACK(src, PROC_REF(decay)), 15 SECONDS)
-	icon_welded = "welded"
-
-/obj/projectile/magic/flying
-	name = "bolt of flying"
-	icon_state = "flight"
-
-/obj/projectile/magic/flying/on_hit(target)
-	. = ..()
-	if(isliving(target))
-		var/mob/living/L = target
-		if(L.anti_magic_check())
-			L.visible_message("<span class='warning'>[src] vanishes on contact with [target]!</span>")
-			return BULLET_ACT_BLOCK
-		var/atom/throw_target = get_edge_target_turf(L, angle2dir(Angle))
-		L.throw_at(throw_target, 200, 4)
-
-/obj/projectile/magic/bounty
-	name = "bolt of bounty"
-	icon_state = "bounty"
-
-/obj/projectile/magic/bounty/on_hit(target)
-	. = ..()
-	if(isliving(target))
-		var/mob/living/L = target
-		if(L.anti_magic_check() || !firer)
-			L.visible_message("<span class='warning'>[src] vanishes on contact with [target]!</span>")
-			return BULLET_ACT_BLOCK
-		L.apply_status_effect(STATUS_EFFECT_BOUNTY, firer)
-
-/obj/projectile/magic/antimagic
-	name = "bolt of antimagic"
-	icon_state = "antimagic"
-
-/obj/projectile/magic/antimagic/on_hit(target)
-	. = ..()
-	if(isliving(target))
-		var/mob/living/L = target
-		if(L.anti_magic_check())
-			L.visible_message("<span class='warning'>[src] vanishes on contact with [target]!</span>")
-			return BULLET_ACT_BLOCK
-		L.apply_status_effect(STATUS_EFFECT_ANTIMAGIC)
-
-/obj/projectile/magic/fetch
-	name = "bolt of fetching"
-	icon_state = "fetch"
-
-/obj/projectile/magic/fetch/on_hit(target)
-	. = ..()
-	if(isliving(target))
-		var/mob/living/L = target
-		if(L.anti_magic_check() || !firer)
-			L.visible_message("<span class='warning'>[src] vanishes on contact with [target]!</span>")
-			return BULLET_ACT_BLOCK
-		var/atom/throw_target = get_edge_target_turf(L, get_dir(L, firer))
-		L.throw_at(throw_target, 200, 4)
-
-/obj/projectile/magic/sapping
-	name = "bolt of sapping"
-	icon_state = "sapping"
-
-/obj/projectile/magic/sapping/on_hit(target)
-	. = ..()
-	if(ismob(target))
-		var/mob/M = target
-		if(M.anti_magic_check())
-			M.visible_message("<span class='warning'>[src] vanishes on contact with [target]!</span>")
-			return BULLET_ACT_BLOCK
-		SEND_SIGNAL(M, COMSIG_ADD_MOOD_EVENT, src, /datum/mood_event/sapped)
-
-/obj/projectile/magic/necropotence
-	name = "bolt of necropotence"
-	icon_state = "necropotence"
-
-/obj/projectile/magic/necropotence/on_hit(target)
-	. = ..()
-	if(isliving(target))
-		var/mob/living/L = target
-		if(L.anti_magic_check() || !L.mind || !L.mind.hasSoul)
-			L.visible_message("<span class='warning'>[src] vanishes on contact with [target]!</span>")
-			return BULLET_ACT_BLOCK
-		to_chat(L, "<span class='danger'>Your body feels drained and there is a burning pain in your chest.</span>")
-		L.maxHealth -= 20
-		L.health = min(L.health, L.maxHealth)
-		if(L.maxHealth <= 0)
-			to_chat(L, "<span class='userdanger'>Your weakened soul is completely consumed by the [src]!</span>")
-			L.mind.hasSoul = FALSE
-		for(var/obj/effect/proc_holder/spell/spell in L.mind.spell_list)
-			spell.charge_counter = spell.charge_max
-			spell.recharging = FALSE
-			spell.update_appearance()
-
-/obj/projectile/magic/fortify
-	name = "bolt of light"
-	icon_state = "spark"
-
-/obj/projectile/magic/fortify/on_hit(target)
-	. = ..()
-	if(isliving(target))
-		var/mob/living/L = target
-		if(L.anti_magic_check() || !L.mind || !L.mind.hasSoul)
-			L.visible_message("<span class='warning'>[src] vanishes on contact with [target]!</span>")
-			return BULLET_ACT_BLOCK
-		to_chat(L, "<span class='greentext'>You feel your body flood with magical strength! Your flesh feels cleansed, and somehow... tougher.</span>")
-		L.maxHealth += 20
-		L.heal_overall_damage(20, 20)
-		L.apply_damage(-200, CLONE)//cleanses cellular damage
-		if(L.mind.hasSoul == FALSE)//restores consumed souls
-			to_chat(L, "<span class='nicegreen'>You feel a warm light in your chest... the [src] has restored something you'd long forgotten.</span>")
-			L.mind.hasSoul = TRUE
-			if(L.hellbound == 1)
-				L.hellbound = 0//devil economy in shambles
-		for(var/obj/effect/proc_holder/spell/spell in L.mind.spell_list)
-			spell.charge_counter = spell.charge_max
-			spell.recharging = FALSE
-			spell.update_appearance()
-
-/obj/projectile/magic/wipe
-	name = "bolt of possession"
-	icon_state = "wipe"
-
-/obj/projectile/magic/wipe/on_hit(target)
-	. = ..()
-	if(iscarbon(target))
-		var/mob/living/carbon/M = target
-		if(M.anti_magic_check())
-			M.visible_message("<span class='warning'>[src] vanishes on contact with [target]!</span>")
-			return BULLET_ACT_BLOCK
-		for(var/x in M.get_traumas())//checks to see if the victim is already going through possession
-			if(istype(x, /datum/brain_trauma/special/imaginary_friend/trapped_owner))
-				M.visible_message("<span class='warning'>[src] vanishes on contact with [target]!</span>")
-				return BULLET_ACT_BLOCK
-		to_chat(M, "<span class='warning'>Your mind has been opened to possession!</span>")
-		possession_test(M)
-		return BULLET_ACT_HIT
-
-/obj/projectile/magic/wipe/proc/possession_test(mob/living/carbon/M)
-	var/datum/brain_trauma/special/imaginary_friend/trapped_owner/trauma = M.gain_trauma(/datum/brain_trauma/special/imaginary_friend/trapped_owner)
-	var/poll_message = "Do you want to play as [M.real_name]?"
-	if(M.mind && M.mind.assigned_role)
-		poll_message = "[poll_message] Job:[M.mind.assigned_role]."
-	if(M.mind && M.mind.special_role)
-		poll_message = "[poll_message] Status:[M.mind.special_role]."
-	else if(M.mind)
-		var/datum/antagonist/A = M.mind.has_antag_datum(/datum/antagonist/)
-		if(A)
-			poll_message = "[poll_message] Status:[A.name]."
-	var/list/mob/dead/observer/candidates = pollCandidatesForMob(poll_message, ROLE_PAI, null, FALSE, 100, M)
-	if(M.stat == DEAD)//boo.
-		return
-	if(LAZYLEN(candidates))
-		var/mob/dead/observer/C = pick(candidates)
-		to_chat(M, "<span class='boldnotice'>You have been noticed by a ghost and it has possessed you!</span>")
-		var/oldkey = M.key
-		M.ghostize(0)
-		M.key = C.key
-		trauma.friend.key = oldkey
-		trauma.friend.reset_perspective(null)
-		trauma.friend.Show()
-		trauma.friend_initialized = TRUE
-	else
-		to_chat(M, "<span class='notice'>Your mind has managed to go unnoticed in the spirit world.</span>")
-		qdel(trauma)
-
 /obj/projectile/magic/aoe
 	name = "Area Bolt"
 	desc = "What the fuck does this do?!"
@@ -592,95 +19,3 @@
 			if(L.stat != DEAD && L != firer && !L.anti_magic_check())
 				return Bump(L)
 	..()
-
-
-/obj/projectile/magic/aoe/lightning
-	name = "lightning bolt"
-	icon_state = "tesla_projectile"	//Better sprites are REALLY needed and appreciated!~
-	damage = 15
-	damage_type = BURN
-	nodamage = FALSE
-	speed = 0.3
-	flag = "magic"
-
-	var/zap_power = 20000
-	var/zap_range = 15
-	var/zap_flags = ZAP_MOB_DAMAGE | ZAP_MOB_STUN | ZAP_OBJ_DAMAGE
-	var/chain
-	var/mob/living/caster
-
-/obj/projectile/magic/aoe/lightning/fire(setAngle)
-	if(caster)
-		chain = caster.Beam(src, icon_state = "lightning[rand(1, 12)]", time = INFINITY, maxdistance = INFINITY)
-	..()
-
-/obj/projectile/magic/aoe/lightning/on_hit(target)
-	. = ..()
-	if(ismob(target))
-		var/mob/M = target
-		if(M.anti_magic_check())
-			visible_message("<span class='warning'>[src] fizzles on contact with [target]!</span>")
-			qdel(src)
-			return BULLET_ACT_BLOCK
-	tesla_zap(src, zap_range, zap_power, zap_flags)
-	qdel(src)
-
-/obj/projectile/magic/aoe/lightning/Destroy()
-	qdel(chain)
-	. = ..()
-
-/obj/projectile/magic/aoe/fireball
-	name = "bolt of fireball"
-	icon_state = "fireball"
-	damage = 10
-	damage_type = BRUTE
-	nodamage = FALSE
-
-	//explosion values
-	var/exp_heavy = 0
-	var/exp_light = 2
-	var/exp_flash = 3
-	var/exp_fire = 2
-
-/obj/projectile/magic/aoe/fireball/on_hit(target)
-	. = ..()
-	if(ismob(target))
-		var/mob/living/M = target
-		if(M.anti_magic_check())
-			visible_message("<span class='warning'>[src] vanishes into smoke on contact with [target]!</span>")
-			return BULLET_ACT_BLOCK
-		M.take_overall_damage(0,10) //between this 10 burn, the 10 brute, the explosion brute, and the onfire burn, your at about 65 damage if you stop drop and roll immediately
-	var/turf/T = get_turf(target)
-	explosion(T, -1, exp_heavy, exp_light, exp_flash, 0, flame_range = exp_fire)
-
-/obj/projectile/magic/aoe/fireball/infernal
-	name = "infernal fireball"
-	exp_heavy = -1
-	exp_light = -1
-	exp_flash = 4
-	exp_fire= 5
-
-/obj/projectile/magic/aoe/fireball/infernal/on_hit(target)
-	. = ..()
-	if(ismob(target))
-		var/mob/living/M = target
-		if(M.anti_magic_check())
-			return BULLET_ACT_BLOCK
-	var/turf/T = get_turf(target)
-	for(var/i=0, i<50, i+=10)
-		addtimer(CALLBACK(GLOBAL_PROC, GLOBAL_PROC_REF(explosion), T, -1, exp_heavy, exp_light, exp_flash, FALSE, FALSE, exp_fire), i)
-
-//still magic related, but a different path
-
-/obj/projectile/temp/chill
-	name = "bolt of chills"
-	icon_state = "ice_2"
-	damage = 0
-	damage_type = BURN
-	nodamage = FALSE
-	armour_penetration = 100
-	temperature = -200 // Cools you down greatly per hit
-	flag = "magic"
-
-/obj/projectile/magic/nothing
-	name = "bolt of nothing"
diff --git a/code/modules/research/experimentor.dm b/code/modules/research/experimentor.dm
index 9016d60515e7..ce473ad739cb 100644
--- a/code/modules/research/experimentor.dm
+++ b/code/modules/research/experimentor.dm
@@ -355,16 +355,6 @@
 			C.name = "Cup of Suspicious Liquid"
 			C.desc = "It has a large hazard symbol printed on the side in fading ink."
 			investigate_log("Experimentor has made a cup of [chosenchem] coffee.", INVESTIGATE_EXPERIMENTOR)
-		else if(prob(EFFECT_PROB_VERYLOW-badThingCoeff))
-			var/turf/start = get_turf(src)
-			var/mob/M = locate(/mob/living) in view(src, 3)
-			var/turf/MT = get_turf(M)
-			if(MT)
-				visible_message("<span class='danger'>[src] dangerously overheats, launching a flaming fuel orb!</span>")
-				investigate_log("Experimentor has launched a <font color='red'>fireball</font> at [M]!", INVESTIGATE_EXPERIMENTOR)
-				var/obj/projectile/magic/aoe/fireball/FB = new /obj/projectile/magic/aoe/fireball(start)
-				FB.preparePixelProjectile(MT, start)
-				FB.fire()
 		else if(prob(EFFECT_PROB_LOW-badThingCoeff))
 			visible_message("<span class='danger'>[src] malfunctions, melting [exp_on] and releasing a burst of flame!</span>")
 			explosion(loc, -1, 0, 0, 0, 0, flame_range = 2)
diff --git a/code/modules/ruins/icemoonruin_code/hotsprings.dm b/code/modules/ruins/icemoonruin_code/hotsprings.dm
deleted file mode 100644
index dd4d39e91a20..000000000000
--- a/code/modules/ruins/icemoonruin_code/hotsprings.dm
+++ /dev/null
@@ -1,56 +0,0 @@
-GLOBAL_LIST_EMPTY(cursed_minds)
-
-/**
- * Turns whoever enters into a mob or random person
- *
- * If mob is chosen, turns the person into a random animal type
- * If appearance is chosen, turns the person into a random human with a random species
- * This changes name, and changes their DNA as well
- * Random species is same as wizard swap event so people don't get killed ex: plasmamen
- * Once the spring is used, it cannot be used by the same mind ever again
- * After usage, teleports the user back to a random safe turf (so mobs are not killed by ice moon atmosphere)
- *
- */
-
-/turf/open/water/cursed_spring
-	baseturfs = /turf/open/water/cursed_spring
-	planetary_atmos = TRUE
-	initial_gas_mix = ICEMOON_DEFAULT_ATMOS
-
-/turf/open/water/cursed_spring/Entered(atom/movable/thing, atom/oldLoc)
-	. = ..()
-	if(!isliving(thing))
-		return
-	var/mob/living/L = thing
-	if(!L.client)
-		return
-	if(GLOB.cursed_minds[L.mind])
-		return
-	GLOB.cursed_minds[L.mind] = TRUE
-	RegisterSignal(L.mind, COMSIG_PARENT_QDELETING, PROC_REF(remove_from_cursed))
-	var/random_choice = pick("Mob", "Appearance")
-	switch(random_choice)
-		if("Mob")
-			L = wabbajack(L, "animal")
-		if("Appearance")
-			var/mob/living/carbon/human/H = wabbajack(L, "humanoid")
-			randomize_human(H)
-			var/list/all_species = list()
-			for(var/stype in subtypesof(/datum/species))
-				var/datum/species/S = stype
-				if(initial(S.changesource_flags) & RACE_SWAP)
-					all_species += stype
-			var/random_race = pick(all_species)
-			H.set_species(random_race)
-			H.dna.unique_enzymes = H.dna.generate_unique_enzymes()
-			L = H
-	var/turf/T = find_safe_turf()
-	L.forceMove(T)
-	to_chat(L, "<span class='notice'>You blink and find yourself in [get_area_name(T)].</span>")
-
-/**
- * Deletes minds from the cursed minds list after their deletion
- *
- */
-/turf/open/water/cursed_spring/proc/remove_from_cursed(datum/mind/M)
-	GLOB.cursed_minds -= M
diff --git a/code/modules/shuttle/special.dm b/code/modules/shuttle/special.dm
index 2603d9ea3e24..1ddb26efba88 100644
--- a/code/modules/shuttle/special.dm
+++ b/code/modules/shuttle/special.dm
@@ -1,134 +1,5 @@
 // Special objects for shuttle templates go here if nowhere else
 
-// Wabbajack statue, a sleeping frog statue that shoots bolts of change if
-// living carbons are put on its altar/tables
-
-/obj/machinery/power/emitter/energycannon/magical
-	name = "wabbajack statue"
-	desc = "Who am I? What is my purpose in life? What do I mean by who am I?"
-	projectile_type = /obj/projectile/magic/change
-	icon = 'icons/obj/machines/magic_emitter.dmi'
-	icon_state = "wabbajack_statue"
-	icon_state_on = "wabbajack_statue_on"
-	base_icon_state = "wabbajack_statue"
-	active = FALSE
-	allow_switch_interact = FALSE
-	var/list/active_tables = list()
-	var/tables_required = 2
-
-/obj/machinery/power/emitter/energycannon/magical/Initialize()
-	. = ..()
-	if(prob(50))
-		desc = "Oh no, not again."
-	update_appearance()
-
-/obj/machinery/power/emitter/energycannon/magical/update_icon_state()
-	. = ..()
-	icon_state = active ? icon_state_on : initial(icon_state)
-
-/obj/machinery/power/emitter/energycannon/magical/process()
-	. = ..()
-	if(active_tables.len >= tables_required)
-		if(!active)
-			visible_message("<span class='revenboldnotice'>\
-				[src] opens its eyes.</span>")
-		active = TRUE
-	else
-		if(active)
-			visible_message("<span class='revenboldnotice'>\
-				[src] closes its eyes.</span>")
-		active = FALSE
-	update_appearance()
-
-/obj/machinery/power/emitter/energycannon/magical/attackby(obj/item/W, mob/user, params)
-	return
-
-/obj/machinery/power/emitter/energycannon/magical/ex_act(severity)
-	return
-
-/obj/machinery/power/emitter/energycannon/magical/emag_act(mob/user)
-	return
-
-/obj/structure/table/abductor/wabbajack
-	name = "wabbajack altar"
-	desc = "Whether you're sleeping or waking, it's going to be quite chaotic."
-	max_integrity = 1000
-	verb_say = "chants"
-	var/obj/machinery/power/emitter/energycannon/magical/our_statue
-	var/list/mob/living/sleepers = list()
-	var/never_spoken = TRUE
-	flags_1 = NODECONSTRUCT_1
-
-/obj/structure/table/abductor/wabbajack/Initialize(mapload)
-	. = ..()
-	START_PROCESSING(SSobj, src)
-
-/obj/structure/table/abductor/wabbajack/Destroy()
-	STOP_PROCESSING(SSobj, src)
-	. = ..()
-
-/obj/structure/table/abductor/wabbajack/process()
-	var/area = orange(4, src)
-	if(!our_statue)
-		for(var/obj/machinery/power/emitter/energycannon/magical/M in area)
-			our_statue = M
-			break
-
-	if(!our_statue)
-		name = "inert [initial(name)]"
-		return
-	else
-		name = initial(name)
-
-	var/turf/T = get_turf(src)
-	var/list/found = list()
-	for(var/mob/living/carbon/C in T)
-		if(C.stat != DEAD)
-			found += C
-
-	// New sleepers
-	for(var/i in found - sleepers)
-		var/mob/living/L = i
-		L.add_atom_colour("#800080", TEMPORARY_COLOUR_PRIORITY)
-		L.visible_message("<span class='revennotice'>A strange purple glow wraps itself around [L] as [L.p_they()] suddenly fall[L.p_s()] unconscious.</span>",
-			"<span class='revendanger'>[desc]</span>")
-		// Don't let them sit suround unconscious forever
-		addtimer(CALLBACK(src, PROC_REF(sleeper_dreams), L), 100)
-
-	// Existing sleepers
-	for(var/i in found)
-		var/mob/living/L = i
-		L.SetSleeping(200)
-
-	// Missing sleepers
-	for(var/i in sleepers - found)
-		var/mob/living/L = i
-		L.remove_atom_colour(TEMPORARY_COLOUR_PRIORITY, "#800080")
-		L.visible_message("<span class='revennotice'>The glow from [L] fades \
-			away.</span>")
-		L.grab_ghost()
-
-	sleepers = found
-
-	if(sleepers.len)
-		our_statue.active_tables |= src
-		if(never_spoken || prob(5))
-			say(desc)
-			never_spoken = FALSE
-	else
-		our_statue.active_tables -= src
-
-/obj/structure/table/abductor/wabbajack/proc/sleeper_dreams(mob/living/sleeper)
-	if(sleeper in sleepers)
-		to_chat(sleeper, "<span class='revennotice'>While you slumber, you have the strangest dream, like you can see yourself from the outside.</span>")
-		sleeper.ghostize(TRUE)
-
-/obj/structure/table/abductor/wabbajack/left
-	desc = "You sleep so it may wake."
-
-/obj/structure/table/abductor/wabbajack/right
-	desc = "It wakes so you may sleep."
-
 // Bar staff, GODMODE mobs(as long as they stay in the shuttle) that just want to make sure people have drinks
 // and a good time.
 
diff --git a/code/modules/spells/spell_types/aimed.dm b/code/modules/spells/spell_types/aimed.dm
index 9e30c708774d..8e502cd592f5 100644
--- a/code/modules/spells/spell_types/aimed.dm
+++ b/code/modules/spells/spell_types/aimed.dm
@@ -2,7 +2,7 @@
 /obj/effect/proc_holder/spell/aimed
 	name = "aimed projectile spell"
 	base_icon_state = "projectile"
-	var/projectile_type = /obj/projectile/magic/teleport
+	var/projectile_type = /obj/projectile
 	var/deactive_msg = "You discharge your projectile..."
 	var/active_msg = "You charge your projectile!"
 	var/active_icon_state = "projectile"
@@ -106,7 +106,7 @@
 	projectile_var_overrides = list("zap_range" = 15, "zap_power" = 20000, "zap_flags" = ZAP_MOB_DAMAGE)
 	active_msg = "You energize your hands with arcane lightning!"
 	deactive_msg = "You let the energy flow out of your hands back into yourself..."
-	projectile_type = /obj/projectile/magic/aoe/lightning
+	projectile_type = /obj/projectile/magic
 
 /obj/effect/proc_holder/spell/aimed/fireball
 	name = "Fireball"
@@ -118,7 +118,7 @@
 	invocation_type = INVOCATION_SHOUT
 	range = 20
 	cooldown_min = 20 //10 deciseconds reduction per rank
-	projectile_type = /obj/projectile/magic/aoe/fireball
+	projectile_type = /obj/projectile/magic
 	base_icon_state = "fireball"
 	action_icon_state = "fireball0"
 	sound = 'sound/magic/fireball.ogg'
diff --git a/code/modules/spells/spell_types/devil.dm b/code/modules/spells/spell_types/devil.dm
index 6631d943a3aa..421f02d78d65 100644
--- a/code/modules/spells/spell_types/devil.dm
+++ b/code/modules/spells/spell_types/devil.dm
@@ -84,7 +84,7 @@
 	invocation_type = INVOCATION_SHOUT
 	range = 2
 
-	projectile_type = /obj/projectile/magic/aoe/fireball/infernal
+	projectile_type = /obj/projectile/magic
 
 	action_background_icon_state = "bg_demon"
 
diff --git a/code/modules/spells/spell_types/shapeshift.dm b/code/modules/spells/spell_types/shapeshift.dm
index 65eb0cebb2b3..254a43dc23af 100644
--- a/code/modules/spells/spell_types/shapeshift.dm
+++ b/code/modules/spells/spell_types/shapeshift.dm
@@ -19,7 +19,6 @@
 	var/mob/living/shapeshift_type
 	var/list/possible_shapes = list(/mob/living/simple_animal/mouse,\
 		/mob/living/simple_animal/pet/dog/corgi,\
-		/mob/living/simple_animal/hostile/carp/ranged/chaos,\
 		/mob/living/simple_animal/bot/secbot/ed209,\
 		/mob/living/simple_animal/hostile/poison/giant_spider/hunter/viper,\
 		/mob/living/simple_animal/hostile/construct/juggernaut)
diff --git a/code/modules/uplink/uplink_items.dm b/code/modules/uplink/uplink_items.dm
index f58f94df84dd..eaa0a631ec5d 100644
--- a/code/modules/uplink/uplink_items.dm
+++ b/code/modules/uplink/uplink_items.dm
@@ -1712,13 +1712,6 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item))
 	item = /obj/item/flashlight/lantern/syndicate
 	restricted_species = list("moth") //End WS edit
 
-/datum/uplink_item/race_restricted/syndigenetics
-	name = "Fire Breath"
-	desc = "One of our subsidiaries, 23AndMe, have recently found the formula of backtracking lizard's genetic trail and giving them the ability to breathe fire, much like their dragon ancestors."
-	cost = 5
-	item = /obj/item/dnainjector/firebreath
-	restricted_species = list("lizard")
-
 /datum/uplink_item/race_restricted/razorwing
 	name = "Razorwing Implant"
 	desc = "Put those wings to good use! This implant makes your wingtips razor sharp and gives you the ability to flourish them, slicing anyone in range."
diff --git a/shiptest.dme b/shiptest.dme
index 59fc9bc5997a..61ff5146c7cb 100644
--- a/shiptest.dme
+++ b/shiptest.dme
@@ -2108,7 +2108,6 @@
 #include "code\modules\events\wizard\invincible.dm"
 #include "code\modules\events\wizard\lava.dm"
 #include "code\modules\events\wizard\madness.dm"
-#include "code\modules\events\wizard\magicarp.dm"
 #include "code\modules\events\wizard\petsplosion.dm"
 #include "code\modules\events\wizard\race.dm"
 #include "code\modules\events\wizard\rpgloot.dm"
@@ -3230,7 +3229,6 @@
 #include "code\modules\research\xenobiology\crossbreeding\stabilized.dm"
 #include "code\modules\ruins\lavaland_ruin_code.dm"
 #include "code\modules\ruins\rockplanet_ruin_code.dm"
-#include "code\modules\ruins\icemoonruin_code\hotsprings.dm"
 #include "code\modules\ruins\icemoonruin_code\hydroponicslab.dm"
 #include "code\modules\ruins\icemoonruin_code\library.dm"
 #include "code\modules\ruins\icemoonruin_code\wrath.dm"

From 1d48d3ee8643d14a7d311de6cec5d12cf8af26ef Mon Sep 17 00:00:00 2001
From: FalloutFalcon <falloutfalconplays@gmail.com>
Date: Thu, 4 Apr 2024 15:38:19 -0500
Subject: [PATCH 70/89] yea

---
 _maps/map_files/generic/CentCom.dmm                    | 5 -----
 code/modules/projectiles/guns/magic.dm                 | 1 -
 code/modules/projectiles/projectile/magic/spellcard.dm | 6 ------
 shiptest.dme                                           | 1 -
 4 files changed, 13 deletions(-)
 delete mode 100644 code/modules/projectiles/projectile/magic/spellcard.dm

diff --git a/_maps/map_files/generic/CentCom.dmm b/_maps/map_files/generic/CentCom.dmm
index 07fec6af70db..9ad02e5f16ab 100644
--- a/_maps/map_files/generic/CentCom.dmm
+++ b/_maps/map_files/generic/CentCom.dmm
@@ -3063,11 +3063,6 @@
 /area/wizard_station)
 "aEX" = (
 /obj/structure/table/wood,
-/obj/item/gun/magic/wand{
-	desc = "Used in emergencies to reignite magma engines.";
-	max_charges = 0;
-	name = "wand of emergency engine ignition"
-	},
 /turf/open/floor/plasteel,
 /area/wizard_station)
 "aEY" = (
diff --git a/code/modules/projectiles/guns/magic.dm b/code/modules/projectiles/guns/magic.dm
index 9360c24be499..be2f2394a543 100644
--- a/code/modules/projectiles/guns/magic.dm
+++ b/code/modules/projectiles/guns/magic.dm
@@ -74,7 +74,6 @@
 		recharge_newshot()
 	return 1
 
-
 /obj/item/gun/magic/shoot_with_empty_chamber(mob/living/user as mob|obj)
 	to_chat(user, "<span class='warning'>The [name] whizzles quietly.</span>")
 
diff --git a/code/modules/projectiles/projectile/magic/spellcard.dm b/code/modules/projectiles/projectile/magic/spellcard.dm
deleted file mode 100644
index 464586d2f8a4..000000000000
--- a/code/modules/projectiles/projectile/magic/spellcard.dm
+++ /dev/null
@@ -1,6 +0,0 @@
-/obj/projectile/spellcard
-	name = "enchanted card"
-	desc = "A piece of paper enchanted to give it extreme durability and stiffness, along with a very hot burn to anyone unfortunate enough to get hit by a charged one."
-	icon_state = "spellcard"
-	damage_type = BURN
-	damage = 2
diff --git a/shiptest.dme b/shiptest.dme
index 61ff5146c7cb..845389607403 100644
--- a/shiptest.dme
+++ b/shiptest.dme
@@ -3061,7 +3061,6 @@
 #include "code\modules\projectiles\projectile\energy\nuclear_particle.dm"
 #include "code\modules\projectiles\projectile\energy\stun.dm"
 #include "code\modules\projectiles\projectile\energy\tesla.dm"
-#include "code\modules\projectiles\projectile\magic\spellcard.dm"
 #include "code\modules\projectiles\projectile\reusable\_reusable.dm"
 #include "code\modules\projectiles\projectile\reusable\arrow.dm"
 #include "code\modules\projectiles\projectile\reusable\foam_dart.dm"

From c696e6820a92b39f8fed530d2dbcf84a5a3e1c84 Mon Sep 17 00:00:00 2001
From: FalloutFalcon <falloutfalconplays@gmail.com>
Date: Sat, 6 Apr 2024 17:28:46 -0500
Subject: [PATCH 71/89] removes more magic

---
 code/game/objects/items/granters.dm           |  13 --
 .../structures/fugitive_role_spawners.dm      |  58 ------
 .../structures/icemoon/cave_entrance.dm       |   1 -
 .../changeling/powers/mutations.dm            | 179 ------------------
 .../antagonists/fugitive/fugitive_outfits.dm  | 154 ---------------
 .../antagonists/wizard/equipment/spellbook.dm |   4 -
 .../awaymissions/mission_code/snowdin.dm      |  13 --
 code/modules/cargo/exports/lavaland.dm        |   1 -
 .../mining/lavaland/necropolis_chests.dm      |  90 ---------
 .../hostile/megafauna/codename_claw.dm        |  16 +-
 .../mob/living/simple_animal/hostile/mimic.dm |  10 -
 .../boxes_magazines/internal/misc.dm          |   6 -
 code/modules/projectiles/gun.dm               |   1 +
 .../projectiles/guns/ballistic/shotgun.dm     |  46 -----
 code/modules/projectiles/guns/magic.dm        |  84 --------
 code/modules/projectiles/projectile/magic.dm  |  21 --
 .../xenobiology/crossbreeding/_weapons.dm     |  51 -----
 .../xenobiology/crossbreeding/chilling.dm     |  23 ---
 code/modules/spells/spell_types/aimed.dm      |  57 ------
 code/modules/spells/spell_types/charge.dm     |  14 --
 shiptest.dme                                  |   4 -
 21 files changed, 3 insertions(+), 843 deletions(-)
 delete mode 100644 code/game/objects/structures/fugitive_role_spawners.dm
 delete mode 100644 code/modules/antagonists/fugitive/fugitive_outfits.dm
 delete mode 100644 code/modules/projectiles/guns/magic.dm
 delete mode 100644 code/modules/projectiles/projectile/magic.dm

diff --git a/code/game/objects/items/granters.dm b/code/game/objects/items/granters.dm
index 0681892fd47e..f3cdfb068944 100644
--- a/code/game/objects/items/granters.dm
+++ b/code/game/objects/items/granters.dm
@@ -247,19 +247,6 @@
 	user.Stun(40, ignore_canstun = TRUE)
 	user.petrify(30)
 
-/obj/item/book/granter/spell/cards
-	spell = /obj/effect/proc_holder/spell/aimed/spell_cards
-	spellname = "spellcards"
-	icon_state ="bookspellcards"
-	desc = "The ultimate card trick, for users ten and up."
-	remarks = list("It's all about the razzmataz.", "...I don't think I'll actually be sawing anyone in half", "These are pretty flimsy, most armor would defeat them.", "They do burn damage? Weird.", "Why the dumb stance? It's just a flick of the hand...", "Are these cards? They feel stiffer then pages.", "Best performed using a top hat...")
-
-/obj/item/book/granter/spell/cards/recoil(mob/living/user)
-	..()
-	to_chat(user,"<span class='warning'>The cards are against you!</span>")
-	user.Stun(40, ignore_canstun = TRUE)
-	user.petrify(30)
-
 /obj/item/book/granter/spell/shapechange
 	spell = /obj/effect/proc_holder/spell/targeted/shapeshift
 	spellname = "shapechange"
diff --git a/code/game/objects/structures/fugitive_role_spawners.dm b/code/game/objects/structures/fugitive_role_spawners.dm
deleted file mode 100644
index 4f98e919ffc5..000000000000
--- a/code/game/objects/structures/fugitive_role_spawners.dm
+++ /dev/null
@@ -1,58 +0,0 @@
-
-
-/obj/effect/mob_spawn/human/fugitive
-	assignedrole = "Fugitive Hunter"
-	flavour_text = "" //the flavor text will be the backstory argument called on the antagonist's greet, see hunter.dm for details
-	roundstart = FALSE
-	death = FALSE
-	random = TRUE
-	show_flavour = FALSE
-	density = TRUE
-	var/back_story = "error"
-
-/obj/effect/mob_spawn/human/fugitive/Initialize(mapload)
-	. = ..()
-	notify_ghosts("Hunters are waking up looking for refugees!", source = src, action=NOTIFY_ATTACK, flashwindow = FALSE, ignore_key = POLL_IGNORE_FUGITIVE)
-
-/obj/effect/mob_spawn/human/fugitive/spacepol
-	name = "police pod"
-	desc = "A small sleeper typically used to put people to sleep for briefing on the mission."
-	mob_name = "a spacepol officer"
-	flavour_text = "Justice has arrived. I am a member of the Spacepol!"
-	back_story = "space cop"
-	outfit = /datum/outfit/spacepol
-	icon = 'icons/obj/machines/sleeper.dmi'
-	icon_state = "sleeper"
-
-/obj/effect/mob_spawn/human/fugitive/russian
-	name = "russian pod"
-	flavour_text = "Ay blyat. I am a space-russian smuggler! We were mid-flight when our cargo was beamed off our ship!"
-	back_story = "russian"
-	desc = "A small sleeper typically used to make long distance travel a bit more bearable."
-	mob_name = "russian"
-	outfit = /datum/outfit/frontier/hunter
-	icon = 'icons/obj/machines/sleeper.dmi'
-	icon_state = "sleeper"
-
-/obj/effect/mob_spawn/human/fugitive/bounty
-	name = "bounty hunter pod"
-	flavour_text = "We got a new bounty on some fugitives, dead or alive."
-	back_story = "bounty hunters"
-	desc = "A small sleeper typically used to make long distance travel a bit more bearable."
-	mob_name = "bounty hunter"
-	icon = 'icons/obj/machines/sleeper.dmi'
-	icon_state = "sleeper"
-
-/obj/effect/mob_spawn/human/fugitive/bounty/Destroy()
-	var/obj/structure/fluff/empty_sleeper/S = new(drop_location())
-	S.setDir(dir)
-	return ..()
-
-/obj/effect/mob_spawn/human/fugitive/bounty/armor
-	outfit = /datum/outfit/bountyarmor
-
-/obj/effect/mob_spawn/human/fugitive/bounty/hook
-	outfit = /datum/outfit/bountyhook
-
-/obj/effect/mob_spawn/human/fugitive/bounty/synth
-	outfit = /datum/outfit/bountysynth
diff --git a/code/game/objects/structures/icemoon/cave_entrance.dm b/code/game/objects/structures/icemoon/cave_entrance.dm
index 5b77da4aafc7..2eff7f22567e 100644
--- a/code/game/objects/structures/icemoon/cave_entrance.dm
+++ b/code/game/objects/structures/icemoon/cave_entrance.dm
@@ -745,7 +745,6 @@ GLOBAL_LIST_INIT(ore_probability, list(
 				new /obj/item/clothing/suit/space/hardsuit/carp(loc)
 				new /mob/living/simple_animal/hostile/carp(loc)
 			if(prob(45))
-				new /obj/item/gun/magic/hook(loc)
 				new /mob/living/simple_animal/hostile/carp(loc)
 			if(prob(45))
 				new /obj/item/reagent_containers/food/snacks/fishmeat/carp(loc)
diff --git a/code/modules/antagonists/changeling/powers/mutations.dm b/code/modules/antagonists/changeling/powers/mutations.dm
index d77c4ef6ff3c..90a12b7eab42 100644
--- a/code/modules/antagonists/changeling/powers/mutations.dm
+++ b/code/modules/antagonists/changeling/powers/mutations.dm
@@ -211,185 +211,6 @@
 	if(can_drop)
 		new /obj/item/melee/synthetic_arm_blade(get_turf(user))
 
-/***************************************\
-|***********COMBAT TENTACLES*************|
-\***************************************/
-
-/datum/action/changeling/weapon/tentacle
-	name = "Tentacle"
-	desc = "We ready a tentacle to grab items or victims with. Costs 10 chemicals."
-	helptext = "We can use it once to retrieve a distant item. If used on living creatures, the effect depends on the intent: \
-	Help will simply drag them closer, Disarm will grab whatever they're holding instead of them, Grab will put the victim in our hold after catching it, \
-	and Harm will pull it in and stab it if we're also holding a sharp weapon. Cannot be used while in lesser form."
-	button_icon_state = "tentacle"
-	chemical_cost = 10
-	dna_cost = 2
-	req_human = 1
-	weapon_type = /obj/item/gun/magic/tentacle
-	weapon_name_simple = "tentacle"
-	silent = TRUE
-
-/obj/item/gun/magic/tentacle
-	name = "tentacle"
-	desc = "A fleshy tentacle that can stretch out and grab things or people."
-	icon = 'icons/obj/changeling_items.dmi'
-	icon_state = "tentacle"
-	item_state = "tentacle"
-	lefthand_file = 'icons/mob/inhands/antag/changeling_lefthand.dmi'
-	righthand_file = 'icons/mob/inhands/antag/changeling_righthand.dmi'
-	item_flags = NEEDS_PERMIT | ABSTRACT | DROPDEL | NOBLUDGEON
-	flags_1 = NONE
-	w_class = WEIGHT_CLASS_HUGE
-	slot_flags = NONE
-	ammo_type = /obj/item/ammo_casing/magic/tentacle
-	fire_sound = 'sound/effects/splat.ogg'
-	force = 0
-	max_charges = 1
-	fire_delay = 1
-	throwforce = 0 //Just to be on the safe side
-	throw_range = 0
-	throw_speed = 0
-
-/obj/item/gun/magic/tentacle/Initialize(mapload, silent)
-	. = ..()
-	ADD_TRAIT(src, TRAIT_NODROP, CHANGELING_TRAIT)
-	if(ismob(loc))
-		if(!silent)
-			loc.visible_message("<span class='warning'>[loc.name]\'s arm starts stretching inhumanly!</span>", "<span class='warning'>Our arm twists and mutates, transforming it into a tentacle.</span>", "<span class='hear'>You hear organic matter ripping and tearing!</span>")
-		else
-			to_chat(loc, "<span class='notice'>You prepare to extend a tentacle.</span>")
-
-
-/obj/item/gun/magic/tentacle/shoot_with_empty_chamber(mob/living/user as mob|obj)
-	to_chat(user, "<span class='warning'>The [name] is not ready yet.</span>")
-
-/obj/item/gun/magic/tentacle/process_fire()
-	. = ..()
-	if(charges == 0)
-		qdel(src)
-
-/obj/item/ammo_casing/magic/tentacle
-	name = "tentacle"
-	desc = "A tentacle."
-	projectile_type = /obj/projectile/tentacle
-	caliber = "tentacle"
-	icon_state = "arrow"
-	firing_effect_type = null
-	var/obj/item/gun/magic/tentacle/gun //the item that shot it
-
-/obj/item/ammo_casing/magic/tentacle/Initialize()
-	gun = loc
-	. = ..()
-
-/obj/item/ammo_casing/magic/tentacle/Destroy()
-	gun = null
-	return ..()
-
-/obj/projectile/tentacle
-	name = "tentacle"
-	icon_state = "tentacle_end"
-	pass_flags = PASSTABLE
-	damage = 0
-	damage_type = BRUTE
-	range = 8
-	hitsound = 'sound/weapons/thudswoosh.ogg'
-	var/chain
-	var/obj/item/ammo_casing/magic/tentacle/source //the item that shot it
-
-/obj/projectile/tentacle/Initialize()
-	source = loc
-	. = ..()
-
-/obj/projectile/tentacle/fire(setAngle)
-	if(firer)
-		chain = firer.Beam(src, icon_state = "tentacle", emissive = FALSE)
-	..()
-
-/obj/projectile/tentacle/proc/reset_throw(mob/living/carbon/human/H)
-	if(H.throw_mode)
-		H.throw_mode_off() //Don't annoy the changeling if he doesn't catch the item
-
-/obj/projectile/tentacle/proc/tentacle_grab(mob/living/carbon/human/H, mob/living/carbon/C)
-	if(H.Adjacent(C))
-		if(H.get_active_held_item() && !H.get_inactive_held_item())
-			H.swap_hand()
-		if(H.get_active_held_item())
-			return
-		C.grabbedby(H)
-		C.grippedby(H, instant = TRUE) //instant aggro grab
-
-/obj/projectile/tentacle/proc/tentacle_stab(mob/living/carbon/human/H, mob/living/carbon/C)
-	if(H.Adjacent(C))
-		for(var/obj/item/I in H.held_items)
-			if(I.get_sharpness())
-				C.visible_message("<span class='danger'>[H] impales [C] with [H.p_their()] [I.name]!</span>", "<span class='userdanger'>[H] impales you with [H.p_their()] [I.name]!</span>")
-				C.apply_damage(I.force, BRUTE, BODY_ZONE_CHEST)
-				H.do_item_attack_animation(C, used_item = I)
-				H.add_mob_blood(C)
-				playsound(get_turf(H),I.hitsound,75,TRUE)
-				return
-
-/obj/projectile/tentacle/on_hit(atom/target, blocked = FALSE)
-	var/mob/living/carbon/human/H = firer
-	if(blocked >= 100)
-		return BULLET_ACT_BLOCK
-	if(isitem(target))
-		var/obj/item/I = target
-		if(!I.anchored)
-			to_chat(firer, "<span class='notice'>You pull [I] towards yourself.</span>")
-			H.throw_mode_on()
-			I.throw_at(H, 10, 2)
-			. = BULLET_ACT_HIT
-
-	else if(isliving(target))
-		var/mob/living/L = target
-		if(!L.anchored && !L.throwing)//avoid double hits
-			if(iscarbon(L))
-				var/mob/living/carbon/C = L
-				var/firer_intent = INTENT_HARM
-				var/mob/M = firer
-				if(istype(M))
-					firer_intent = M.a_intent
-				switch(firer_intent)
-					if(INTENT_HELP)
-						C.visible_message("<span class='danger'>[L] is pulled by [H]'s tentacle!</span>","<span class='userdanger'>A tentacle grabs you and pulls you towards [H]!</span>")
-						C.throw_at(get_step_towards(H,C), 8, 2)
-						return BULLET_ACT_HIT
-
-					if(INTENT_DISARM)
-						var/obj/item/I = C.get_active_held_item()
-						if(I)
-							if(C.dropItemToGround(I))
-								C.visible_message("<span class='danger'>[I] is yanked off [C]'s hand by [src]!</span>","<span class='userdanger'>A tentacle pulls [I] away from you!</span>")
-								on_hit(I) //grab the item as if you had hit it directly with the tentacle
-								return BULLET_ACT_HIT
-							else
-								to_chat(firer, "<span class='warning'>You can't seem to pry [I] off [C]'s hands!</span>")
-								return BULLET_ACT_BLOCK
-						else
-							to_chat(firer, "<span class='danger'>[C] has nothing in hand to disarm!</span>")
-							return BULLET_ACT_HIT
-
-					if(INTENT_GRAB)
-						C.visible_message("<span class='danger'>[L] is grabbed by [H]'s tentacle!</span>","<span class='userdanger'>A tentacle grabs you and pulls you towards [H]!</span>")
-						C.throw_at(get_step_towards(H,C), 8, 2, H, TRUE, TRUE, callback=CALLBACK(src, PROC_REF(tentacle_grab), H, C))
-						return BULLET_ACT_HIT
-
-					if(INTENT_HARM)
-						C.visible_message("<span class='danger'>[L] is thrown towards [H] by a tentacle!</span>","<span class='userdanger'>A tentacle grabs you and throws you towards [H]!</span>")
-						C.throw_at(get_step_towards(H,C), 8, 2, H, TRUE, TRUE, callback=CALLBACK(src, PROC_REF(tentacle_stab), H, C))
-						return BULLET_ACT_HIT
-			else
-				L.visible_message("<span class='danger'>[L] is pulled by [H]'s tentacle!</span>","<span class='userdanger'>A tentacle grabs you and pulls you towards [H]!</span>")
-				L.throw_at(get_step_towards(H,L), 8, 2)
-				. = BULLET_ACT_HIT
-
-/obj/projectile/tentacle/Destroy()
-	qdel(chain)
-	source = null
-	return ..()
-
-
 /***************************************\
 |****************SHIELD*****************|
 \***************************************/
diff --git a/code/modules/antagonists/fugitive/fugitive_outfits.dm b/code/modules/antagonists/fugitive/fugitive_outfits.dm
deleted file mode 100644
index df784813df40..000000000000
--- a/code/modules/antagonists/fugitive/fugitive_outfits.dm
+++ /dev/null
@@ -1,154 +0,0 @@
-/datum/outfit/prisoner
-	name = "Prison Escapee"
-	uniform = /obj/item/clothing/under/rank/prisoner
-	shoes = /obj/item/clothing/shoes/sneakers/orange
-	r_pocket = /obj/item/kitchen/knife/shiv
-
-/datum/outfit/prisoner/post_equip(mob/living/carbon/human/H, visualsOnly=FALSE)
-	if(visualsOnly)
-		return
-	H.fully_replace_character_name(null,"NTP #CC-0[rand(111,999)]") //same as the lavaland prisoner transport, but this time they are from CC, or CentCom
-
-/datum/outfit/yalp_cultist
-	name = "Cultist of Yalp Elor"
-	uniform = /obj/item/clothing/under/rank/civilian/chaplain
-	suit = /obj/item/clothing/suit/chaplainsuit/holidaypriest
-	gloves = /obj/item/clothing/gloves/color/red
-	shoes = /obj/item/clothing/shoes/sneakers/black
-	mask = /obj/item/clothing/mask/gas/tiki_mask/yalp_elor
-
-/datum/outfit/waldo
-	name = "Waldo"
-	uniform = /obj/item/clothing/under/pants/jeans
-	suit = /obj/item/clothing/suit/striped_sweater
-	head = /obj/item/clothing/head/beanie/waldo
-	shoes = /obj/item/clothing/shoes/sneakers/brown
-	ears = /obj/item/radio/headset
-	glasses = /obj/item/clothing/glasses/regular/circle
-
-/datum/outfit/waldo/post_equip(mob/living/carbon/human/H, visualsOnly=FALSE)
-	if(visualsOnly)
-		return
-	H.fully_replace_character_name(null,"Waldo")
-	H.eye_color = "000"
-	H.gender = MALE
-	H.skin_tone = "caucasian3"
-	H.hairstyle = "Business Hair 3"
-	H.facial_hairstyle = "Shaved"
-	H.hair_color = "000"
-	H.facial_hair_color = H.hair_color
-	H.update_body()
-	if(H.mind)
-		H.mind.AddSpell(new /obj/effect/proc_holder/spell/aoe_turf/knock(null))
-	var/list/no_drops = list()
-	no_drops += H.get_item_by_slot(ITEM_SLOT_FEET)
-	no_drops += H.get_item_by_slot(ITEM_SLOT_ICLOTHING)
-	no_drops += H.get_item_by_slot(ITEM_SLOT_OCLOTHING)
-	no_drops += H.get_item_by_slot(ITEM_SLOT_HEAD)
-	no_drops += H.get_item_by_slot(ITEM_SLOT_EYES)
-	for(var/i in no_drops)
-		var/obj/item/I = i
-		ADD_TRAIT(I, TRAIT_NODROP, CURSED_ITEM_TRAIT)
-
-/datum/outfit/synthetic
-	name = "Factory Error Synth"
-	uniform = /obj/item/clothing/under/color/white
-	ears = /obj/item/radio/headset
-
-/datum/outfit/synthetic/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE)
-	if(visualsOnly)
-		return
-	var/obj/item/organ/eyes/robotic/glow/eyes = new()
-	eyes.Insert(src, drop_if_replaced = FALSE)
-
-/datum/outfit/spacepol
-	name = "Spacepol Officer"
-	uniform = /obj/item/clothing/under/rank/security/officer/beatcop
-	suit = /obj/item/clothing/suit/armor/vest/blueshirt
-	belt = /obj/item/gun/ballistic/automatic/pistol/candor
-	head = /obj/item/clothing/head/helmet/police
-	gloves = /obj/item/clothing/gloves/tackler/combat
-	shoes = /obj/item/clothing/shoes/jackboots
-	mask = /obj/item/clothing/mask/gas/sechailer/swat/spacepol
-	glasses = /obj/item/clothing/glasses/sunglasses
-	ears = /obj/item/radio/headset
-	l_pocket = /obj/item/ammo_box/magazine/m45
-	r_pocket = /obj/item/restraints/handcuffs
-	id = /obj/item/card/id
-
-/datum/outfit/spacepol/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE)
-	if(visualsOnly)
-		return
-	var/obj/item/card/id/W = H.wear_id
-	W.assignment = "Police Officer"
-	W.registered_name = H.real_name
-	W.update_label()
-
-/datum/outfit/frontier/hunter
-	name = "Frontiersman Corpse (Hunter)"
-	ears = /obj/item/radio/headset
-	r_hand = /obj/item/gun/ballistic/rifle/illestren
-
-/datum/outfit/frontier/hunter/pre_equip(mob/living/carbon/human/H)
-	if(prob(50))
-		head = /obj/item/clothing/head/trapper
-
-/datum/outfit/bountyarmor
-	name = "Bounty Hunter - Armored"
-	uniform = /obj/item/clothing/under/rank/prisoner
-	head = /obj/item/clothing/head/hunter
-	suit = /obj/item/clothing/suit/space/hunter
-	gloves = /obj/item/clothing/gloves/tackler/combat
-	shoes = /obj/item/clothing/shoes/jackboots
-	mask = /obj/item/clothing/mask/gas/hunter
-	glasses = /obj/item/clothing/glasses/sunglasses/garb
-	ears = /obj/item/radio/headset
-	l_pocket = /obj/item/tank/internals/emergency_oxygen
-	r_pocket = /obj/item/restraints/handcuffs/cable
-	id = /obj/item/card/id
-	r_hand = /obj/item/flamethrower/full/tank
-
-/datum/outfit/bountyarmor/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE)
-	if(visualsOnly)
-		return
-	var/obj/item/card/id/W = H.wear_id
-	W.assignment = "Bounty Hunter"
-	W.registered_name = H.real_name
-	W.update_label()
-
-/datum/outfit/bountyhook
-	name = "Bounty Hunter - Hook"
-	uniform = /obj/item/clothing/under/rank/prisoner
-	back = /obj/item/storage/backpack
-	head = /obj/item/clothing/head/scarecrow_hat
-	gloves = /obj/item/clothing/gloves/botanic_leather
-	ears = /obj/item/radio/headset
-	shoes = /obj/item/clothing/shoes/jackboots
-	mask = /obj/item/clothing/mask/scarecrow
-	r_pocket = /obj/item/restraints/handcuffs/cable
-	id = /obj/item/card/id
-	r_hand = /obj/item/gun/ballistic/shotgun/doublebarrel/hook
-
-	backpack_contents = list(
-		/obj/item/ammo_casing/shotgun/incapacitate = 6
-		)
-
-/datum/outfit/bountyhook/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE)
-	if(visualsOnly)
-		return
-	var/obj/item/card/id/W = H.wear_id
-	W.assignment = "Bounty Hunter"
-	W.registered_name = H.real_name
-	W.update_label()
-
-/datum/outfit/bountysynth
-	name = "Bounty Hunter - Synth"
-	uniform = /obj/item/clothing/under/rank/prisoner
-	back = /obj/item/storage/backpack
-	suit = /obj/item/clothing/suit/armor/riot
-	shoes = /obj/item/clothing/shoes/jackboots
-	glasses = /obj/item/clothing/glasses/eyepatch
-	r_pocket = /obj/item/restraints/handcuffs/cable
-	ears = /obj/item/radio/headset
-	id = /obj/item/card/id
-	r_hand = /obj/item/storage/firstaid/regular
diff --git a/code/modules/antagonists/wizard/equipment/spellbook.dm b/code/modules/antagonists/wizard/equipment/spellbook.dm
index 690cf94cd9a3..69ff4bcfc2f5 100644
--- a/code/modules/antagonists/wizard/equipment/spellbook.dm
+++ b/code/modules/antagonists/wizard/equipment/spellbook.dm
@@ -106,10 +106,6 @@
 	name = "Fireball"
 	spell_type = /obj/effect/proc_holder/spell/aimed/fireball
 
-/datum/spellbook_entry/spell_cards
-	name = "Spell Cards"
-	spell_type = /obj/effect/proc_holder/spell/aimed/spell_cards
-
 /datum/spellbook_entry/rod_form
 	name = "Rod Form"
 	spell_type = /obj/effect/proc_holder/spell/targeted/rod_form
diff --git a/code/modules/awaymissions/mission_code/snowdin.dm b/code/modules/awaymissions/mission_code/snowdin.dm
index c7aa46af728b..b64a2abf02de 100644
--- a/code/modules/awaymissions/mission_code/snowdin.dm
+++ b/code/modules/awaymissions/mission_code/snowdin.dm
@@ -487,7 +487,6 @@
 				/obj/item/shield/energy = 6,
 				/obj/item/shield/riot/tele = 12,
 				/obj/item/dnainjector/lasereyesmut = 7,
-				/obj/item/gun/magic/wand/fireball/inert = 3,
 				/obj/item/pneumatic_cannon = 15,
 				/obj/item/melee/transforming/energy/sword = 7,
 				/obj/item/book/granter/spell/knock = 15,
@@ -515,8 +514,6 @@
 				/obj/item/dualsaber = 15,
 				/obj/item/organ/heart/demon = 7,
 				/obj/item/gun/ballistic/automatic/smg/c20r = 16,
-				/obj/item/gun/magic/wand/resurrection/inert = 15,
-				/obj/item/gun/magic/wand/resurrection = 10,
 				/obj/item/uplink/old = 2,
 				/obj/item/book/granter/spell/charge = 12,
 				/obj/item/grenade/clusterbuster/spawner_manhacks = 15,
@@ -556,16 +553,6 @@
 	desc = "High speed, low drag combat boots, now with an added layer of insulation."
 	min_cold_protection_temperature = FIRE_SUIT_MIN_TEMP_PROTECT
 
-/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
-
-/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."
-	max_charges = 5
-
 /obj/effect/mob_spawn/human/syndicatesoldier/coldres
 	name = "Syndicate Snow Operative"
 	outfit = /datum/outfit/snowsyndie/corpse
diff --git a/code/modules/cargo/exports/lavaland.dm b/code/modules/cargo/exports/lavaland.dm
index e325b8e8d09b..25438e1d4728 100644
--- a/code/modules/cargo/exports/lavaland.dm
+++ b/code/modules/cargo/exports/lavaland.dm
@@ -7,7 +7,6 @@
 	unit_name = "minor lava planet artifact"
 	export_types = list(/obj/item/immortality_talisman,
 						/obj/item/book_of_babel,
-						/obj/item/gun/magic/hook,
 						/obj/item/wisp_lantern,
 						/obj/item/reagent_containers/glass/bottle/potion/flight,
 						/obj/item/katana/cursed,
diff --git a/code/modules/mining/lavaland/necropolis_chests.dm b/code/modules/mining/lavaland/necropolis_chests.dm
index 4edc13071932..61a0158618c4 100644
--- a/code/modules/mining/lavaland/necropolis_chests.dm
+++ b/code/modules/mining/lavaland/necropolis_chests.dm
@@ -66,8 +66,6 @@
 			new /obj/item/wisp_lantern(src)
 		if(20)
 			new /obj/item/immortality_talisman(src)
-		if(21)
-			new /obj/item/gun/magic/hook(src)
 		if(22)
 			new /obj/item/voodoo(src)
 		if(23)
@@ -143,8 +141,6 @@
 				new /obj/item/wisp_lantern(src)
 			if(20)
 				new /obj/item/immortality_talisman(src)
-			if(21)
-				new /obj/item/gun/magic/hook(src)
 			if(22)
 				new /obj/item/voodoo(src)
 			if(23)
@@ -481,91 +477,6 @@
 /obj/effect/warp_cube/ex_act(severity, target)
 	return
 
-//Meat Hook
-/obj/item/gun/magic/hook
-	name = "meat hook"
-	desc = "A light hooked blade, attached by the handle to a long chain. Can be used to make quick strikes in hand, or thrown at enemies, magically dragging them to the user. <b>Get over here!</b>"
-	ammo_type = /obj/item/ammo_casing/magic/hook
-	icon_state = "hook"
-	item_state = "hook"
-	lefthand_file = 'icons/mob/inhands/weapons/melee_lefthand.dmi'
-	righthand_file = 'icons/mob/inhands/weapons/melee_righthand.dmi'
-	fire_sound = 'sound/weapons/batonextend.ogg'
-	max_charges = 1
-	item_flags = NEEDS_PERMIT
-	force = 15
-	sharpness = IS_SHARP
-	block_chance = 5//A pittance, but might be worth something in a scuffle
-	hitsound = 'sound/weapons/chainhit.ogg'
-
-/obj/item/gun/magic/hook/melee_attack_chain(mob/user, atom/target, params)
-	..()
-	user.changeNext_move(CLICK_CD_MELEE * 0.5)//quick to swing. 15 force can be quite something with this attack frequency.
-
-/obj/item/gun/magic/hook/Initialize()
-	. = ..()
-	AddComponent(/datum/component/butchering, 15, 130, 0, hitsound)
-
-/obj/item/ammo_casing/magic/hook
-	name = "hook"
-	desc = "A hook."
-	projectile_type = /obj/projectile/hook
-	caliber = "hook"
-	icon_state = "arrow"
-
-/obj/projectile/hook
-	name = "hook"
-	icon_state = "hook"
-	icon = 'icons/obj/lavaland/artefacts.dmi'
-	pass_flags = PASSTABLE
-	damage = 20
-	stamina = 20
-	armour_penetration = 60
-	damage_type = BRUTE
-	hitsound = 'sound/effects/splat.ogg'
-	var/chain
-	var/knockdown_time = (0.5 SECONDS)
-
-/obj/projectile/hook/fire(setAngle)
-	if(firer)
-		chain = firer.Beam(src, icon_state = "chain", emissive = FALSE)
-	..()
-	//TODO: root the firer until the chain returns
-
-/obj/projectile/hook/on_hit(atom/target)
-	. = ..()
-	if(ismovable(target))
-		var/atom/movable/A = target
-		if(A.anchored)
-			return
-		A.visible_message("<span class='danger'>[A] is snagged by [firer]'s hook!</span>")
-		new /datum/forced_movement(A, get_turf(firer), 5, TRUE)
-		if (isliving(target))
-			var/mob/living/fresh_meat = target
-			fresh_meat.Knockdown(knockdown_time)
-			return
-		//TODO: keep the chain beamed to A
-		//TODO: needs a callback to delete the chain
-
-/obj/projectile/hook/Destroy()
-	qdel(chain)
-	return ..()
-
-//just a nerfed version of the real thing for the bounty hunters.
-/obj/item/gun/magic/hook/bounty
-	name = "hook"
-	ammo_type = /obj/item/ammo_casing/magic/hook/bounty
-
-/obj/item/gun/magic/hook/bounty/shoot_with_empty_chamber(mob/living/user)
-	to_chat(user, "<span class='warning'>The [src] isn't ready to fire yet!</span>")
-
-/obj/item/ammo_casing/magic/hook/bounty
-	projectile_type = /obj/projectile/hook/bounty
-
-/obj/projectile/hook/bounty
-	damage = 0
-	stamina = 40
-
 //Immortality Talisman: Now with state-of-the-art panic button technology
 /obj/item/immortality_talisman
 	name = "\improper Immortality Talisman"
@@ -1270,7 +1181,6 @@
 			new /obj/item/lava_staff(src)
 		if(3)
 			new /obj/item/book/granter/spell/sacredflame(src)
-			new /obj/item/gun/magic/wand/fireball(src)
 		if(4)
 			new /obj/item/dragons_blood(src)
 
diff --git a/code/modules/mob/living/simple_animal/hostile/megafauna/codename_claw.dm b/code/modules/mob/living/simple_animal/hostile/megafauna/codename_claw.dm
index cca8a649353f..59ab203d4a85 100644
--- a/code/modules/mob/living/simple_animal/hostile/megafauna/codename_claw.dm
+++ b/code/modules/mob/living/simple_animal/hostile/megafauna/codename_claw.dm
@@ -146,7 +146,7 @@
 			if(3) //only should fire duing phase 2
 				emp_pulse()
 			if(4)
-				tentacle(target)
+				sting_attack(target)
 			if(5)
 				summon_creatures()
 			if(6)
@@ -161,10 +161,7 @@
 			swift_dash(target, dash_num_long, 15)
 	else
 		if((get_dist(src, target) >= 4) && ((get_dist(src, target)) <= 8) && !shouldnt_move)
-			if(prob(60))
-				tentacle(target)
-				return
-			else if(prob(40))
+			if(prob(40))
 				sting_attack(target)
 				return
 			else
@@ -230,15 +227,6 @@
 	empulse(src, 2, 4)
 	shouldnt_move = FALSE
 
-/////TENTACLE
-/mob/living/simple_animal/hostile/megafauna/claw/proc/tentacle(target)
-	shake_animation(2)
-	projectiletype = /obj/projectile/tentacle
-	projectilesound = 'sound/effects/splat.ogg'
-	Shoot(target)
-
-/////TENTACLE END
-
 /////STING ATTACK
 /mob/living/simple_animal/hostile/megafauna/claw/proc/sting_attack(target)
 	shouldnt_move = TRUE
diff --git a/code/modules/mob/living/simple_animal/hostile/mimic.dm b/code/modules/mob/living/simple_animal/hostile/mimic.dm
index ca595d4d682f..0568533c1e0c 100644
--- a/code/modules/mob/living/simple_animal/hostile/mimic.dm
+++ b/code/modules/mob/living/simple_animal/hostile/mimic.dm
@@ -205,7 +205,6 @@ GLOBAL_LIST_INIT(protected_objects, list(/obj/structure/table, /obj/structure/ca
 
 /mob/living/simple_animal/hostile/mimic/copy/ranged
 	var/obj/item/gun/TrueGun = null
-	var/obj/item/gun/magic/Zapstick
 	var/obj/item/gun/ballistic/Pewgun
 	var/obj/item/gun/energy/Zapgun
 
@@ -223,10 +222,6 @@ GLOBAL_LIST_INIT(protected_objects, list(/obj/structure/table, /obj/structure/ca
 		move_to_delay = 2 * G.w_class + 1
 		projectilesound = G.fire_sound
 		TrueGun = G
-		if(istype(G, /obj/item/gun/magic))
-			Zapstick = G
-			var/obj/item/ammo_casing/magic/M = Zapstick.ammo_type
-			projectiletype = initial(M.projectile_type)
 		if(istype(G, /obj/item/gun/ballistic))
 			Pewgun = G
 			var/obj/item/ammo_box/magazine/M = Pewgun.mag_type
@@ -245,11 +240,6 @@ GLOBAL_LIST_INIT(protected_objects, list(/obj/structure/table, /obj/structure/ca
 				Zapgun.cell.use(shot.e_cost)
 				Zapgun.update_appearance()
 				..()
-	else if(Zapstick)
-		if(Zapstick.charges)
-			Zapstick.charges--
-			Zapstick.update_appearance()
-			..()
 	else if(Pewgun)
 		if(Pewgun.chambered)
 			if(Pewgun.chambered.BB)
diff --git a/code/modules/projectiles/boxes_magazines/internal/misc.dm b/code/modules/projectiles/boxes_magazines/internal/misc.dm
index 1d4316560e92..55b749ac3333 100644
--- a/code/modules/projectiles/boxes_magazines/internal/misc.dm
+++ b/code/modules/projectiles/boxes_magazines/internal/misc.dm
@@ -1,9 +1,3 @@
-/obj/item/ammo_box/magazine/internal/hook
-	name = "hook internal tube"
-	ammo_type = /obj/item/ammo_casing/magic/hook
-	caliber = "hook"
-	max_ammo = 1
-
 /obj/item/ammo_box/magazine/internal/bow
 	name = "bowstring"
 	ammo_type = /obj/item/ammo_casing/caseless/arrow
diff --git a/code/modules/projectiles/gun.dm b/code/modules/projectiles/gun.dm
index c524ffd36516..4ffcf6cb6828 100644
--- a/code/modules/projectiles/gun.dm
+++ b/code/modules/projectiles/gun.dm
@@ -16,6 +16,7 @@
 #define MANUFACTURER_DONKCO "the Donk! Co. logo"
 #define MANUFACTURER_PGF "the Etherbor Industries emblem"
 #define MANUFACTURER_IMPORT "Lanchester Import Co."
+
 /obj/item/gun
 	name = "gun"
 	desc = "It's a gun. It's pretty terrible, though."
diff --git a/code/modules/projectiles/guns/ballistic/shotgun.dm b/code/modules/projectiles/guns/ballistic/shotgun.dm
index 0b7e526c8a2b..58873cf387e2 100644
--- a/code/modules/projectiles/guns/ballistic/shotgun.dm
+++ b/code/modules/projectiles/guns/ballistic/shotgun.dm
@@ -433,52 +433,6 @@
 	sawn_off = TRUE
 	slot_flags = ITEM_SLOT_BELT
 
-/obj/item/gun/ballistic/shotgun/doublebarrel/hook
-	name = "hook modified sawn-off shotgun"
-	desc = "Range isn't an issue when you can bring your victim to you."
-	icon_state = "hookshotgun"
-	icon = 'icons/obj/guns/projectile.dmi'
-	item_state = "shotgun"
-	load_sound = 'sound/weapons/gun/shotgun/insert_shell.ogg'
-	mag_type = /obj/item/ammo_box/magazine/internal/shot/bounty
-	w_class = WEIGHT_CLASS_BULKY
-	weapon_weight = WEAPON_MEDIUM
-	can_be_sawn_off = FALSE
-	force = 16 //it has a hook on it
-	attack_verb = list("slashed", "hooked", "stabbed")
-	hitsound = 'sound/weapons/bladeslice.ogg'
-	//our hook gun!
-	var/obj/item/gun/magic/hook/bounty/hook
-	var/toggled = FALSE
-
-/obj/item/gun/ballistic/shotgun/doublebarrel/hook/Initialize()
-	. = ..()
-	hook = new /obj/item/gun/magic/hook/bounty(src)
-
-/obj/item/gun/ballistic/shotgun/doublebarrel/hook/AltClick(mob/user)
-	if(!istype(user) || !user.canUseTopic(src, BE_CLOSE, ismonkey(user)))
-		return
-	if(toggled)
-		to_chat(user,"<span class='notice'>You switch to the shotgun.</span>")
-		fire_sound = initial(fire_sound)
-	else
-		to_chat(user,"<span class='notice'>You switch to the hook.</span>")
-		fire_sound = 'sound/weapons/batonextend.ogg'
-	toggled = !toggled
-
-/obj/item/gun/ballistic/shotgun/doublebarrel/hook/examine(mob/user)
-	. = ..()
-	if(toggled)
-		. += "<span class='notice'>Alt-click to switch to the shotgun.</span>"
-	else
-		. += "<span class='notice'>Alt-click to switch to the hook.</span>"
-
-/obj/item/gun/ballistic/shotgun/doublebarrel/hook/afterattack(atom/target, mob/living/user, flag, params)
-	if(toggled)
-		hook.afterattack(target, user, flag, params)
-	else
-		return ..()
-
 /obj/item/gun/ballistic/shotgun/automatic/combat/compact/compact
 	name = "compact compact combat shotgun"
 	desc = "A compact version of the compact version of the semi automatic combat shotgun. For when you want a gun the same size as your brain."
diff --git a/code/modules/projectiles/guns/magic.dm b/code/modules/projectiles/guns/magic.dm
deleted file mode 100644
index be2f2394a543..000000000000
--- a/code/modules/projectiles/guns/magic.dm
+++ /dev/null
@@ -1,84 +0,0 @@
-/obj/item/gun/magic
-	name = "staff of nothing"
-	desc = "This staff is boring to watch because even though it came first you've seen everything it can do in other staves for years."
-	icon = 'icons/obj/guns/magic.dmi'
-	icon_state = "staffofnothing"
-	item_state = "staff"
-	lefthand_file = 'icons/mob/inhands/items_lefthand.dmi' //not really a gun and some toys use these inhands
-	righthand_file = 'icons/mob/inhands/items_righthand.dmi'
-	fire_sound = 'sound/weapons/emitter.ogg'
-	flags_1 =  CONDUCT_1
-	w_class = WEIGHT_CLASS_HUGE
-	var/checks_antimagic = TRUE
-	var/max_charges = 6
-	var/charges = 0
-	var/recharge_rate = 4
-	var/charge_tick = 0
-	var/can_charge = TRUE
-	var/ammo_type
-	var/no_den_usage
-	trigger_guard = TRIGGER_GUARD_ALLOW_ALL // Has no trigger at all, uses magic instead
-
-/obj/item/gun/magic/process_fire(atom/target, mob/living/user, message, params, zone_override, bonus_spread)
-	if(no_den_usage)
-		var/area/A = get_area(user)
-		if(istype(A, /area/wizard_station))
-			add_fingerprint(user)
-			to_chat(user, "<span class='warning'>You know better than to violate the security of The Den, best wait until you leave to use [src].</span>")
-			return
-		else
-			no_den_usage = 0
-	if(checks_antimagic && user.anti_magic_check(TRUE, FALSE, FALSE, 0, TRUE))
-		add_fingerprint(user)
-		to_chat(user, "<span class='warning'>Something is interfering with [src].</span>")
-		return
-	. = ..()
-
-/obj/item/gun/magic/can_shoot()
-	return charges
-
-/obj/item/gun/magic/recharge_newshot()
-	if (charges && chambered && !chambered.BB)
-		chambered.newshot()
-
-/obj/item/gun/magic/process_chamber()
-	if(chambered && !chambered.BB) //if BB is null, i.e the shot has been fired...
-		charges--//... drain a charge
-		recharge_newshot()
-
-/obj/item/gun/magic/Initialize()
-	. = ..()
-	charges = max_charges
-	if(ammo_type)
-		chambered = new ammo_type(src)
-	if(can_charge)
-		START_PROCESSING(SSobj, src)
-
-
-/obj/item/gun/magic/Destroy()
-	if(can_charge)
-		STOP_PROCESSING(SSobj, src)
-	return ..()
-
-
-/obj/item/gun/magic/process()
-	if (charges >= max_charges)
-		charge_tick = 0
-		return
-	charge_tick++
-	if(charge_tick < recharge_rate)
-		return 0
-	charge_tick = 0
-	charges++
-	if(charges == 1)
-		recharge_newshot()
-	return 1
-
-/obj/item/gun/magic/shoot_with_empty_chamber(mob/living/user as mob|obj)
-	to_chat(user, "<span class='warning'>The [name] whizzles quietly.</span>")
-
-/obj/item/gun/magic/vv_edit_var(var_name, var_value)
-	. = ..()
-	switch(var_name)
-		if(NAMEOF(src, charges))
-			recharge_newshot()
diff --git a/code/modules/projectiles/projectile/magic.dm b/code/modules/projectiles/projectile/magic.dm
deleted file mode 100644
index 67a91efa0f61..000000000000
--- a/code/modules/projectiles/projectile/magic.dm
+++ /dev/null
@@ -1,21 +0,0 @@
-/obj/projectile/magic
-	name = "bolt"
-	icon_state = "energy"
-	damage = 0
-	damage_type = OXY
-	nodamage = TRUE
-	armour_penetration = 100
-	flag = "magic"
-
-/obj/projectile/magic/aoe
-	name = "Area Bolt"
-	desc = "What the fuck does this do?!"
-	damage = 0
-	var/proxdet = TRUE
-
-/obj/projectile/magic/aoe/Range()
-	if(proxdet)
-		for(var/mob/living/L in range(1, get_turf(src)))
-			if(L.stat != DEAD && L != firer && !L.anti_magic_check())
-				return Bump(L)
-	..()
diff --git a/code/modules/research/xenobiology/crossbreeding/_weapons.dm b/code/modules/research/xenobiology/crossbreeding/_weapons.dm
index 29ea3fbd4298..ac663059d0c0 100644
--- a/code/modules/research/xenobiology/crossbreeding/_weapons.dm
+++ b/code/modules/research/xenobiology/crossbreeding/_weapons.dm
@@ -65,54 +65,3 @@ Slimecrossing Weapons
 /obj/item/shield/adamantineshield/ComponentInitialize()
 	. = ..()
 	AddComponent(/datum/component/two_handed, require_twohands=TRUE, force_wielded=15)
-
-//Bloodchiller - Chilling Green
-/obj/item/gun/magic/bloodchill
-	name = "blood chiller"
-	desc = "A horrifying weapon made of your own bone and blood vessels. It shoots slowing globules of your own blood. Ech."
-	icon = 'icons/obj/slimecrossing.dmi'
-	icon_state = "bloodgun"
-	item_state = "bloodgun"
-	lefthand_file = 'icons/mob/inhands/weapons/guns_lefthand.dmi'
-	righthand_file = 'icons/mob/inhands/weapons/guns_righthand.dmi'
-	item_flags = ABSTRACT | DROPDEL
-	w_class = WEIGHT_CLASS_HUGE
-	slot_flags = NONE
-	force = 5
-	max_charges = 1 //Recharging costs blood.
-	recharge_rate = 1
-	ammo_type = /obj/item/ammo_casing/magic/bloodchill
-	fire_sound = 'sound/effects/attackblob.ogg'
-
-/obj/item/gun/magic/bloodchill/Initialize()
-	. = ..()
-	ADD_TRAIT(src, TRAIT_NODROP, HAND_REPLACEMENT_TRAIT)
-
-/obj/item/gun/magic/bloodchill/process()
-	charge_tick++
-	if(charge_tick < recharge_rate || charges >= max_charges)
-		return 0
-	charge_tick = 0
-	var/mob/living/M = loc
-	if(istype(M) && M.blood_volume >= 20)
-		charges++
-		M.blood_volume -= 20
-	if(charges == 1)
-		recharge_newshot()
-	return 1
-
-/obj/item/ammo_casing/magic/bloodchill
-	projectile_type = /obj/projectile/magic/bloodchill
-
-/obj/projectile/magic/bloodchill
-	name = "blood ball"
-	icon_state = "pulse0_bl"
-	damage = 0
-	damage_type = OXY
-	nodamage = TRUE
-	hitsound = 'sound/effects/splat.ogg'
-
-/obj/projectile/magic/bloodchill/on_hit(mob/living/target)
-	. = ..()
-	if(isliving(target))
-		target.apply_status_effect(/datum/status_effect/bloodchill)
diff --git a/code/modules/research/xenobiology/crossbreeding/chilling.dm b/code/modules/research/xenobiology/crossbreeding/chilling.dm
index 89fa16cca7f5..9fe7857c073b 100644
--- a/code/modules/research/xenobiology/crossbreeding/chilling.dm
+++ b/code/modules/research/xenobiology/crossbreeding/chilling.dm
@@ -235,29 +235,6 @@ Chilling extracts:
 		user.visible_message("<span class='notice'>[src] lets out a peaceful ring as it shatters, but nothing happens...</span>")
 	..()
 
-/obj/item/slimecross/chilling/green
-	colour = "green"
-	effect_desc = "Creates a bone gun in the hand it is used in, which uses blood as ammo."
-
-/obj/item/slimecross/chilling/green/do_effect(mob/user)
-	var/which_hand = "l_hand"
-	if(!(user.active_hand_index % 2))
-		which_hand = "r_hand"
-	var/mob/living/L = user
-	if(!istype(user))
-		return
-	var/obj/item/held = L.get_active_held_item() //This should be itself, but just in case...
-	L.dropItemToGround(held)
-	var/obj/item/gun/magic/bloodchill/gun = new(user)
-	if(!L.put_in_hands(gun))
-		qdel(gun)
-		user.visible_message("<span class='warning'>[src] flash-freezes [user]'s arm, cracking the flesh horribly!</span>")
-	else
-		user.visible_message("<span class='danger'>[src] chills and snaps off the front of the bone on [user]'s arm, leaving behind a strange, gun-like structure!</span>")
-	user.emote("scream")
-	L.apply_damage(30,BURN,which_hand)
-	..()
-
 /obj/item/slimecross/chilling/pink
 	colour = "pink"
 	effect_desc = "Creates a slime corgi puppy."
diff --git a/code/modules/spells/spell_types/aimed.dm b/code/modules/spells/spell_types/aimed.dm
index 8e502cd592f5..46737c5b5a99 100644
--- a/code/modules/spells/spell_types/aimed.dm
+++ b/code/modules/spells/spell_types/aimed.dm
@@ -130,60 +130,3 @@
 	var/range = 6 + 2*spell_level
 	projectile_var_overrides = list("range" = range)
 	return ..()
-
-/obj/effect/proc_holder/spell/aimed/spell_cards
-	name = "Spell Cards"
-	desc = "Blazing hot rapid-fire homing cards. Send your foes to the shadow realm with their mystical power!"
-	school = "evocation"
-	charge_max = 50
-	clothes_req = FALSE
-	invocation = "Sigi'lu M'Fan 'Tasia"
-	invocation_type = INVOCATION_SHOUT
-	range = 40
-	cooldown_min = 10
-	projectile_amount = 5
-	projectiles_per_fire = 7
-	projectile_type = /obj/projectile/spellcard
-	base_icon_state = "spellcard"
-	action_icon_state = "spellcard0"
-	var/datum/weakref/current_target_weakref
-	var/projectile_turnrate = 10
-	var/projectile_pixel_homing_spread = 32
-	var/projectile_initial_spread_amount = 30
-	var/projectile_location_spread_amount = 12
-	var/datum/component/lockon_aiming/lockon_component
-	ranged_clickcd_override = TRUE
-
-/obj/effect/proc_holder/spell/aimed/spell_cards/on_activation(mob/M)
-	QDEL_NULL(lockon_component)
-	lockon_component = M.AddComponent(/datum/component/lockon_aiming, 5, typecacheof(list(/mob/living)), 1, null, CALLBACK(src, PROC_REF(on_lockon_component)))
-
-/obj/effect/proc_holder/spell/aimed/spell_cards/proc/on_lockon_component(list/locked_weakrefs)
-	if(!length(locked_weakrefs))
-		current_target_weakref = null
-		return
-	current_target_weakref = locked_weakrefs[1]
-	var/atom/A = current_target_weakref.resolve()
-	if(A)
-		var/mob/M = lockon_component.parent
-		M.face_atom(A)
-
-/obj/effect/proc_holder/spell/aimed/spell_cards/on_deactivation(mob/M)
-	QDEL_NULL(lockon_component)
-
-/obj/effect/proc_holder/spell/aimed/spell_cards/ready_projectile(obj/projectile/P, atom/target, mob/user, iteration)
-	if(current_target_weakref)
-		var/atom/A = current_target_weakref.resolve()
-		if(A && get_dist(A, user) < 7)
-			P.homing_turn_speed = projectile_turnrate
-			P.homing_inaccuracy_min = projectile_pixel_homing_spread
-			P.homing_inaccuracy_max = projectile_pixel_homing_spread
-			P.set_homing_target(current_target_weakref.resolve())
-	var/rand_spr = rand()
-	var/total_angle = projectile_initial_spread_amount * 2
-	var/adjusted_angle = total_angle - ((projectile_initial_spread_amount / projectiles_per_fire) * 0.5)
-	var/one_fire_angle = adjusted_angle / projectiles_per_fire
-	var/current_angle = iteration * one_fire_angle * rand_spr - (projectile_initial_spread_amount / 2)
-	P.pixel_x = rand(-projectile_location_spread_amount, projectile_location_spread_amount)
-	P.pixel_y = rand(-projectile_location_spread_amount, projectile_location_spread_amount)
-	P.preparePixelProjectile(target, user, null, current_angle)
diff --git a/code/modules/spells/spell_types/charge.dm b/code/modules/spells/spell_types/charge.dm
index 57325e685f4d..225c36580e49 100644
--- a/code/modules/spells/spell_types/charge.dm
+++ b/code/modules/spells/spell_types/charge.dm
@@ -51,20 +51,6 @@
 					I.used = FALSE
 					charged_item = I
 					break
-			else if(istype(item, /obj/item/gun/magic))
-				var/obj/item/gun/magic/I = item
-				if(prob(80) && !I.can_charge)
-					I.max_charges--
-				if(I.max_charges <= 0)
-					I.max_charges = 0
-					burnt_out = TRUE
-				I.charges = I.max_charges
-				if(istype(item, /obj/item/gun/magic/wand) && I.max_charges != 0)
-					var/obj/item/gun/magic/W = item
-					W.icon_state = initial(W.icon_state)
-				I.recharge_newshot()
-				charged_item = I
-				break
 			else if(istype(item, /obj/item/stock_parts/cell))
 				var/obj/item/stock_parts/cell/C = item
 				if(!C.self_recharge)
diff --git a/shiptest.dme b/shiptest.dme
index 845389607403..c16cbd645b83 100644
--- a/shiptest.dme
+++ b/shiptest.dme
@@ -1333,7 +1333,6 @@
 #include "code\game\objects\structures\fireplace.dm"
 #include "code\game\objects\structures\flora.dm"
 #include "code\game\objects\structures\fluff.dm"
-#include "code\game\objects\structures\fugitive_role_spawners.dm"
 #include "code\game\objects\structures\ghost_role_spawners.dm"
 #include "code\game\objects\structures\girders.dm"
 #include "code\game\objects\structures\grille.dm"
@@ -1685,7 +1684,6 @@
 #include "code\modules\antagonists\ert\nanotrasen.dm"
 #include "code\modules\antagonists\ert\solgov.dm"
 #include "code\modules\antagonists\ert\syndicate.dm"
-#include "code\modules\antagonists\fugitive\fugitive_outfits.dm"
 #include "code\modules\antagonists\gang\outfits.dm"
 #include "code\modules\antagonists\greentext\greentext.dm"
 #include "code\modules\antagonists\magic_servant\servant.dm"
@@ -3007,7 +3005,6 @@
 #include "code\modules\projectiles\guns\ballistic.dm"
 #include "code\modules\projectiles\guns\energy.dm"
 #include "code\modules\projectiles\guns\gunhud.dm"
-#include "code\modules\projectiles\guns\magic.dm"
 #include "code\modules\projectiles\guns\powered.dm"
 #include "code\modules\projectiles\guns\ballistic\assault.dm"
 #include "code\modules\projectiles\guns\ballistic\automatic.dm"
@@ -3039,7 +3036,6 @@
 #include "code\modules\projectiles\guns\misc\syringe_gun.dm"
 #include "code\modules\projectiles\projectile\beams.dm"
 #include "code\modules\projectiles\projectile\bullets.dm"
-#include "code\modules\projectiles\projectile\magic.dm"
 #include "code\modules\projectiles\projectile\bullets\_incendiary.dm"
 #include "code\modules\projectiles\projectile\bullets\dart_syringe.dm"
 #include "code\modules\projectiles\projectile\bullets\dnainjector.dm"

From 5e86a5737120397e9e32295cd4a15957ed11e7d7 Mon Sep 17 00:00:00 2001
From: FalloutFalcon <falloutfalconplays@gmail.com>
Date: Wed, 10 Apr 2024 22:34:36 -0500
Subject: [PATCH 72/89] fix

---
 _maps/shuttles/syndicate/syndicate_gorlex_komodo.dmm | 3 ---
 1 file changed, 3 deletions(-)

diff --git a/_maps/shuttles/syndicate/syndicate_gorlex_komodo.dmm b/_maps/shuttles/syndicate/syndicate_gorlex_komodo.dmm
index b5135c604f0e..8e7bb5ba895f 100644
--- a/_maps/shuttles/syndicate/syndicate_gorlex_komodo.dmm
+++ b/_maps/shuttles/syndicate/syndicate_gorlex_komodo.dmm
@@ -1721,9 +1721,6 @@
 	},
 /obj/machinery/light/directional/north,
 /obj/machinery/firealarm/directional/east,
-/obj/item/storage/box/firingpins{
-	pixel_x = -12
-	},
 /turf/open/floor/pod/dark,
 /area/ship/security/armory)
 "qz" = (

From c3463954f30eb7c94930887638f30a19e95cf6d4 Mon Sep 17 00:00:00 2001
From: FalloutFalcon <falloutfalconplays@gmail.com>
Date: Wed, 10 Apr 2024 22:37:40 -0500
Subject: [PATCH 73/89] unrestricted no longer exists

---
 _maps/shuttles/syndicate/syndicate_gorlex_komodo.dmm | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/_maps/shuttles/syndicate/syndicate_gorlex_komodo.dmm b/_maps/shuttles/syndicate/syndicate_gorlex_komodo.dmm
index 8e7bb5ba895f..63bcd879d7e1 100644
--- a/_maps/shuttles/syndicate/syndicate_gorlex_komodo.dmm
+++ b/_maps/shuttles/syndicate/syndicate_gorlex_komodo.dmm
@@ -2754,7 +2754,7 @@
 	},
 /obj/structure/guncase,
 /obj/structure/railing,
-/obj/item/gun/ballistic/automatic/smg/c20r/unrestricted,
+/obj/item/gun/ballistic/automatic/smg/c20r,
 /obj/machinery/light/directional/east,
 /turf/open/floor/pod/dark,
 /area/ship/security/armory)

From 68e23f2a53d6fcbbd54734e415c958560e7bd7e8 Mon Sep 17 00:00:00 2001
From: fallcon <falloutfalconplays@gmail.com>
Date: Thu, 18 Apr 2024 09:24:36 -0500
Subject: [PATCH 74/89] gun defines more orginized

---
 code/__DEFINES/combat.dm                   | 66 ---------------
 code/__DEFINES/gun.dm                      | 95 ++++++++++++++++++++++
 code/modules/projectiles/gun.dm            | 21 -----
 code/modules/projectiles/guns/ballistic.dm |  2 +-
 code/modules/projectiles/projectile.dm     |  4 -
 shiptest.dme                               |  1 +
 6 files changed, 97 insertions(+), 92 deletions(-)
 create mode 100644 code/__DEFINES/gun.dm

diff --git a/code/__DEFINES/combat.dm b/code/__DEFINES/combat.dm
index 7df3a453acfb..ad0754c85b21 100644
--- a/code/__DEFINES/combat.dm
+++ b/code/__DEFINES/combat.dm
@@ -133,52 +133,6 @@ GLOBAL_LIST_INIT(shove_disarming_types, typecacheof(list(/obj/item/gun)))
 #define EMBED_POINTY list("ignore_throwspeed_threshold" = TRUE)
 #define EMBED_POINTY_SUPERIOR list("embed_chance" = 100, "ignore_throwspeed_threshold" = TRUE)
 
-//Gun weapon weight
-/// Allows you to dual wield this gun and your offhand gun
-#define WEAPON_LIGHT 1
-/// Does not allow you to dual wield with this gun and your offhand gun
-#define WEAPON_MEDIUM 2
-/// You must wield the gun to fire this gun
-#define WEAPON_HEAVY 3
-//Gun trigger guards
-#define TRIGGER_GUARD_ALLOW_ALL -1
-#define TRIGGER_GUARD_NONE 0
-#define TRIGGER_GUARD_NORMAL 1
-//Gun bolt types
-///Gun has a bolt, it stays closed while not cycling. The gun must be racked to have a bullet chambered when a mag is inserted.
-/// Example: c20, shotguns, m90
-#define BOLT_TYPE_STANDARD 1
-///Gun has a bolt, it is open when ready to fire. The gun can never have a chambered bullet with no magazine, but the bolt stays ready when a mag is removed.
-/// Example: Some SMGs, the L6
-#define BOLT_TYPE_OPEN 2
-///Gun has no moving bolt mechanism, it cannot be racked. Also dumps the entire contents when emptied instead of a magazine.
-/// Example: Break action shotguns, revolvers
-#define BOLT_TYPE_NO_BOLT 3
-///Gun has a bolt, it locks back when empty. It can be released to chamber a round if a magazine is in.
-/// Example: Pistols with a slide lock, some SMGs
-#define BOLT_TYPE_LOCKING 4
-//Sawn off nerfs
-///accuracy penalty of sawn off guns
-#define SAWN_OFF_ACC_PENALTY 25
-///added recoil of sawn off guns
-#define SAWN_OFF_RECOIL 1
-
-//ammo box sprite defines
-///ammo box will always use provided icon state
-#define AMMO_BOX_ONE_SPRITE 0
-///ammo box will have a different state for each bullet; <icon_state>-<bullets left>
-#define AMMO_BOX_PER_BULLET 1
-///ammo box will have a different state for full and empty; <icon_state>-max_ammo and <icon_state>-0
-#define AMMO_BOX_FULL_EMPTY 2
-
-#define SUPPRESSED_NONE 0
-#define SUPPRESSED_QUIET 1 ///standard suppressed
-#define SUPPRESSED_VERY 2 /// no message
-
-//Projectile Reflect
-#define REFLECT_NORMAL (1<<0)
-#define REFLECT_FAKEPROJECTILE (1<<1)
-
 //Object/Item sharpness
 #define IS_BLUNT 0
 #define IS_SHARP 1
@@ -214,23 +168,3 @@ GLOBAL_LIST_INIT(shove_disarming_types, typecacheof(list(/obj/item/gun)))
 
 //We will round to this value in damage calculations.
 #define DAMAGE_PRECISION 0.1
-
-//bullet_act() return values
-#define BULLET_ACT_HIT "HIT" //It's a successful hit, whatever that means in the context of the thing it's hitting.
-#define BULLET_ACT_BLOCK "BLOCK" //It's a blocked hit, whatever that means in the context of the thing it's hitting.
-#define BULLET_ACT_FORCE_PIERCE "PIERCE"	//It pierces through the object regardless of the bullet being piercing by default.
-
-#define NICE_SHOT_RICOCHET_BONUS 10 //if the shooter has the NICE_SHOT trait and they fire a ricocheting projectile, add this to the ricochet chance and auto aim angle
-
-//Autofire component
-/// Compatible firemode is in the gun. Wait until it's held in the user hands.
-#define AUTOFIRE_STAT_IDLE (1<<0)
-/// Gun is active and in the user hands. Wait until user does a valid click.
-#define AUTOFIRE_STAT_ALERT (1<<1)
-/// Gun is shooting.
-#define AUTOFIRE_STAT_FIRING (1<<2)
-
-#define COMSIG_AUTOFIRE_ONMOUSEDOWN "autofire_onmousedown"
-	#define COMPONENT_AUTOFIRE_ONMOUSEDOWN_BYPASS (1<<0)
-#define COMSIG_AUTOFIRE_SHOT "autofire_shot"
-	#define COMPONENT_AUTOFIRE_SHOT_SUCCESS (1<<0)
diff --git a/code/__DEFINES/gun.dm b/code/__DEFINES/gun.dm
new file mode 100644
index 000000000000..c5936e6f2d0e
--- /dev/null
+++ b/code/__DEFINES/gun.dm
@@ -0,0 +1,95 @@
+//Gun weapon weight
+/// Allows you to dual wield this gun and your offhand gun
+#define WEAPON_LIGHT 1
+/// Does not allow you to dual wield with this gun and your offhand gun
+#define WEAPON_MEDIUM 2
+/// You must wield the gun to fire this gun
+#define WEAPON_HEAVY 3
+//Gun trigger guards
+#define TRIGGER_GUARD_ALLOW_ALL -1
+#define TRIGGER_GUARD_NONE 0
+#define TRIGGER_GUARD_NORMAL 1
+//Gun bolt types
+///Gun has a bolt, it stays closed while not cycling. The gun must be racked to have a bullet chambered when a mag is inserted.
+/// Example: c20, shotguns, m90
+#define BOLT_TYPE_STANDARD 1
+///Gun has a bolt, it is open when ready to fire. The gun can never have a chambered bullet with no magazine, but the bolt stays ready when a mag is removed.
+/// Example: Some SMGs, the L6
+#define BOLT_TYPE_OPEN 2
+///Gun has no moving bolt mechanism, it cannot be racked. Also dumps the entire contents when emptied instead of a magazine.
+/// Example: Break action shotguns, revolvers
+#define BOLT_TYPE_NO_BOLT 3
+///Gun has a bolt, it locks back when empty. It can be released to chamber a round if a magazine is in.
+/// Example: Pistols with a slide lock, some SMGs
+#define BOLT_TYPE_LOCKING 4
+//Sawn off nerfs
+///accuracy penalty of sawn off guns
+#define SAWN_OFF_ACC_PENALTY 25
+///added recoil of sawn off guns
+#define SAWN_OFF_RECOIL 1
+
+//Autofire component
+/// Compatible firemode is in the gun. Wait until it's held in the user hands.
+#define AUTOFIRE_STAT_IDLE (1<<0)
+/// Gun is active and in the user hands. Wait until user does a valid click.
+#define AUTOFIRE_STAT_ALERT (1<<1)
+/// Gun is shooting.
+#define AUTOFIRE_STAT_FIRING (1<<2)
+
+#define COMSIG_AUTOFIRE_ONMOUSEDOWN "autofire_onmousedown"
+	#define COMPONENT_AUTOFIRE_ONMOUSEDOWN_BYPASS (1<<0)
+#define COMSIG_AUTOFIRE_SHOT "autofire_shot"
+	#define COMPONENT_AUTOFIRE_SHOT_SUCCESS (1<<0)
+
+#define SUPPRESSED_NONE 0
+#define SUPPRESSED_QUIET 1 ///standard suppressed
+#define SUPPRESSED_VERY 2 /// no message
+
+#define DUALWIELD_PENALTY_EXTRA_MULTIPLIER 1.6
+
+#define MANUFACTURER_NONE null
+#define MANUFACTURER_SHARPLITE "the Sharplite Defense logo"
+#define MANUFACTURER_SHARPLITE_NEW "the Nanotrasen-Sharplite logo"
+#define MANUFACTURER_HUNTERSPRIDE "the Hunter's Pride Arms and Ammunition logo"
+#define MANUFACTURER_SOLARARMORIES "the Solarbundswaffenkammer emblem"
+#define MANUFACTURER_SCARBOROUGH "the Scarborough Arms logo"
+#define MANUFACTURER_EOEHOMA "the Eoehoma Firearms emblem"
+#define MANUFACTURER_NANOTRASEN_OLD "an outdated Nanotrasen logo"
+#define MANUFACTURER_NANOTRASEN "the Nanotrasen logo"
+#define MANUFACTURER_BRAZIL "a green flag with a blue circle and a yellow diamond around it"
+#define MANUFACTURER_INTEQ "an orange crest with the letters 'IRMG'"
+#define MANUFACTURER_MINUTEMAN "the Lanchester City Firearms Plant logo"
+#define MANUFACTURER_DONKCO "the Donk! Co. logo"
+#define MANUFACTURER_PGF "the Etherbor Industries emblem"
+#define MANUFACTURER_IMPORT "Lanchester Import Co."
+
+
+/////////////////
+// PROJECTILES //
+/////////////////
+
+//bullet_act() return values
+#define BULLET_ACT_HIT "HIT" //It's a successful hit, whatever that means in the context of the thing it's hitting.
+#define BULLET_ACT_BLOCK "BLOCK" //It's a blocked hit, whatever that means in the context of the thing it's hitting.
+#define BULLET_ACT_FORCE_PIERCE "PIERCE"	//It pierces through the object regardless of the bullet being piercing by default.
+
+#define NICE_SHOT_RICOCHET_BONUS 10 //if the shooter has the NICE_SHOT trait and they fire a ricocheting projectile, add this to the ricochet chance and auto aim angle
+
+//Projectile Reflect
+#define REFLECT_NORMAL (1<<0)
+#define REFLECT_FAKEPROJECTILE (1<<1)
+
+//ammo box sprite defines
+///ammo box will always use provided icon state
+#define AMMO_BOX_ONE_SPRITE 0
+///ammo box will have a different state for each bullet; <icon_state>-<bullets left>
+#define AMMO_BOX_PER_BULLET 1
+///ammo box will have a different state for full and empty; <icon_state>-max_ammo and <icon_state>-0
+#define AMMO_BOX_FULL_EMPTY 2
+
+//Projectile Reflect
+#define REFLECT_NORMAL (1<<0)
+#define REFLECT_FAKEPROJECTILE (1<<1)
+
+#define MOVES_HITSCAN -1		//Not actually hitscan but close as we get without actual hitscan.
+#define MUZZLE_EFFECT_PIXEL_INCREMENT 17	//How many pixels to move the muzzle flash up so your character doesn't look like they're shitting out lasers.
diff --git a/code/modules/projectiles/gun.dm b/code/modules/projectiles/gun.dm
index 4ffcf6cb6828..865a7f0ac514 100644
--- a/code/modules/projectiles/gun.dm
+++ b/code/modules/projectiles/gun.dm
@@ -1,22 +1,3 @@
-
-#define DUALWIELD_PENALTY_EXTRA_MULTIPLIER 1.6
-
-#define MANUFACTURER_NONE null
-#define MANUFACTURER_SHARPLITE "the Sharplite Defense logo"
-#define MANUFACTURER_SHARPLITE_NEW "the Nanotrasen-Sharplite logo"
-#define MANUFACTURER_HUNTERSPRIDE "the Hunter's Pride Arms and Ammunition logo"
-#define MANUFACTURER_SOLARARMORIES "the Solarbundswaffenkammer emblem"
-#define MANUFACTURER_SCARBOROUGH "the Scarborough Arms logo"
-#define MANUFACTURER_EOEHOMA "the Eoehoma Firearms emblem"
-#define MANUFACTURER_NANOTRASEN_OLD "an outdated Nanotrasen logo"
-#define MANUFACTURER_NANOTRASEN "the Nanotrasen logo"
-#define MANUFACTURER_BRAZIL "a green flag with a blue circle and a yellow diamond around it"
-#define MANUFACTURER_INTEQ "an orange crest with the letters 'IRMG'"
-#define MANUFACTURER_MINUTEMAN "the Lanchester City Firearms Plant logo"
-#define MANUFACTURER_DONKCO "the Donk! Co. logo"
-#define MANUFACTURER_PGF "the Etherbor Industries emblem"
-#define MANUFACTURER_IMPORT "Lanchester Import Co."
-
 /obj/item/gun
 	name = "gun"
 	desc = "It's a gun. It's pretty terrible, though."
@@ -872,5 +853,3 @@
 	if(zoomable)
 		azoom = new()
 		azoom.gun = src
-
-#undef DUALWIELD_PENALTY_EXTRA_MULTIPLIER
diff --git a/code/modules/projectiles/guns/ballistic.dm b/code/modules/projectiles/guns/ballistic.dm
index f2cb9504dde7..b277f319bcb5 100644
--- a/code/modules/projectiles/guns/ballistic.dm
+++ b/code/modules/projectiles/guns/ballistic.dm
@@ -64,7 +64,7 @@
 	var/empty_autoeject = FALSE
 	///Whether the gun supports multiple special mag types
 	var/special_mags = FALSE
-	///The bolt type of the gun, affects quite a bit of functionality, see combat.dm defines for bolt types: BOLT_TYPE_STANDARD; BOLT_TYPE_LOCKING; BOLT_TYPE_OPEN; BOLT_TYPE_NO_BOLT
+	///The bolt type of the gun, affects quite a bit of functionality, see gun.dm in defines for bolt types: BOLT_TYPE_STANDARD; BOLT_TYPE_LOCKING; BOLT_TYPE_OPEN; BOLT_TYPE_NO_BOLT
 	var/bolt_type = BOLT_TYPE_STANDARD
 	///Used for locking bolt and open bolt guns. Set a bit differently for the two but prevents firing when true for both.
 	var/bolt_locked = FALSE
diff --git a/code/modules/projectiles/projectile.dm b/code/modules/projectiles/projectile.dm
index 7cc9b1c6ebb4..c3edaf6e7cd1 100644
--- a/code/modules/projectiles/projectile.dm
+++ b/code/modules/projectiles/projectile.dm
@@ -1,7 +1,3 @@
-
-#define MOVES_HITSCAN -1		//Not actually hitscan but close as we get without actual hitscan.
-#define MUZZLE_EFFECT_PIXEL_INCREMENT 17	//How many pixels to move the muzzle flash up so your character doesn't look like they're shitting out lasers.
-
 /obj/projectile
 	name = "projectile"
 	icon = 'icons/obj/projectiles.dmi'
diff --git a/shiptest.dme b/shiptest.dme
index c16cbd645b83..73cfeec5e906 100644
--- a/shiptest.dme
+++ b/shiptest.dme
@@ -65,6 +65,7 @@
 #include "code\__DEFINES\food.dm"
 #include "code\__DEFINES\footsteps.dm"
 #include "code\__DEFINES\forensics.dm"
+#include "code\__DEFINES\gun.dm"
 #include "code\__DEFINES\hud.dm"
 #include "code\__DEFINES\icon_smoothing.dm"
 #include "code\__DEFINES\important_recursive_contents.dm"

From 13999e2b4c99323aff522bac0502eee6e7e1ce42 Mon Sep 17 00:00:00 2001
From: fallcon <falloutfalconplays@gmail.com>
Date: Thu, 18 Apr 2024 10:37:09 -0500
Subject: [PATCH 75/89] e

---
 code/__DEFINES/guns.dm | 16 ----------------
 1 file changed, 16 deletions(-)
 delete mode 100644 code/__DEFINES/guns.dm

diff --git a/code/__DEFINES/guns.dm b/code/__DEFINES/guns.dm
deleted file mode 100644
index 0256ed11bedd..000000000000
--- a/code/__DEFINES/guns.dm
+++ /dev/null
@@ -1,16 +0,0 @@
-//weapon manufacturers
-#define MANUFACTURER_NONE null
-#define MANUFACTURER_SHARPLITE "the Sharplite Defense logo"
-#define MANUFACTURER_SHARPLITE_NEW "the Nanotrasen-Sharplite logo"
-#define MANUFACTURER_HUNTERSPRIDE "the Hunter's Pride Arms and Ammunition logo"
-#define MANUFACTURER_SOLARARMORIES "the Solarbundswaffenkammer emblem"
-#define MANUFACTURER_SCARBOROUGH "the Scarborough Arms logo"
-#define MANUFACTURER_EOEHOMA "the Eoehoma Firearms emblem"
-#define MANUFACTURER_NANOTRASEN_OLD "an outdated Nanotrasen logo"
-#define MANUFACTURER_NANOTRASEN "the Nanotrasen logo"
-#define MANUFACTURER_BRAZIL "a green flag with a blue circle and a yellow diamond around it"
-#define MANUFACTURER_INTEQ "an orange crest with the letters 'IRMG'"
-#define MANUFACTURER_MINUTEMAN "the Lanchester City Firearms Plant logo"
-#define MANUFACTURER_DONKCO "the Donk! Co. logo"
-#define MANUFACTURER_PGF "the Etherbor Industries emblem"
-#define MANUFACTURER_IMPORT "Lanchester Import Co."

From 4d6244ff6246f093f1ad54bf84d98f5472d3ff25 Mon Sep 17 00:00:00 2001
From: FalloutFalcon <86381784+FalloutFalcon@users.noreply.github.com>
Date: Thu, 18 Apr 2024 13:25:40 -0500
Subject: [PATCH 76/89] Update beach_ancient_ruin.dmm

Signed-off-by: FalloutFalcon <86381784+FalloutFalcon@users.noreply.github.com>
---
 _maps/RandomRuins/BeachRuins/beach_ancient_ruin.dmm | 1 -
 1 file changed, 1 deletion(-)

diff --git a/_maps/RandomRuins/BeachRuins/beach_ancient_ruin.dmm b/_maps/RandomRuins/BeachRuins/beach_ancient_ruin.dmm
index be52f6a67f46..c14b9dd474a1 100644
--- a/_maps/RandomRuins/BeachRuins/beach_ancient_ruin.dmm
+++ b/_maps/RandomRuins/BeachRuins/beach_ancient_ruin.dmm
@@ -375,7 +375,6 @@
 /obj/item/gun/energy/lasercannon{
 	pixel_y = 5;
 	},
-/obj/item/gun/energy/lasercannon,
 /obj/effect/turf_decal/industrial/hatch,
 /turf/open/floor/plasteel/mono,
 /area/ruin/beach/complex)

From de2336dcfafb6a331154d3e13c9a29717dad842e Mon Sep 17 00:00:00 2001
From: FalloutFalcon <86381784+FalloutFalcon@users.noreply.github.com>
Date: Thu, 18 Apr 2024 13:26:58 -0500
Subject: [PATCH 77/89] nvm im dum

Signed-off-by: FalloutFalcon <86381784+FalloutFalcon@users.noreply.github.com>
---
 _maps/RandomRuins/BeachRuins/beach_ancient_ruin.dmm | 1 +
 1 file changed, 1 insertion(+)

diff --git a/_maps/RandomRuins/BeachRuins/beach_ancient_ruin.dmm b/_maps/RandomRuins/BeachRuins/beach_ancient_ruin.dmm
index c14b9dd474a1..be52f6a67f46 100644
--- a/_maps/RandomRuins/BeachRuins/beach_ancient_ruin.dmm
+++ b/_maps/RandomRuins/BeachRuins/beach_ancient_ruin.dmm
@@ -375,6 +375,7 @@
 /obj/item/gun/energy/lasercannon{
 	pixel_y = 5;
 	},
+/obj/item/gun/energy/lasercannon,
 /obj/effect/turf_decal/industrial/hatch,
 /turf/open/floor/plasteel/mono,
 /area/ruin/beach/complex)

From 1eb41c3f4d4460584861007b4cf720a6b2d30655 Mon Sep 17 00:00:00 2001
From: FalloutFalcon <86381784+FalloutFalcon@users.noreply.github.com>
Date: Thu, 18 Apr 2024 13:28:28 -0500
Subject: [PATCH 78/89] Delete
 _maps/shuttles/syndicate/syndicate_luxembourg.dmm

oops some how readded it

Signed-off-by: FalloutFalcon <86381784+FalloutFalcon@users.noreply.github.com>
---
 .../syndicate/syndicate_luxembourg.dmm        | 3314 -----------------
 1 file changed, 3314 deletions(-)
 delete mode 100644 _maps/shuttles/syndicate/syndicate_luxembourg.dmm

diff --git a/_maps/shuttles/syndicate/syndicate_luxembourg.dmm b/_maps/shuttles/syndicate/syndicate_luxembourg.dmm
deleted file mode 100644
index cff4c84386e0..000000000000
--- a/_maps/shuttles/syndicate/syndicate_luxembourg.dmm
+++ /dev/null
@@ -1,3314 +0,0 @@
-//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE
-"aB" = (
-/turf/open/floor/plasteel/dark,
-/area/ship/hallway/central)
-"aD" = (
-/obj/structure/cable{
-	icon_state = "1-2"
-	},
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer2,
-/obj/machinery/atmospherics/pipe/manifold/supply/hidden/layer4{
-	dir = 4
-	},
-/turf/open/floor/carpet/red_gold,
-/area/ship/crew/dorm)
-"aK" = (
-/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer4{
-	dir = 9
-	},
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer2{
-	dir = 9
-	},
-/obj/effect/decal/cleanable/dirt,
-/obj/item/radio/intercom/directional/south,
-/obj/machinery/navbeacon/wayfinding{
-	codes_txt = "patrol;next_patrol=lux_engine";
-	location = "lux_crew"
-	},
-/turf/open/floor/plasteel/dark,
-/area/ship/crew/dorm)
-"bi" = (
-/obj/machinery/button/door{
-	id = "syndiefuck";
-	name = "Loading Shutters Control";
-	pixel_x = -25;
-	pixel_y = -7;
-	dir = 4
-	},
-/obj/machinery/button/door{
-	id = "warehouse";
-	name = "Warehouse Control";
-	pixel_x = -25;
-	pixel_y = 5;
-	dir = 4
-	},
-/obj/machinery/button/door{
-	id = "cargodoors";
-	name = "Cargo Bay Shutter Control";
-	pixel_x = -35;
-	pixel_y = 5;
-	dir = 4
-	},
-/obj/machinery/button/door{
-	id = "externalshutters";
-	name = "External Shutters Control";
-	pixel_x = -35;
-	pixel_y = -7;
-	dir = 4
-	},
-/obj/machinery/computer/cargo/express{
-	dir = 4
-	},
-/turf/open/floor/plasteel/mono/dark,
-/area/ship/hallway/central)
-"bp" = (
-/obj/effect/turf_decal/siding/blue/corner{
-	dir = 8
-	},
-/obj/effect/turf_decal/corner/opaque/blue/half{
-	dir = 1
-	},
-/turf/open/floor/plasteel/dark,
-/area/ship/hallway/central)
-"bt" = (
-/obj/structure/cable{
-	icon_state = "1-8"
-	},
-/obj/effect/decal/cleanable/dirt,
-/obj/machinery/atmospherics/components/binary/volume_pump{
-	dir = 8
-	},
-/obj/structure/catwalk/over/plated_catwalk/white,
-/turf/open/floor/plating,
-/area/ship/engineering)
-"bB" = (
-/obj/structure/rack,
-/obj/machinery/light/directional/north,
-/obj/effect/turf_decal/corner/opaque/brown/border{
-	dir = 9
-	},
-/obj/item/gps/mining,
-/obj/item/paicard,
-/turf/open/floor/plasteel/mono/dark,
-/area/ship/cargo)
-"bN" = (
-/obj/structure/cable{
-	icon_state = "4-8"
-	},
-/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer4,
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer2,
-/turf/open/floor/plasteel/dark,
-/area/ship/crew/dorm)
-"bV" = (
-/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer4{
-	dir = 4
-	},
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer2{
-	dir = 4
-	},
-/obj/structure/displaycase,
-/obj/effect/turf_decal/corner/opaque/neutral/mono,
-/turf/open/floor/plasteel/mono/dark,
-/area/ship/hallway/central)
-"cb" = (
-/obj/structure/cable{
-	icon_state = "1-2"
-	},
-/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer4,
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer2,
-/turf/open/floor/carpet/red_gold,
-/area/ship/crew/dorm)
-"cq" = (
-/obj/machinery/power/apc/auto_name/directional/east,
-/obj/structure/cable{
-	icon_state = "0-8"
-	},
-/obj/machinery/computer/mech_bay_power_console{
-	dir = 8
-	},
-/turf/open/floor/plasteel/mono/dark,
-/area/ship/storage)
-"cs" = (
-/obj/effect/turf_decal/siding/blue{
-	dir = 8
-	},
-/obj/effect/turf_decal/siding/blue/corner,
-/turf/open/floor/plasteel/dark,
-/area/ship/hallway/central)
-"cB" = (
-/obj/item/toy/figure/cargotech,
-/obj/item/clothing/suit/hooded/wintercoat/cargo,
-/obj/item/stack/sheet/cardboard/fifty,
-/obj/item/hand_labeler,
-/obj/item/hand_labeler_refill,
-/obj/item/clothing/under/syndicate/donk,
-/obj/item/clothing/suit/hazardvest/donk,
-/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{
-	dir = 8
-	},
-/obj/item/stack/wrapping_paper,
-/obj/item/stack/packageWrap,
-/obj/structure/closet/wall{
-	dir = 8;
-	icon_door = "orange_wall";
-	name = "employee closet";
-	pixel_x = 28
-	},
-/turf/open/floor/plasteel/mono/dark,
-/area/ship/engineering)
-"cI" = (
-/obj/structure/rack,
-/obj/item/rack_parts,
-/obj/item/rack_parts,
-/obj/item/rack_parts,
-/obj/item/rack_parts,
-/obj/item/rack_parts,
-/obj/item/rack_parts,
-/obj/item/rack_parts,
-/obj/item/rack_parts,
-/obj/item/rack_parts,
-/obj/item/rack_parts,
-/obj/item/rack_parts,
-/obj/item/rack_parts,
-/obj/item/rack_parts,
-/obj/item/rack_parts,
-/obj/item/rack_parts,
-/obj/item/rack_parts,
-/obj/effect/turf_decal/corner/opaque/neutral/mono,
-/turf/open/floor/plasteel/mono/dark,
-/area/ship/hallway/central)
-"dp" = (
-/obj/structure/displaycase,
-/obj/effect/turf_decal/corner/opaque/neutral/mono,
-/turf/open/floor/plasteel/mono/dark,
-/area/ship/hallway/central)
-"dA" = (
-/obj/structure/chair/comfy/shuttle{
-	dir = 1
-	},
-/turf/open/floor/carpet/red_gold,
-/area/ship/hallway/central)
-"dC" = (
-/obj/machinery/atmospherics/pipe/layer_manifold{
-	dir = 4
-	},
-/obj/machinery/space_heater,
-/obj/item/radio/intercom/directional/north,
-/turf/open/floor/plasteel/tech/techmaint,
-/area/ship/engineering)
-"dH" = (
-/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer4{
-	dir = 8
-	},
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer2{
-	dir = 4
-	},
-/obj/structure/displaycase,
-/obj/effect/turf_decal/corner/opaque/neutral/mono,
-/turf/open/floor/plasteel/mono/dark,
-/area/ship/hallway/central)
-"dL" = (
-/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer4,
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer2,
-/obj/machinery/door/firedoor/border_only{
-	dir = 1
-	},
-/obj/machinery/door/firedoor/border_only,
-/obj/machinery/door/airlock/engineering{
-	name = "Engineering"
-	},
-/turf/open/floor/plasteel/tech/techmaint,
-/area/ship/engineering)
-"dM" = (
-/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer4,
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer2{
-	dir = 5
-	},
-/obj/effect/decal/cleanable/dirt,
-/turf/open/floor/plasteel/tech/techmaint,
-/area/ship/engineering)
-"eD" = (
-/obj/item/storage/belt/utility,
-/obj/item/storage/belt/utility,
-/obj/structure/table,
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer2{
-	dir = 10
-	},
-/obj/item/storage/toolbox/syndicate,
-/obj/item/storage/toolbox/syndicate,
-/turf/open/floor/plasteel/tech/techmaint,
-/area/ship/engineering)
-"eF" = (
-/obj/structure/sink{
-	dir = 8;
-	pixel_x = 12
-	},
-/obj/structure/mirror{
-	pixel_x = 24
-	},
-/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{
-	dir = 8
-	},
-/obj/item/storage/firstaid/regular,
-/obj/item/storage/firstaid/medical{
-	pixel_x = -5;
-	pixel_y = -4
-	},
-/obj/structure/closet/wall/white/med{
-	dir = 1;
-	name = "medicine locker";
-	pixel_y = -28
-	},
-/turf/open/floor/plasteel/patterned,
-/area/ship/crew/dorm)
-"eL" = (
-/obj/structure/cable{
-	icon_state = "1-2"
-	},
-/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer4,
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer2,
-/obj/machinery/door/firedoor/border_only,
-/obj/machinery/door/firedoor/border_only{
-	dir = 1
-	},
-/obj/structure/catwalk/over/plated_catwalk/white,
-/obj/machinery/door/airlock/engineering{
-	name = "Engineering"
-	},
-/turf/open/floor/plasteel/tech/techmaint,
-/area/ship/engineering)
-"eX" = (
-/obj/effect/turf_decal/siding/blue{
-	dir = 8
-	},
-/obj/effect/turf_decal/siding/blue{
-	dir = 4
-	},
-/turf/open/floor/plasteel/dark,
-/area/ship/hallway/central)
-"fn" = (
-/obj/machinery/light/directional/east,
-/obj/structure/table,
-/obj/machinery/microwave,
-/turf/open/floor/plasteel/mono/dark,
-/area/ship/crew/canteen)
-"fo" = (
-/obj/item/card/emag,
-/obj/item/tank/internals/emergency_oxygen/double,
-/obj/item/storage/backpack/duffelbag/syndie{
-	name = "manager's duffel bag"
-	},
-/obj/item/clothing/under/syndicate/donk/qm,
-/obj/item/clothing/suit/hazardvest/donk/qm,
-/obj/item/melee/classic_baton/telescopic,
-/obj/item/radio/headset/syndicate/alt/leader,
-/obj/item/spacecash/bundle/c1000,
-/obj/item/spacecash/bundle/c1000,
-/obj/item/spacecash/bundle/c1000,
-/obj/item/spacecash/bundle/c1000,
-/obj/item/spacecash/bundle/c1000,
-/obj/item/spacecash/bundle/c1000,
-/obj/structure/closet/secure_closet/wall{
-	dir = 4;
-	icon_state = "solgov_wall";
-	name = "manager's locker";
-	pixel_x = -28;
-	req_access_txt = "41"
-	},
-/obj/machinery/light_switch{
-	pixel_y = 22
-	},
-/turf/open/floor/plasteel/mono/dark,
-/area/ship/engineering)
-"fv" = (
-/obj/machinery/selling_pad,
-/obj/effect/turf_decal/box,
-/turf/open/floor/plasteel/mono/dark,
-/area/ship/hallway/central)
-"fy" = (
-/obj/structure/cable{
-	icon_state = "1-2"
-	},
-/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer4,
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer2,
-/obj/effect/turf_decal/trimline/opaque/brown/filled/warning,
-/obj/structure/cable{
-	icon_state = "2-8"
-	},
-/turf/open/floor/plasteel/mono/dark,
-/area/ship/cargo)
-"fB" = (
-/obj/effect/decal/cleanable/oil,
-/obj/effect/turf_decal/corner/opaque/brown/border{
-	dir = 8
-	},
-/turf/open/floor/plasteel/mono/dark,
-/area/ship/cargo)
-"ga" = (
-/obj/structure/table/reinforced,
-/obj/machinery/door/window{
-	dir = 4
-	},
-/obj/machinery/door/firedoor,
-/obj/machinery/door/poddoor/shutters{
-	dir = 4;
-	id = "cargodoors"
-	},
-/obj/item/radio/intercom/directional/north{
-	pixel_y = 22
-	},
-/turf/open/floor/plasteel/dark,
-/area/ship/cargo)
-"gf" = (
-/obj/machinery/atmospherics/pipe/manifold/supply/hidden/layer4{
-	dir = 8
-	},
-/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer2{
-	dir = 4
-	},
-/obj/structure/cable{
-	icon_state = "1-2"
-	},
-/turf/open/floor/plasteel/mono/dark,
-/area/ship/cargo)
-"gj" = (
-/obj/machinery/light/directional/north,
-/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer4{
-	dir = 4
-	},
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer2{
-	dir = 6
-	},
-/obj/structure/closet/secure_closet/engineering_welding,
-/turf/open/floor/plasteel/tech/techmaint,
-/area/ship/engineering)
-"gC" = (
-/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer4,
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer2,
-/obj/effect/turf_decal/siding/blue{
-	dir = 8
-	},
-/obj/effect/turf_decal/siding/blue{
-	dir = 4
-	},
-/turf/open/floor/plasteel/dark,
-/area/ship/hallway/central)
-"hd" = (
-/obj/machinery/atmospherics/components/unary/outlet_injector/on{
-	dir = 1
-	},
-/turf/open/floor/plating,
-/area/ship/engineering)
-"hi" = (
-/turf/open/floor/plasteel/mono/dark,
-/area/ship/cargo)
-"hm" = (
-/obj/structure/cable{
-	icon_state = "1-2"
-	},
-/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer4,
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer2,
-/obj/effect/decal/cleanable/dirt,
-/turf/open/floor/plasteel/patterned/cargo_one,
-/area/ship/storage)
-"hs" = (
-/turf/closed/wall/mineral/plastitanium/nodiagonal,
-/area/ship/cargo)
-"hu" = (
-/obj/effect/decal/cleanable/dirt,
-/obj/machinery/firealarm/directional/east,
-/obj/effect/turf_decal/corner/opaque/brown/border{
-	dir = 4
-	},
-/obj/machinery/suit_storage_unit/inherit/industrial,
-/obj/item/clothing/suit/space/syndicate,
-/obj/item/clothing/head/helmet/space/syndicate,
-/obj/item/clothing/mask/breath,
-/turf/open/floor/plasteel/mono/dark,
-/area/ship/cargo)
-"hX" = (
-/obj/effect/decal/cleanable/dirt,
-/obj/effect/turf_decal/corner/opaque/brown/border{
-	dir = 8
-	},
-/turf/open/floor/plasteel/mono/dark,
-/area/ship/cargo)
-"if" = (
-/obj/machinery/cryopod{
-	dir = 4
-	},
-/obj/machinery/computer/cryopod/directional/south,
-/obj/machinery/light/small/directional/west,
-/turf/open/floor/plasteel/tech/techmaint,
-/area/ship/crew/dorm)
-"it" = (
-/obj/effect/decal/cleanable/dirt,
-/obj/machinery/power/shieldwallgen/atmos{
-	anchored = 1;
-	dir = 1;
-	id = "luxembourg_cargo";
-	locked = 1
-	},
-/obj/structure/cable{
-	icon_state = "0-4"
-	},
-/obj/machinery/door/poddoor/shutters{
-	dir = 4;
-	id = "syndiefuck"
-	},
-/turf/open/floor/plasteel/mono/dark,
-/area/ship/cargo)
-"iF" = (
-/obj/structure/cable{
-	icon_state = "1-4"
-	},
-/obj/effect/decal/cleanable/dirt,
-/obj/structure/closet/crate,
-/obj/item/vending_refill/engineering,
-/obj/item/vending_refill/engineering,
-/obj/item/vending_refill/engivend,
-/obj/item/vending_refill/engivend,
-/obj/item/vending_refill/hydronutrients,
-/obj/item/vending_refill/hydronutrients,
-/obj/item/vending_refill/boozeomat,
-/obj/item/vending_refill/boozeomat,
-/obj/item/vending_refill/medical,
-/obj/item/vending_refill/medical,
-/obj/item/vending_refill/cigarette,
-/obj/item/vending_refill/cigarette,
-/obj/item/vending_refill/snack,
-/obj/item/vending_refill/snack,
-/obj/item/vending_refill/sovietsoda,
-/obj/item/vending_refill/cola,
-/obj/item/vending_refill/cola,
-/turf/open/floor/plasteel/mono/dark,
-/area/ship/storage)
-"iO" = (
-/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer4{
-	dir = 10
-	},
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer2{
-	dir = 10
-	},
-/turf/open/floor/plasteel/patterned/cargo_one,
-/area/ship/storage)
-"iR" = (
-/obj/machinery/power/shuttle/engine/fueled/plasma{
-	dir = 1
-	},
-/obj/machinery/atmospherics/pipe/layer_manifold,
-/turf/open/floor/plating,
-/area/ship/engineering)
-"iZ" = (
-/obj/structure/cable{
-	icon_state = "1-2"
-	},
-/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer4{
-	dir = 9
-	},
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer2{
-	dir = 9
-	},
-/obj/structure/catwalk/over/plated_catwalk/white,
-/obj/machinery/atmospherics/components/unary/portables_connector{
-	dir = 4
-	},
-/turf/open/floor/plating,
-/area/ship/engineering)
-"jr" = (
-/turf/open/floor/carpet/red_gold,
-/area/ship/hallway/central)
-"jv" = (
-/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{
-	dir = 4
-	},
-/obj/structure/rack,
-/obj/effect/turf_decal/corner/opaque/neutral/mono,
-/turf/open/floor/plasteel/mono/dark,
-/area/ship/hallway/central)
-"jH" = (
-/obj/structure/table,
-/obj/item/radio/intercom/wideband/table{
-	dir = 4
-	},
-/obj/machinery/light_switch{
-	pixel_y = 22
-	},
-/turf/open/floor/plasteel/mono/dark,
-/area/ship/hallway/central)
-"jK" = (
-/obj/machinery/air_sensor/atmos/air_tank,
-/turf/open/floor/engine/air,
-/area/ship/engineering)
-"ke" = (
-/obj/machinery/mech_bay_recharge_port{
-	dir = 1
-	},
-/obj/effect/decal/cleanable/dirt,
-/turf/open/floor/plasteel/mono/dark,
-/area/ship/storage)
-"ks" = (
-/obj/structure/closet/crate,
-/obj/item/gun_voucher,
-/obj/item/gun_voucher,
-/obj/item/gun_voucher,
-/obj/item/gun_voucher,
-/obj/item/gun_voucher,
-/obj/item/gun_voucher,
-/obj/item/gun_voucher,
-/obj/item/gun_voucher,
-/obj/item/gun_voucher,
-/obj/item/gun_voucher,
-/turf/open/floor/plasteel/mono/dark,
-/area/ship/storage)
-"kE" = (
-/obj/machinery/chem_master/condimaster,
-/turf/open/floor/plasteel/mono/dark,
-/area/ship/crew/canteen)
-"kI" = (
-/obj/structure/cable{
-	icon_state = "1-2"
-	},
-/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer4{
-	dir = 5
-	},
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer2{
-	dir = 5
-	},
-/turf/open/floor/plasteel/patterned/cargo_one,
-/area/ship/storage)
-"kZ" = (
-/obj/effect/spawner/structure/window/plasma/reinforced/plastitanium,
-/obj/machinery/door/poddoor/shutters{
-	dir = 4;
-	id = "externalshutters"
-	},
-/turf/open/floor/plating,
-/area/ship/hallway/central)
-"lb" = (
-/obj/structure/cable{
-	icon_state = "1-8"
-	},
-/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer4{
-	dir = 4
-	},
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer2{
-	dir = 8
-	},
-/obj/machinery/portable_atmospherics/scrubber,
-/turf/open/floor/plasteel/tech/techmaint,
-/area/ship/engineering)
-"lg" = (
-/obj/structure/cable{
-	icon_state = "1-2"
-	},
-/obj/structure/cable{
-	icon_state = "2-4"
-	},
-/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer4,
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer2,
-/turf/open/floor/plasteel/patterned/cargo_one,
-/area/ship/storage)
-"lt" = (
-/obj/machinery/atmospherics/components/binary/volume_pump,
-/obj/structure/catwalk/over/plated_catwalk/white,
-/turf/open/floor/plating,
-/area/ship/engineering)
-"lK" = (
-/obj/effect/turf_decal/siding/blue/corner{
-	dir = 8
-	},
-/obj/effect/turf_decal/siding/blue/corner{
-	dir = 1
-	},
-/turf/open/floor/plasteel/dark,
-/area/ship/hallway/central)
-"lQ" = (
-/obj/structure/cable{
-	icon_state = "1-2"
-	},
-/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer4,
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer2,
-/obj/machinery/door/firedoor/border_only,
-/obj/machinery/door/firedoor/border_only{
-	dir = 1
-	},
-/obj/machinery/door/poddoor/shutters{
-	id = "warehouse"
-	},
-/turf/open/floor/plasteel/tech/techmaint,
-/area/ship/storage)
-"lW" = (
-/obj/structure/cable{
-	icon_state = "4-8"
-	},
-/obj/machinery/atmospherics/pipe/manifold/orange/visible{
-	dir = 1
-	},
-/obj/structure/catwalk/over/plated_catwalk/white,
-/turf/open/floor/plating,
-/area/ship/engineering)
-"mi" = (
-/obj/effect/spawner/structure/window/plasma/reinforced/plastitanium,
-/obj/machinery/door/poddoor/shutters{
-	dir = 4;
-	id = "externalshutters"
-	},
-/turf/open/floor/plating,
-/area/ship/crew/dorm)
-"mm" = (
-/obj/item/toy/figure/cargotech,
-/obj/item/clothing/suit/hooded/wintercoat/cargo,
-/obj/item/stack/sheet/cardboard/fifty,
-/obj/item/hand_labeler,
-/obj/item/hand_labeler_refill,
-/obj/item/clothing/under/syndicate/donk,
-/obj/item/clothing/suit/hazardvest/donk,
-/obj/item/stack/wrapping_paper,
-/obj/item/stack/packageWrap,
-/obj/structure/railing,
-/obj/structure/closet/wall{
-	dir = 4;
-	icon_door = "orange_wall";
-	name = "employee closet";
-	pixel_x = -28
-	},
-/turf/open/floor/plasteel/mono/dark,
-/area/ship/engineering)
-"mE" = (
-/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer4,
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer2,
-/obj/structure/catwalk/over/plated_catwalk/dark,
-/obj/effect/turf_decal/kfp_small/left{
-	dir = 4
-	},
-/turf/open/floor/plating,
-/area/ship/engineering)
-"mK" = (
-/obj/machinery/light/directional/south,
-/obj/machinery/computer/atmos_control/tank/air_tank{
-	dir = 4
-	},
-/obj/machinery/airalarm/directional/west,
-/turf/open/floor/plasteel/tech/techmaint,
-/area/ship/engineering)
-"na" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer2,
-/turf/closed/wall/mineral/plastitanium/nodiagonal,
-/area/ship/engineering)
-"nz" = (
-/obj/structure/sign/donk{
-	pixel_x = -32
-	},
-/obj/structure/rack,
-/obj/item/radio/headset,
-/obj/item/radio/headset,
-/obj/item/radio/headset,
-/obj/item/radio/headset,
-/obj/item/radio/headset,
-/obj/item/radio/headset,
-/turf/open/floor/plasteel/dark,
-/area/ship/crew/dorm)
-"ow" = (
-/obj/effect/spawner/structure/window/plasma/reinforced/plastitanium,
-/obj/machinery/door/poddoor/shutters{
-	id = "externalshutters"
-	},
-/turf/open/floor/plating,
-/area/ship/crew/canteen)
-"pd" = (
-/obj/machinery/light/directional/east,
-/obj/structure/closet/crate/large{
-	name = "Donk! Co. Powerloader In a Box"
-	},
-/obj/effect/decal/cleanable/oil,
-/obj/effect/turf_decal/rechargefloor,
-/obj/mecha/working/ripley/cargo{
-	name = "\improper Donk! Co. Cargo Loading Device"
-	},
-/turf/open/floor/plasteel/mono/dark,
-/area/ship/storage)
-"pt" = (
-/turf/closed/wall/mineral/plastitanium,
-/area/ship/engineering)
-"pJ" = (
-/obj/machinery/firealarm/directional/south,
-/obj/machinery/autolathe,
-/turf/open/floor/plasteel/tech/techmaint,
-/area/ship/engineering)
-"pL" = (
-/obj/effect/turf_decal/siding/blue{
-	dir = 1
-	},
-/obj/effect/turf_decal/siding/blue/corner{
-	dir = 8
-	},
-/turf/open/floor/plasteel/dark,
-/area/ship/hallway/central)
-"pR" = (
-/obj/machinery/power/smes/engineering,
-/obj/structure/cable{
-	icon_state = "0-2"
-	},
-/obj/machinery/door/firedoor/border_only,
-/obj/machinery/door/firedoor/border_only{
-	dir = 1
-	},
-/turf/open/floor/plating,
-/area/ship/engineering)
-"qe" = (
-/obj/effect/turf_decal/atmos/air,
-/turf/open/floor/engine/air,
-/area/ship/engineering)
-"qf" = (
-/obj/structure/table,
-/obj/machinery/door/firedoor,
-/obj/item/radio/intercom/directional/north,
-/turf/open/floor/plasteel/mono/dark,
-/area/ship/crew/canteen)
-"qh" = (
-/obj/machinery/airalarm/directional/west,
-/obj/item/stack/sheet/cardboard/fifty,
-/obj/item/hand_labeler,
-/obj/effect/turf_decal/corner/opaque/brown/border{
-	dir = 8
-	},
-/obj/machinery/navbeacon/wayfinding{
-	codes_txt = "patrol;next_patrol=lux_shopfloor";
-	location = "lux_lobby"
-	},
-/turf/open/floor/plasteel/mono/dark,
-/area/ship/cargo)
-"ql" = (
-/obj/structure/cable{
-	icon_state = "4-8"
-	},
-/obj/machinery/atmospherics/pipe/simple/orange/visible{
-	dir = 4
-	},
-/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{
-	dir = 4
-	},
-/obj/structure/catwalk/over/plated_catwalk,
-/turf/open/floor/plating,
-/area/ship/engineering)
-"qO" = (
-/obj/structure/cable{
-	icon_state = "2-4"
-	},
-/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer4{
-	dir = 8
-	},
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer2{
-	dir = 4
-	},
-/obj/structure/chair/plastic{
-	dir = 4
-	},
-/obj/effect/turf_decal/siding/red{
-	dir = 8
-	},
-/obj/effect/turf_decal/corner/opaque/neutral/border{
-	dir = 4
-	},
-/turf/open/floor/plasteel/mono/dark,
-/area/ship/hallway/central)
-"qP" = (
-/obj/machinery/door/airlock/external,
-/obj/effect/mapping_helpers/airlock/cyclelink_helper{
-	dir = 1
-	},
-/obj/machinery/atmospherics/pipe/simple/orange/visible{
-	dir = 5
-	},
-/turf/open/floor/plating,
-/area/ship/engineering)
-"qR" = (
-/turf/open/floor/engine/air,
-/area/ship/engineering)
-"qV" = (
-/obj/item/toy/sword,
-/obj/structure/closet/crate/wooden/toy,
-/obj/item/ammo_box/magazine/toy/smgm45/riot,
-/obj/item/ammo_box/magazine/toy/smgm45/riot,
-/obj/item/gun/ballistic/automatic/smg/c20r/toy/riot,
-/obj/item/soap/syndie,
-/obj/item/soap/syndie,
-/obj/item/soap/syndie,
-/obj/item/soap/syndie,
-/obj/item/soap/syndie,
-/obj/item/soap/syndie,
-/obj/item/soap/syndie,
-/obj/item/soap/syndie,
-/turf/open/floor/plasteel/mono/dark,
-/area/ship/storage)
-"rh" = (
-/obj/effect/turf_decal/siding/blue/corner{
-	dir = 8
-	},
-/obj/effect/turf_decal/siding/blue/corner,
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer2,
-/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer4,
-/obj/effect/turf_decal/trimline/opaque/blue/filled/warning{
-	dir = 1
-	},
-/turf/open/floor/plasteel/dark,
-/area/ship/hallway/central)
-"rm" = (
-/obj/structure/cable{
-	icon_state = "1-2"
-	},
-/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer4{
-	dir = 9
-	},
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer2{
-	dir = 9
-	},
-/obj/effect/decal/cleanable/dirt,
-/turf/open/floor/carpet/red_gold,
-/area/ship/crew/dorm)
-"rq" = (
-/obj/machinery/door/firedoor/border_only{
-	dir = 4
-	},
-/obj/machinery/door/firedoor/border_only{
-	dir = 8
-	},
-/obj/machinery/door/window{
-	dir = 8;
-	name = "Canteen"
-	},
-/obj/effect/turf_decal/siding/red,
-/turf/open/floor/plasteel/mono/dark,
-/area/ship/crew/canteen)
-"rG" = (
-/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4,
-/obj/effect/turf_decal/corner/opaque/neutral/mono,
-/turf/open/floor/plasteel/mono/dark,
-/area/ship/crew/canteen)
-"rU" = (
-/obj/structure/cable{
-	icon_state = "1-2"
-	},
-/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer4,
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer2,
-/obj/effect/turf_decal/trimline/opaque/orange/filled/warning,
-/turf/open/floor/plasteel/patterned/cargo_one,
-/area/ship/storage)
-"rV" = (
-/obj/machinery/atmospherics/components/unary/vent_pump/high_volume/siphon/atmos/air_output{
-	dir = 4
-	},
-/obj/structure/window/plasma/reinforced/spawner/east,
-/turf/open/floor/engine/air,
-/area/ship/engineering)
-"sh" = (
-/obj/machinery/power/shuttle/engine/fueled/plasma{
-	dir = 1
-	},
-/turf/open/floor/plating,
-/area/ship/engineering)
-"sk" = (
-/obj/effect/turf_decal/atmos/plasma,
-/turf/open/floor/engine/plasma,
-/area/ship/engineering)
-"sF" = (
-/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{
-	dir = 8
-	},
-/obj/effect/turf_decal/corner/opaque/neutral/mono,
-/turf/open/floor/plasteel/mono/dark,
-/area/ship/crew/canteen)
-"sI" = (
-/obj/structure/cable{
-	icon_state = "1-2"
-	},
-/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer2{
-	dir = 8
-	},
-/obj/effect/decal/cleanable/dirt,
-/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer4{
-	dir = 6
-	},
-/obj/effect/turf_decal/industrial/traffic{
-	dir = 8
-	},
-/turf/open/floor/plasteel/dark,
-/area/ship/crew/dorm)
-"sV" = (
-/mob/living/simple_animal/bot/mulebot{
-	bot_name = "\proper Christine";
-	desc = "A Multiple Utility Load Effector bot. This one seems oddly menacing...";
-	id = "Christine";
-	name = "\proper Christine"
-	},
-/obj/effect/turf_decal/corner/opaque/brown/bordercee,
-/obj/machinery/navbeacon/wayfinding{
-	codes_txt = null;
-	location = "mulestation"
-	},
-/turf/open/floor/plasteel/mono/dark,
-/area/ship/cargo)
-"tx" = (
-/obj/machinery/power/port_gen/pacman,
-/obj/structure/cable/yellow{
-	icon_state = "0-4"
-	},
-/obj/item/stack/sheet/mineral/plasma/five,
-/turf/open/floor/plasteel/mono/dark,
-/area/ship/engineering)
-"tF" = (
-/obj/structure/bed/pod,
-/obj/item/bedsheet/blue,
-/obj/structure/curtain/bounty,
-/turf/open/floor/plasteel/dark,
-/area/ship/crew/dorm)
-"tH" = (
-/obj/structure/cable{
-	icon_state = "1-2"
-	},
-/obj/effect/turf_decal/siding/red{
-	dir = 10
-	},
-/obj/effect/turf_decal/corner/opaque/neutral/bordercorner{
-	dir = 4
-	},
-/turf/open/floor/plasteel/mono/dark,
-/area/ship/hallway/central)
-"tO" = (
-/obj/effect/turf_decal/siding/blue/corner,
-/obj/effect/turf_decal/siding/blue/corner{
-	dir = 8
-	},
-/obj/effect/turf_decal/siding/blue/corner{
-	dir = 4
-	},
-/turf/open/floor/plasteel/dark,
-/area/ship/hallway/central)
-"tU" = (
-/obj/machinery/camera{
-	dir = 10
-	},
-/turf/open/floor/plating,
-/area/template_noop)
-"tV" = (
-/obj/machinery/door/firedoor/border_only{
-	dir = 4
-	},
-/obj/machinery/door/firedoor/border_only{
-	dir = 8
-	},
-/obj/machinery/button/door{
-	id = "cargodoors";
-	pixel_x = 8;
-	pixel_y = -24
-	},
-/obj/machinery/door/window{
-	dir = 8;
-	name = "Cargo Bay"
-	},
-/obj/machinery/door/poddoor/shutters{
-	dir = 4;
-	id = "cargodoors"
-	},
-/turf/open/floor/plasteel/dark,
-/area/ship/cargo)
-"ug" = (
-/obj/structure/table/reinforced,
-/obj/machinery/door/window/eastright,
-/obj/machinery/door/firedoor,
-/obj/machinery/door/poddoor/shutters{
-	dir = 4;
-	id = "cargodoors"
-	},
-/turf/open/floor/plasteel/dark,
-/area/ship/cargo)
-"ul" = (
-/obj/structure/cable/yellow{
-	icon_state = "0-8"
-	},
-/obj/machinery/power/port_gen/pacman,
-/obj/item/stack/sheet/mineral/plasma/five,
-/obj/effect/decal/cleanable/dirt,
-/turf/open/floor/plasteel/mono/dark,
-/area/ship/engineering)
-"uo" = (
-/obj/structure/cable{
-	icon_state = "1-2"
-	},
-/obj/machinery/atmospherics/components/binary/pump{
-	dir = 4
-	},
-/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer4{
-	dir = 5
-	},
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer2,
-/obj/structure/catwalk/over/plated_catwalk,
-/turf/open/floor/plating,
-/area/ship/engineering)
-"uB" = (
-/obj/structure/table,
-/obj/machinery/reagentgrinder,
-/obj/item/reagent_containers/food/drinks/shaker{
-	pixel_x = 10
-	},
-/obj/item/kitchen/knife{
-	pixel_x = -8
-	},
-/turf/open/floor/plasteel/mono/dark,
-/area/ship/crew/canteen)
-"uK" = (
-/obj/machinery/atmospherics/components/unary/outlet_injector/atmos/toxin_input{
-	dir = 8
-	},
-/obj/structure/window/plasma/reinforced/spawner/west,
-/turf/open/floor/engine/plasma,
-/area/ship/engineering)
-"uX" = (
-/obj/machinery/power/apc/auto_name/directional/east,
-/obj/structure/cable{
-	icon_state = "0-8"
-	},
-/obj/effect/turf_decal/corner/opaque/brown/border{
-	dir = 4
-	},
-/obj/machinery/suit_storage_unit/inherit/industrial,
-/obj/item/clothing/suit/space/syndicate/green,
-/obj/item/clothing/head/helmet/space/syndicate/green,
-/obj/item/clothing/mask/breath,
-/turf/open/floor/plasteel/mono/dark,
-/area/ship/cargo)
-"vb" = (
-/obj/machinery/door/firedoor/border_only,
-/obj/machinery/door/firedoor/border_only{
-	dir = 1
-	},
-/obj/machinery/door/poddoor/shutters{
-	id = "warehouse"
-	},
-/obj/effect/decal/cleanable/dirt,
-/turf/open/floor/plasteel/tech/techmaint,
-/area/ship/storage)
-"vf" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer2{
-	dir = 4
-	},
-/obj/machinery/atmospherics/pipe/manifold/supply/hidden/layer4,
-/obj/effect/turf_decal/siding/blue{
-	dir = 8
-	},
-/turf/open/floor/plasteel/dark,
-/area/ship/hallway/central)
-"vp" = (
-/turf/closed/wall/mineral/plastitanium/nodiagonal,
-/area/ship/engineering)
-"vw" = (
-/obj/machinery/camera{
-	dir = 1
-	},
-/turf/open/floor/plating,
-/area/template_noop)
-"vz" = (
-/obj/machinery/atmospherics/components/unary/shuttle/heater{
-	dir = 1
-	},
-/obj/structure/window/reinforced/spawner,
-/obj/machinery/door/poddoor/shutters{
-	id = "externalshutters"
-	},
-/turf/open/floor/plasteel/tech/techmaint,
-/area/ship/engineering)
-"vT" = (
-/obj/structure/closet/crate,
-/obj/item/grenade/c4,
-/obj/item/grenade/c4,
-/obj/item/grenade/c4,
-/obj/item/grenade/c4,
-/obj/item/grenade/c4,
-/obj/item/grenade/c4,
-/obj/item/grenade/c4,
-/obj/item/grenade/c4,
-/obj/item/grenade/c4,
-/obj/item/grenade/c4,
-/turf/open/floor/plasteel/mono/dark,
-/area/ship/storage)
-"wd" = (
-/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2,
-/obj/effect/turf_decal/siding/blue{
-	dir = 4
-	},
-/turf/open/floor/plasteel/dark,
-/area/ship/hallway/central)
-"wN" = (
-/obj/structure/table,
-/obj/machinery/chem_dispenser/drinks,
-/obj/machinery/light/directional/north,
-/turf/open/floor/plasteel/mono/dark,
-/area/ship/crew/canteen)
-"wP" = (
-/obj/structure/cable{
-	icon_state = "2-4"
-	},
-/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer4,
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer2,
-/obj/effect/decal/cleanable/dirt,
-/obj/structure/cable{
-	icon_state = "1-2"
-	},
-/turf/open/floor/plasteel/mono/dark,
-/area/ship/cargo)
-"wT" = (
-/obj/machinery/atmospherics/components/unary/vent_pump/siphon/atmos/toxin_output{
-	dir = 8
-	},
-/obj/structure/window/plasma/reinforced/spawner/west,
-/turf/open/floor/engine/plasma,
-/area/ship/engineering)
-"xa" = (
-/obj/effect/turf_decal/siding/blue,
-/obj/effect/turf_decal/corner/opaque/blue/half{
-	dir = 1
-	},
-/turf/open/floor/plasteel/dark,
-/area/ship/hallway/central)
-"xc" = (
-/obj/structure/cable{
-	icon_state = "1-2"
-	},
-/obj/structure/chair/plastic{
-	dir = 4
-	},
-/obj/effect/turf_decal/siding/red{
-	dir = 8
-	},
-/obj/effect/turf_decal/corner/opaque/neutral/border{
-	dir = 4
-	},
-/turf/open/floor/plasteel/mono/dark,
-/area/ship/hallway/central)
-"xt" = (
-/obj/machinery/light/directional/east,
-/obj/item/clothing/head/HoS/beret/syndicate,
-/obj/item/radio/headset/syndicate/alt,
-/obj/item/gun/ballistic/shotgun/doublebarrel,
-/obj/item/clothing/under/rank/civilian/bartender,
-/obj/structure/closet/secure_closet/bar{
-	req_access = null;
-	req_one_access_txt = list(25,41)
-	},
-/turf/open/floor/plasteel/mono/dark,
-/area/ship/engineering)
-"xw" = (
-/obj/structure/cable{
-	icon_state = "1-8"
-	},
-/obj/effect/decal/cleanable/dirt,
-/obj/machinery/vending/clothing{
-	default_price = 0;
-	extra_price = 0
-	},
-/obj/machinery/light/small/directional/east,
-/turf/open/floor/plasteel/dark,
-/area/ship/crew/dorm)
-"yd" = (
-/obj/structure/table,
-/obj/machinery/chem_dispenser/drinks/beer,
-/turf/open/floor/plasteel/mono/dark,
-/area/ship/crew/canteen)
-"yf" = (
-/obj/effect/turf_decal/siding/blue/corner{
-	dir = 4
-	},
-/obj/effect/turf_decal/siding/blue{
-	dir = 10
-	},
-/turf/open/floor/plasteel/dark,
-/area/ship/hallway/central)
-"yh" = (
-/obj/machinery/light_switch{
-	dir = 8;
-	pixel_x = 24;
-	pixel_y = 5
-	},
-/obj/effect/turf_decal/corner/opaque/brown/border{
-	dir = 4
-	},
-/obj/effect/turf_decal/corner/opaque/brown/bordercorner{
-	dir = 1
-	},
-/turf/open/floor/plasteel/mono/dark,
-/area/ship/cargo)
-"ym" = (
-/obj/effect/turf_decal/siding/blue{
-	dir = 8
-	},
-/turf/open/floor/plasteel/dark,
-/area/ship/hallway/central)
-"yQ" = (
-/obj/structure/cable/yellow{
-	icon_state = "2-8"
-	},
-/obj/structure/cable/yellow{
-	icon_state = "2-4"
-	},
-/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer4,
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer2,
-/obj/structure/catwalk/over/plated_catwalk/dark,
-/turf/open/floor/plating,
-/area/ship/engineering)
-"yX" = (
-/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer4,
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer2,
-/obj/effect/turf_decal/siding/blue/corner{
-	dir = 8
-	},
-/obj/effect/turf_decal/siding/blue/corner,
-/obj/effect/turf_decal/siding/blue/corner{
-	dir = 1
-	},
-/obj/effect/turf_decal/siding/blue/corner{
-	dir = 4
-	},
-/obj/machinery/navbeacon/wayfinding{
-	codes_txt = "patrol;next_patrol=lux_kitchen";
-	location = "lux_shopfloor"
-	},
-/obj/machinery/holopad/emergency/cargo,
-/turf/open/floor/plasteel/dark,
-/area/ship/hallway/central)
-"zc" = (
-/obj/structure/rack,
-/obj/effect/turf_decal/corner/opaque/neutral/mono,
-/obj/machinery/airalarm/directional/east,
-/turf/open/floor/plasteel/mono/dark,
-/area/ship/hallway/central)
-"zW" = (
-/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer4{
-	dir = 6
-	},
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer2{
-	dir = 6
-	},
-/turf/open/floor/carpet/red_gold,
-/area/ship/crew/dorm)
-"Ai" = (
-/obj/structure/cable{
-	icon_state = "1-2"
-	},
-/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer4,
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer2,
-/obj/machinery/door/airlock{
-	name = "Dormitory"
-	},
-/turf/open/floor/plasteel/tech/techmaint,
-/area/ship/crew/dorm)
-"AE" = (
-/obj/machinery/door/airlock/external,
-/obj/effect/mapping_helpers/airlock/cyclelink_helper,
-/obj/machinery/atmospherics/pipe/layer_manifold,
-/turf/open/floor/plating,
-/area/ship/engineering)
-"AL" = (
-/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{
-	dir = 4
-	},
-/obj/effect/decal/cleanable/dirt,
-/turf/open/floor/plasteel/mono/dark,
-/area/ship/cargo)
-"Bt" = (
-/turf/closed/wall/mineral/plastitanium,
-/area/ship/crew/canteen)
-"Bw" = (
-/turf/closed/wall/mineral/plastitanium,
-/area/ship/cargo)
-"BM" = (
-/obj/structure/bed/pod,
-/obj/item/bedsheet/blue,
-/obj/structure/window/reinforced/tinted/frosted,
-/obj/structure/curtain/bounty,
-/obj/machinery/power/apc/auto_name/directional/west,
-/obj/structure/cable{
-	icon_state = "0-4"
-	},
-/obj/machinery/light_switch{
-	dir = 4;
-	pixel_x = -19;
-	pixel_y = 12
-	},
-/turf/open/floor/carpet/red_gold,
-/area/ship/crew/dorm)
-"BX" = (
-/obj/machinery/airalarm/directional/west,
-/obj/machinery/cryopod{
-	dir = 4
-	},
-/turf/open/floor/plasteel/tech/techmaint,
-/area/ship/crew/dorm)
-"BZ" = (
-/obj/effect/decal/cleanable/dirt,
-/obj/effect/turf_decal/corner/opaque/brown/border{
-	dir = 4
-	},
-/turf/open/floor/plasteel/mono/dark,
-/area/ship/cargo)
-"CC" = (
-/obj/effect/decal/cleanable/dirt,
-/turf/open/floor/plasteel/mono/dark,
-/area/ship/cargo)
-"CI" = (
-/obj/effect/turf_decal/siding/blue/corner{
-	dir = 1
-	},
-/obj/effect/turf_decal/siding/blue{
-	dir = 6
-	},
-/turf/open/floor/plasteel/dark,
-/area/ship/hallway/central)
-"CM" = (
-/obj/structure/cable{
-	icon_state = "2-4"
-	},
-/obj/structure/cable{
-	icon_state = "2-8"
-	},
-/obj/machinery/atmospherics/pipe/manifold4w/supply/hidden/layer4,
-/obj/machinery/atmospherics/pipe/manifold4w/scrubbers/hidden/layer2,
-/obj/structure/catwalk/over/plated_catwalk,
-/turf/open/floor/plating,
-/area/ship/engineering)
-"CT" = (
-/obj/machinery/computer/atmos_control/tank/toxin_tank{
-	dir = 8
-	},
-/obj/machinery/light/directional/south,
-/turf/open/floor/plasteel/tech/techmaint,
-/area/ship/engineering)
-"CV" = (
-/obj/structure/cable{
-	icon_state = "1-2"
-	},
-/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer4,
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer2,
-/obj/effect/turf_decal/siding/red,
-/obj/structure/cable{
-	icon_state = "2-8"
-	},
-/turf/open/floor/plasteel/mono/dark,
-/area/ship/crew/canteen)
-"CW" = (
-/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer4{
-	dir = 4
-	},
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer2{
-	dir = 8
-	},
-/obj/structure/closet/secure_closet/engineering_electrical,
-/obj/item/stack/circuit_stack/full,
-/obj/item/stack/circuit_stack/full,
-/obj/item/stack/circuit_stack/full,
-/obj/item/stack/circuit_stack/full,
-/obj/machinery/light/directional/north,
-/turf/open/floor/plasteel/tech/techmaint,
-/area/ship/engineering)
-"Da" = (
-/obj/structure/cable{
-	icon_state = "1-2"
-	},
-/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer4,
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer2,
-/obj/machinery/door/firedoor/border_only{
-	dir = 1
-	},
-/obj/machinery/door/firedoor/border_only,
-/obj/machinery/door/airlock{
-	name = "Canteen"
-	},
-/turf/open/floor/plasteel/tech/techmaint,
-/area/ship/crew/canteen)
-"Dq" = (
-/obj/structure/cable{
-	icon_state = "1-2"
-	},
-/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer4,
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer2,
-/obj/effect/turf_decal/corner/opaque/neutral/mono,
-/obj/machinery/navbeacon/wayfinding{
-	codes_txt = "patrol;next_patrol=lux_crew";
-	location = "lux_kitchen"
-	},
-/turf/open/floor/plasteel/mono/dark,
-/area/ship/crew/canteen)
-"Dw" = (
-/obj/structure/table,
-/obj/structure/window/plasma/reinforced,
-/obj/item/reagent_containers/food/drinks/shaker,
-/obj/machinery/door/firedoor,
-/turf/open/floor/plasteel/mono/dark,
-/area/ship/crew/canteen)
-"DA" = (
-/obj/effect/turf_decal/siding/red,
-/obj/machinery/firealarm/directional/south,
-/obj/machinery/light_switch{
-	dir = 1;
-	pixel_x = 6;
-	pixel_y = -24
-	},
-/obj/machinery/airalarm/directional/east,
-/obj/machinery/vending/dinnerware,
-/turf/open/floor/plasteel/mono/dark,
-/area/ship/crew/canteen)
-"DE" = (
-/obj/structure/rack,
-/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{
-	dir = 8
-	},
-/obj/effect/turf_decal/corner/opaque/neutral/mono,
-/turf/open/floor/plasteel/mono/dark,
-/area/ship/hallway/central)
-"DG" = (
-/obj/machinery/light/directional/south,
-/obj/structure/rack,
-/obj/effect/turf_decal/corner/opaque/neutral/mono,
-/turf/open/floor/plasteel/mono/dark,
-/area/ship/hallway/central)
-"DJ" = (
-/obj/machinery/atmospherics/pipe/manifold/supply/hidden/layer4{
-	dir = 8
-	},
-/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer2{
-	dir = 4
-	},
-/obj/structure/catwalk/over/plated_catwalk/dark,
-/obj/effect/turf_decal/number/five{
-	dir = 4
-	},
-/turf/open/floor/plating,
-/area/ship/engineering)
-"DW" = (
-/obj/effect/decal/cleanable/dirt,
-/obj/machinery/light_switch{
-	dir = 8;
-	pixel_x = 24
-	},
-/obj/structure/chair/plastic,
-/turf/open/floor/carpet/red_gold,
-/area/ship/crew/dorm)
-"Ee" = (
-/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer4{
-	dir = 4
-	},
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer2{
-	dir = 4
-	},
-/obj/effect/turf_decal/corner/opaque/brown/border{
-	dir = 4
-	},
-/turf/open/floor/plasteel/mono/dark,
-/area/ship/cargo)
-"Ej" = (
-/obj/machinery/modular_computer/console/preset/command{
-	dir = 4
-	},
-/turf/open/floor/plasteel/mono/dark,
-/area/ship/hallway/central)
-"Er" = (
-/obj/machinery/atmospherics/pipe/simple/orange/visible{
-	dir = 9
-	},
-/turf/closed/wall/mineral/plastitanium/nodiagonal,
-/area/ship/engineering)
-"EG" = (
-/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{
-	dir = 8
-	},
-/obj/effect/turf_decal/trimline/opaque/brown/filled/warning{
-	dir = 4
-	},
-/turf/open/floor/plasteel/mono/dark,
-/area/ship/cargo)
-"EO" = (
-/turf/closed/wall/mineral/plastitanium/nodiagonal,
-/area/ship/crew/dorm)
-"EW" = (
-/turf/open/floor/engine/plasma,
-/area/ship/engineering)
-"EZ" = (
-/obj/item/radio/headset/syndicate/alt,
-/obj/item/toy/figure/cargotech,
-/obj/item/clothing/suit/hooded/wintercoat/cargo,
-/obj/item/stack/sheet/cardboard/fifty,
-/obj/item/hand_labeler,
-/obj/item/hand_labeler_refill,
-/obj/item/clothing/under/syndicate/donk,
-/obj/item/clothing/suit/hazardvest/donk,
-/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{
-	dir = 4
-	},
-/obj/item/stack/wrapping_paper,
-/obj/item/stack/packageWrap,
-/obj/structure/closet/wall{
-	dir = 4;
-	icon_door = "orange_wall";
-	name = "employee closet";
-	pixel_x = -28
-	},
-/turf/open/floor/plasteel/mono/dark,
-/area/ship/engineering)
-"Fj" = (
-/obj/structure/cable{
-	icon_state = "4-8"
-	},
-/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer4,
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer2,
-/obj/item/paper{
-	desc = "A piece of paper depicting a extremely pissed up upper manager";
-	default_raw_text = "YOU DAMNNED FOOLS! YOU ARENT SUPPOSED TO USE YOUR STOCK, YOU'RE SUPPOSED TO SELL THEM!! WE AREN'T WASTING MY MONEY ARE WE!?! NOW GET BACK TO WORK!!!";
-	name = "angry letter from upper management"
-	},
-/turf/open/floor/plasteel/patterned/cargo_one,
-/area/ship/storage)
-"Fq" = (
-/obj/structure/cable{
-	icon_state = "4-8"
-	},
-/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer4{
-	dir = 8
-	},
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer2{
-	dir = 4
-	},
-/obj/machinery/holopad/emergency/bar,
-/obj/effect/turf_decal/corner/opaque/neutral/mono,
-/turf/open/floor/plasteel/mono/dark,
-/area/ship/crew/canteen)
-"FV" = (
-/obj/structure/cable{
-	icon_state = "1-2"
-	},
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer2,
-/obj/machinery/atmospherics/pipe/manifold/supply/hidden/layer4{
-	dir = 8
-	},
-/turf/open/floor/plasteel/patterned,
-/area/ship/crew/dorm)
-"Ga" = (
-/obj/machinery/computer/helm,
-/turf/open/floor/plasteel/mono/dark,
-/area/ship/hallway/central)
-"Gr" = (
-/obj/structure/cable{
-	icon_state = "4-8"
-	},
-/obj/machinery/atmospherics/pipe/simple/orange/visible{
-	dir = 4
-	},
-/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{
-	dir = 8
-	},
-/obj/structure/catwalk/over/plated_catwalk,
-/turf/open/floor/plating,
-/area/ship/engineering)
-"GD" = (
-/obj/docking_port/stationary{
-	width = 30;
-	height = 15;
-	dir = 8;
-	dwidth = 15
-	},
-/turf/template_noop,
-/area/template_noop)
-"GG" = (
-/obj/structure/cable{
-	icon_state = "4-8"
-	},
-/obj/machinery/atmospherics/pipe/simple/orange/visible{
-	dir = 6
-	},
-/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer2{
-	dir = 1
-	},
-/obj/effect/decal/cleanable/dirt,
-/obj/structure/catwalk/over/plated_catwalk,
-/turf/open/floor/plating,
-/area/ship/engineering)
-"Hx" = (
-/turf/closed/wall/mineral/plastitanium,
-/area/ship/crew/dorm)
-"HG" = (
-/obj/machinery/power/shieldwallgen/atmos{
-	anchored = 1;
-	id = "luxembourg_cargo";
-	locked = 1
-	},
-/obj/structure/cable{
-	icon_state = "0-4"
-	},
-/obj/machinery/door/poddoor/shutters{
-	dir = 4;
-	id = "syndiefuck"
-	},
-/turf/open/floor/plasteel/mono/dark,
-/area/ship/cargo)
-"HK" = (
-/obj/structure/rack,
-/obj/effect/turf_decal/corner/opaque/neutral/mono,
-/obj/machinery/light/directional/east,
-/turf/open/floor/plasteel/mono/dark,
-/area/ship/hallway/central)
-"HZ" = (
-/obj/structure/table,
-/obj/item/reagent_containers/glass/rag,
-/obj/machinery/door/firedoor,
-/turf/open/floor/plasteel/mono/dark,
-/area/ship/crew/canteen)
-"Id" = (
-/obj/structure/cable{
-	icon_state = "1-2"
-	},
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer2,
-/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer4,
-/obj/structure/cable{
-	icon_state = "2-8"
-	},
-/turf/open/floor/carpet/red_gold,
-/area/ship/crew/dorm)
-"Ij" = (
-/obj/effect/spawner/structure/window/plasma/reinforced/plastitanium,
-/obj/docking_port/mobile{
-	can_move_docking_ports = 1;
-	dir = 2;
-	launch_status = 0
-	},
-/obj/machinery/door/poddoor/shutters{
-	id = "externalshutters"
-	},
-/turf/open/floor/plating,
-/area/ship/hallway/central)
-"Ip" = (
-/obj/item/toy/figure/cargotech,
-/obj/item/clothing/suit/hooded/wintercoat/cargo,
-/obj/item/stack/sheet/cardboard/fifty,
-/obj/item/hand_labeler,
-/obj/item/hand_labeler_refill,
-/obj/item/clothing/under/syndicate/donk,
-/obj/item/clothing/suit/hazardvest/donk,
-/obj/item/stack/wrapping_paper,
-/obj/item/stack/packageWrap,
-/obj/structure/railing,
-/obj/structure/closet/wall{
-	dir = 8;
-	icon_door = "orange_wall";
-	name = "employee closet";
-	pixel_x = 28
-	},
-/turf/open/floor/plasteel/mono/dark,
-/area/ship/engineering)
-"Iv" = (
-/obj/effect/turf_decal/siding/blue{
-	dir = 4
-	},
-/obj/effect/turf_decal/siding/blue{
-	dir = 8
-	},
-/turf/open/floor/plasteel/dark,
-/area/ship/hallway/central)
-"IT" = (
-/obj/machinery/power/apc/auto_name/directional/east,
-/obj/structure/cable,
-/obj/effect/turf_decal/siding/blue,
-/obj/machinery/light_switch{
-	dir = 8;
-	pixel_x = 20;
-	pixel_y = 11
-	},
-/turf/open/floor/plasteel/dark,
-/area/ship/hallway/central)
-"Je" = (
-/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer4,
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer2,
-/obj/structure/cable{
-	icon_state = "1-2"
-	},
-/turf/open/floor/plasteel/mono/dark,
-/area/ship/cargo)
-"Ji" = (
-/obj/structure/bed/pod,
-/obj/item/bedsheet/blue,
-/obj/structure/curtain/bounty,
-/turf/open/floor/carpet/red_gold,
-/area/ship/crew/dorm)
-"Jq" = (
-/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer4,
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer2,
-/obj/effect/turf_decal/siding/blue/corner{
-	dir = 1
-	},
-/obj/effect/turf_decal/siding/blue/corner{
-	dir = 4
-	},
-/turf/open/floor/plasteel/dark,
-/area/ship/hallway/central)
-"Jr" = (
-/obj/effect/turf_decal/siding/blue{
-	dir = 1
-	},
-/obj/effect/turf_decal/siding/blue/corner,
-/turf/open/floor/plasteel/dark,
-/area/ship/hallway/central)
-"JO" = (
-/obj/structure/closet/crate/science,
-/obj/item/circuitboard/machine/chem_dispenser/drinks,
-/obj/item/circuitboard/machine/chem_dispenser/drinks,
-/obj/item/circuitboard/machine/chem_dispenser/drinks,
-/obj/item/circuitboard/machine/chem_dispenser/drinks/beer,
-/obj/item/circuitboard/machine/chem_dispenser/drinks/beer,
-/obj/item/circuitboard/machine/chem_dispenser/drinks/beer,
-/obj/item/circuitboard/machine/deep_fryer,
-/obj/item/circuitboard/machine/deep_fryer,
-/obj/item/circuitboard/machine/deep_fryer,
-/obj/item/circuitboard/machine/mechfab,
-/obj/item/circuitboard/machine/mechfab,
-/obj/item/circuitboard/machine/mechfab,
-/obj/item/circuitboard/machine/mechfab,
-/obj/item/circuitboard/machine/mechfab,
-/obj/item/circuitboard/machine/ore_redemption,
-/obj/item/circuitboard/machine/ore_redemption,
-/obj/item/circuitboard/machine/ore_redemption,
-/obj/item/circuitboard/machine/microwave,
-/obj/item/circuitboard/machine/microwave,
-/obj/item/circuitboard/machine/microwave,
-/obj/machinery/firealarm/directional/east,
-/obj/machinery/light_switch{
-	pixel_x = 6;
-	pixel_y = 24
-	},
-/turf/open/floor/plasteel/mono/dark,
-/area/ship/storage)
-"JT" = (
-/obj/machinery/door/poddoor/shutters{
-	dir = 4;
-	id = "syndiefuck"
-	},
-/turf/open/floor/plasteel/mono/dark,
-/area/ship/cargo)
-"JU" = (
-/obj/effect/turf_decal/corner/opaque/brown/border{
-	dir = 6
-	},
-/obj/machinery/suit_storage_unit/inherit/industrial,
-/obj/item/clothing/suit/space/syndicate/blue,
-/obj/item/clothing/head/helmet/space/syndicate/blue,
-/obj/item/clothing/mask/breath,
-/turf/open/floor/plasteel/mono/dark,
-/area/ship/cargo)
-"JV" = (
-/obj/effect/turf_decal/corner/opaque/brown/bordercorner{
-	dir = 1
-	},
-/obj/structure/cable{
-	icon_state = "4-8"
-	},
-/turf/open/floor/plasteel/mono/dark,
-/area/ship/cargo)
-"Ka" = (
-/turf/closed/wall/mineral/plastitanium/nodiagonal,
-/area/ship/storage)
-"Kg" = (
-/obj/effect/decal/cleanable/dirt,
-/obj/machinery/shower{
-	dir = 4
-	},
-/obj/structure/window/reinforced/tinted/frosted,
-/obj/structure/curtain,
-/obj/effect/turf_decal/steeldecal/steel_decals10{
-	dir = 8
-	},
-/obj/machinery/light_switch{
-	pixel_y = 23;
-	pixel_x = 11
-	},
-/turf/open/floor/plasteel/patterned,
-/area/ship/crew/dorm)
-"Kk" = (
-/obj/machinery/air_sensor/atmos/toxin_tank,
-/turf/open/floor/engine/plasma,
-/area/ship/engineering)
-"Ko" = (
-/obj/structure/cable{
-	icon_state = "2-8"
-	},
-/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2,
-/obj/effect/decal/cleanable/dirt,
-/obj/machinery/navbeacon/wayfinding{
-	codes_txt = "patrol;next_patrol=lux_lobby";
-	location = "lux_warehouse"
-	},
-/turf/open/floor/plasteel/patterned/cargo_one,
-/area/ship/storage)
-"KH" = (
-/obj/effect/decal/cleanable/dirt,
-/obj/machinery/vending/autodrobe/all_access{
-	default_price = 0;
-	extra_price = 0
-	},
-/obj/machinery/firealarm/directional/south,
-/turf/open/floor/plasteel/dark,
-/area/ship/crew/dorm)
-"KX" = (
-/obj/structure/closet/crate,
-/obj/item/construction/rcd/combat,
-/obj/item/construction/rcd/combat,
-/obj/item/construction/rcd/combat,
-/obj/item/construction/rcd/combat,
-/obj/item/construction/rcd/combat,
-/obj/item/construction/rcd/combat,
-/obj/item/construction/rcd/combat,
-/obj/item/construction/rcd/combat,
-/obj/item/construction/rcd/combat,
-/obj/item/construction/rcd/combat,
-/turf/open/floor/plasteel/mono/dark,
-/area/ship/storage)
-"KZ" = (
-/obj/effect/turf_decal/siding/red,
-/obj/structure/closet/secure_closet/freezer/wall{
-	dir = 1;
-	name = "refrigerator";
-	pixel_y = -32
-	},
-/obj/item/storage/box/donkpockets/donkpocketteriyaki,
-/obj/item/storage/box/donkpockets/donkpocketteriyaki,
-/obj/item/storage/box/donkpockets/donkpocketteriyaki,
-/obj/item/storage/box/donkpockets/donkpocketteriyaki,
-/obj/item/storage/box/donkpockets/donkpocketspicy,
-/obj/item/storage/box/donkpockets/donkpocketspicy,
-/obj/item/storage/box/donkpockets/donkpocketspicy,
-/obj/item/storage/box/donkpockets/donkpocketspicy,
-/obj/item/storage/box/donkpockets/donkpockethonk,
-/obj/item/storage/box/donkpockets/donkpockethonk,
-/obj/item/storage/box/donkpockets/donkpockethonk,
-/obj/item/storage/box/donkpockets/donkpockethonk,
-/obj/item/storage/box/donkpockets,
-/obj/item/storage/box/donkpockets,
-/obj/item/storage/box/donkpockets,
-/obj/item/storage/box/donkpockets,
-/turf/open/floor/plasteel/mono/dark,
-/area/ship/crew/canteen)
-"La" = (
-/obj/effect/turf_decal/corner/opaque/blue{
-	dir = 4
-	},
-/obj/machinery/button/door{
-	id = "cargodoors";
-	pixel_y = 25
-	},
-/turf/open/floor/plasteel/dark,
-/area/ship/hallway/central)
-"Lr" = (
-/obj/structure/cable{
-	icon_state = "4-8"
-	},
-/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer4{
-	dir = 8
-	},
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer2{
-	dir = 4
-	},
-/obj/structure/table,
-/obj/item/reagent_containers/food/drinks/drinkingglass{
-	pixel_x = -4;
-	pixel_y = -4
-	},
-/obj/item/paper{
-	desc = "A piece of paper depicting a extremely pissed up upper manager";
-	default_raw_text = "YOU ARENT SUPPOSED TO BE MINING, HEAR ME!?!! YOU'RE SUPPOSED TO BE SELLING SHIT TO THE CONSUMERS YOU HEAR!! AS PUNISHMENT FOR THE LAST SHIFT, I HAVE REMOVED ALLL OF YOUR MINING TOOLS!! NOW GET BACK TO WORK!!";
-	name = "angry letter from upper management"
-	},
-/obj/machinery/door/firedoor,
-/turf/open/floor/plasteel/mono/dark,
-/area/ship/crew/canteen)
-"Lu" = (
-/obj/structure/chair/plastic{
-	dir = 1
-	},
-/turf/open/floor/carpet/red_gold,
-/area/ship/crew/dorm)
-"LU" = (
-/obj/machinery/atmospherics/components/unary/outlet_injector/atmos/air_input{
-	dir = 4
-	},
-/obj/structure/window/plasma/reinforced/spawner/east,
-/turf/open/floor/engine/air,
-/area/ship/engineering)
-"LV" = (
-/obj/machinery/vending/boozeomat/all_access{
-	default_price = 0;
-	extra_price = 0
-	},
-/turf/open/floor/plasteel/mono/dark,
-/area/ship/crew/canteen)
-"LY" = (
-/obj/machinery/firealarm/directional/west,
-/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{
-	dir = 8
-	},
-/obj/structure/closet/crate,
-/obj/item/card/emag/limited,
-/obj/item/card/emag/limited,
-/obj/item/card/emag/limited,
-/obj/item/card/emag/limited,
-/obj/item/card/emag/limited,
-/obj/item/card/emag/limited,
-/obj/item/card/emag/limited,
-/obj/item/card/emag/limited,
-/obj/item/card/emag/limited,
-/obj/item/card/emag/limited,
-/obj/item/radio/intercom/directional/east,
-/turf/open/floor/plasteel/mono/dark,
-/area/ship/storage)
-"Mg" = (
-/obj/structure/cable{
-	icon_state = "2-8"
-	},
-/obj/machinery/atmospherics/pipe/manifold/supply/hidden/layer4{
-	dir = 4
-	},
-/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer2{
-	dir = 1
-	},
-/obj/effect/turf_decal/corner/opaque/neutral/mono,
-/turf/open/floor/plasteel/mono/dark,
-/area/ship/crew/canteen)
-"Mi" = (
-/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer4{
-	dir = 4
-	},
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer2{
-	dir = 4
-	},
-/obj/effect/decal/cleanable/dirt,
-/obj/structure/table/reinforced,
-/obj/structure/window/plasma/reinforced,
-/obj/machinery/door/window/eastright,
-/obj/machinery/door/firedoor,
-/obj/machinery/door/poddoor/shutters{
-	dir = 4;
-	id = "cargodoors"
-	},
-/turf/open/floor/plasteel/dark,
-/area/ship/cargo)
-"Mj" = (
-/obj/machinery/atmospherics/components/binary/dp_vent_pump,
-/obj/machinery/advanced_airlock_controller{
-	pixel_x = -25
-	},
-/turf/open/floor/plating,
-/area/ship/engineering)
-"Mx" = (
-/obj/effect/turf_decal/siding/blue{
-	dir = 8
-	},
-/obj/machinery/light_switch{
-	dir = 1;
-	pixel_x = 10;
-	pixel_y = -21
-	},
-/obj/machinery/firealarm/directional/south,
-/obj/effect/turf_decal/trimline/opaque/blue/filled/warning,
-/turf/open/floor/plasteel/dark,
-/area/ship/hallway/central)
-"Mz" = (
-/obj/structure/tank_dispenser/oxygen,
-/obj/effect/decal/cleanable/dirt,
-/obj/effect/turf_decal/corner/opaque/brown/border{
-	dir = 9
-	},
-/turf/open/floor/plasteel/mono/dark,
-/area/ship/cargo)
-"MT" = (
-/obj/effect/spawner/structure/window/plasma/reinforced/plastitanium,
-/obj/machinery/door/poddoor/shutters{
-	dir = 4;
-	id = "externalshutters"
-	},
-/turf/open/floor/plating,
-/area/ship/cargo)
-"MU" = (
-/obj/machinery/door/window/brigdoor{
-	name = "Bridge";
-	req_access_txt = "41"
-	},
-/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer4{
-	dir = 6
-	},
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer2{
-	dir = 10
-	},
-/turf/open/floor/carpet/red_gold,
-/area/ship/hallway/central)
-"Nr" = (
-/turf/template_noop,
-/area/template_noop)
-"NH" = (
-/obj/effect/turf_decal/siding/blue/corner,
-/obj/effect/turf_decal/corner/opaque/blue/half{
-	dir = 1
-	},
-/turf/open/floor/plasteel/dark,
-/area/ship/hallway/central)
-"NJ" = (
-/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer4{
-	dir = 4
-	},
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer2{
-	dir = 4
-	},
-/turf/open/floor/plasteel/dark,
-/area/ship/hallway/central)
-"NQ" = (
-/obj/machinery/light/directional/west,
-/obj/effect/decal/cleanable/dirt,
-/obj/structure/table,
-/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{
-	dir = 4
-	},
-/obj/item/storage/fancy/cigarettes/cigpack_syndicate{
-	pixel_x = 6
-	},
-/obj/item/lighter/greyscale{
-	pixel_x = -3;
-	pixel_y = 4
-	},
-/turf/open/floor/carpet/red_gold,
-/area/ship/crew/dorm)
-"On" = (
-/obj/item/storage/toolbox/syndicate,
-/obj/item/storage/toolbox/syndicate,
-/obj/item/storage/toolbox/syndicate,
-/obj/item/storage/toolbox/syndicate,
-/obj/item/storage/toolbox/syndicate,
-/obj/item/storage/toolbox/syndicate,
-/obj/item/storage/toolbox/syndicate,
-/obj/item/storage/toolbox/syndicate,
-/obj/item/storage/toolbox/syndicate,
-/obj/item/storage/toolbox/syndicate,
-/obj/item/storage/toolbox/syndicate,
-/obj/structure/closet/crate,
-/turf/open/floor/plasteel/mono/dark,
-/area/ship/storage)
-"Op" = (
-/obj/effect/spawner/structure/window/plasma/reinforced/plastitanium,
-/obj/machinery/door/poddoor/shutters{
-	dir = 4;
-	id = "externalshutters"
-	},
-/turf/open/floor/plating,
-/area/ship/crew/canteen)
-"Oq" = (
-/obj/structure/table,
-/obj/item/toy/cards/deck/syndicate,
-/turf/open/floor/carpet/red_gold,
-/area/ship/crew/dorm)
-"Oz" = (
-/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4,
-/obj/effect/turf_decal/siding/blue{
-	dir = 8
-	},
-/turf/open/floor/plasteel/dark,
-/area/ship/hallway/central)
-"OR" = (
-/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer4{
-	dir = 6
-	},
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer2{
-	dir = 6
-	},
-/obj/effect/decal/cleanable/oil,
-/obj/structure/cable{
-	icon_state = "2-8"
-	},
-/turf/open/floor/plasteel/mono/dark,
-/area/ship/cargo)
-"OY" = (
-/obj/structure/closet/crate/trashcart,
-/obj/effect/spawner/lootdrop/maintenance/eight,
-/obj/effect/turf_decal/corner/opaque/brown/border{
-	dir = 9
-	},
-/obj/machinery/button/shieldwallgen{
-	id = "luxembourg_cargo";
-	pixel_x = -10;
-	pixel_y = 25
-	},
-/obj/structure/cable{
-	icon_state = "4-8"
-	},
-/obj/machinery/button/door{
-	id = "syndiefuck";
-	pixel_x = -20;
-	pixel_y = 26
-	},
-/turf/open/floor/plasteel/mono/dark,
-/area/ship/cargo)
-"Pb" = (
-/obj/effect/decal/cleanable/dirt,
-/turf/closed/wall/mineral/plastitanium/nodiagonal,
-/area/ship/crew/dorm)
-"Ph" = (
-/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer4,
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer2,
-/obj/structure/catwalk/over/plated_catwalk/dark,
-/obj/effect/turf_decal/number/zero{
-	dir = 4
-	},
-/turf/open/floor/plating,
-/area/ship/engineering)
-"Ps" = (
-/obj/machinery/light/directional/south,
-/obj/item/banner/cargo,
-/obj/effect/turf_decal/corner/opaque/brown/border{
-	dir = 10
-	},
-/obj/machinery/button/shieldwallgen{
-	dir = 1;
-	id = "luxembourg_cargo";
-	pixel_x = -10;
-	pixel_y = -25
-	},
-/obj/structure/cable{
-	icon_state = "4-8"
-	},
-/obj/machinery/button/door{
-	dir = 1;
-	id = "syndiefuck";
-	pixel_x = -20;
-	pixel_y = -26
-	},
-/turf/open/floor/plasteel/mono/dark,
-/area/ship/cargo)
-"PO" = (
-/obj/structure/sign/poster/contraband/syndicate_recruitment{
-	pixel_x = 4;
-	pixel_y = -30
-	},
-/obj/effect/turf_decal/siding/blue{
-	dir = 4
-	},
-/obj/effect/turf_decal/trimline/opaque/blue/filled/warning,
-/turf/open/floor/plasteel/dark,
-/area/ship/hallway/central)
-"PW" = (
-/obj/structure/sign/donk{
-	pixel_x = -32
-	},
-/obj/structure/rack,
-/obj/effect/turf_decal/corner/opaque/neutral/mono,
-/turf/open/floor/plasteel/mono/dark,
-/area/ship/hallway/central)
-"QG" = (
-/obj/machinery/light/directional/west,
-/obj/machinery/vending/toyliberationstation,
-/obj/structure/window/plasma/reinforced,
-/turf/open/floor/plasteel/mono/dark,
-/area/ship/hallway/central)
-"QQ" = (
-/obj/structure/window/plasma/reinforced,
-/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{
-	dir = 4
-	},
-/turf/open/floor/carpet/red_gold,
-/area/ship/hallway/central)
-"QT" = (
-/obj/machinery/light/directional/east,
-/obj/structure/window/plasma/reinforced,
-/obj/machinery/computer/selling_pad_control{
-	dir = 8
-	},
-/obj/machinery/airalarm/directional/north,
-/turf/open/floor/plasteel/mono/dark,
-/area/ship/hallway/central)
-"QU" = (
-/obj/structure/cable{
-	icon_state = "1-2"
-	},
-/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer4,
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer2,
-/obj/machinery/button/door{
-	id = "warehouse";
-	pixel_x = 24;
-	pixel_y = 21
-	},
-/turf/open/floor/plasteel/patterned/cargo_one,
-/area/ship/storage)
-"Rk" = (
-/obj/structure/rack,
-/obj/effect/turf_decal/corner/opaque/neutral/mono,
-/obj/machinery/light/directional/west,
-/turf/open/floor/plasteel/mono/dark,
-/area/ship/hallway/central)
-"Ro" = (
-/obj/structure/cable{
-	icon_state = "1-2"
-	},
-/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer4,
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer2,
-/obj/machinery/door/firedoor/border_only{
-	dir = 1
-	},
-/obj/machinery/door/firedoor/border_only,
-/obj/structure/catwalk/over/plated_catwalk/white,
-/obj/machinery/door/airlock/engineering{
-	name = "Engineering"
-	},
-/turf/open/floor/plasteel/tech/techmaint,
-/area/ship/engineering)
-"Rp" = (
-/turf/open/floor/carpet/red_gold,
-/area/ship/crew/dorm)
-"RH" = (
-/obj/effect/spawner/structure/window/plasma/reinforced/plastitanium,
-/obj/machinery/door/poddoor/shutters{
-	id = "externalshutters"
-	},
-/turf/open/floor/plating,
-/area/ship/cargo)
-"RM" = (
-/obj/effect/turf_decal/trimline/opaque/brown/filled/warning,
-/obj/structure/cable{
-	icon_state = "4-8"
-	},
-/turf/open/floor/plasteel/mono/dark,
-/area/ship/cargo)
-"Sn" = (
-/obj/effect/turf_decal/siding/blue,
-/obj/effect/turf_decal/siding/blue{
-	dir = 1
-	},
-/turf/open/floor/plasteel/dark,
-/area/ship/hallway/central)
-"SS" = (
-/obj/item/radio/headset/syndicate/alt,
-/obj/item/toy/figure/cargotech,
-/obj/item/clothing/suit/hooded/wintercoat/cargo,
-/obj/item/stack/sheet/cardboard/fifty,
-/obj/item/hand_labeler,
-/obj/item/hand_labeler_refill,
-/obj/item/clothing/under/syndicate/donk,
-/obj/item/clothing/suit/hazardvest/donk,
-/obj/item/stack/wrapping_paper,
-/obj/item/stack/packageWrap,
-/obj/structure/closet/wall{
-	dir = 4;
-	icon_door = "orange_wall";
-	name = "employee closet";
-	pixel_x = -28
-	},
-/turf/open/floor/plasteel/mono/dark,
-/area/ship/engineering)
-"Tj" = (
-/obj/effect/turf_decal/siding/red,
-/obj/machinery/power/apc/auto_name/directional/south,
-/obj/structure/cable{
-	icon_state = "0-4"
-	},
-/obj/machinery/light_switch{
-	dir = 1;
-	pixel_x = 11;
-	pixel_y = -16
-	},
-/turf/open/floor/plasteel/mono/dark,
-/area/ship/crew/canteen)
-"Ty" = (
-/obj/machinery/light/directional/east,
-/obj/structure/closet/crate/large,
-/obj/item/mecha_parts/mecha_equipment/mining_scanner,
-/mob/living/simple_animal/bot/secbot/grievous/toy,
-/obj/effect/decal/cleanable/blood/old,
-/obj/item/hand_labeler_refill,
-/obj/item/mecha_parts/mecha_equipment/hydraulic_clamp,
-/obj/item/mecha_parts/mecha_equipment/rcd,
-/obj/item/mecha_parts/mecha_equipment/cable_layer,
-/turf/open/floor/plasteel/mono/dark,
-/area/ship/storage)
-"TB" = (
-/obj/effect/turf_decal/siding/blue{
-	dir = 8
-	},
-/obj/effect/turf_decal/siding/blue{
-	dir = 4
-	},
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer2,
-/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer4,
-/turf/open/floor/plasteel/dark,
-/area/ship/hallway/central)
-"TJ" = (
-/obj/effect/spawner/structure/window/plasma/reinforced/plastitanium,
-/obj/machinery/door/poddoor/shutters{
-	dir = 4;
-	id = "externalshutters"
-	},
-/turf/open/floor/plating,
-/area/ship/storage)
-"TP" = (
-/obj/structure/rack,
-/obj/effect/turf_decal/corner/opaque/neutral/mono,
-/turf/open/floor/plasteel/mono/dark,
-/area/ship/hallway/central)
-"TY" = (
-/obj/effect/turf_decal/corner/opaque/brown/bordercorner{
-	dir = 1
-	},
-/turf/open/floor/plasteel/mono/dark,
-/area/ship/cargo)
-"Ud" = (
-/obj/effect/turf_decal/siding/blue,
-/turf/open/floor/plasteel/dark,
-/area/ship/hallway/central)
-"Uk" = (
-/turf/closed/wall/mineral/plastitanium,
-/area/ship/storage)
-"Uo" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer2,
-/obj/machinery/atmospherics/components/binary/volume_pump,
-/obj/structure/catwalk/over/plated_catwalk,
-/turf/open/floor/plating,
-/area/ship/engineering)
-"Uu" = (
-/obj/structure/cable{
-	icon_state = "1-2"
-	},
-/obj/machinery/atmospherics/pipe/manifold/supply/hidden/layer4{
-	dir = 1
-	},
-/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer2{
-	dir = 4
-	},
-/turf/open/floor/plasteel/patterned/cargo_one,
-/area/ship/storage)
-"Uw" = (
-/obj/structure/toilet{
-	dir = 4
-	},
-/obj/structure/curtain,
-/obj/machinery/airalarm/directional/south,
-/turf/open/floor/plasteel/patterned,
-/area/ship/crew/dorm)
-"UE" = (
-/turf/open/floor/plating,
-/area/ship/engineering)
-"UI" = (
-/obj/effect/turf_decal/corner/opaque/neutral/mono,
-/turf/open/floor/plasteel/mono/dark,
-/area/ship/crew/canteen)
-"UO" = (
-/obj/machinery/atmospherics/pipe/layer_manifold,
-/turf/closed/wall/mineral/plastitanium/nodiagonal,
-/area/ship/engineering)
-"Va" = (
-/obj/structure/cable{
-	icon_state = "1-8"
-	},
-/obj/structure/cable{
-	icon_state = "1-4"
-	},
-/obj/machinery/atmospherics/pipe/simple/orange/visible{
-	dir = 4
-	},
-/obj/structure/cable{
-	icon_state = "4-8"
-	},
-/obj/machinery/atmospherics/pipe/manifold/supply/hidden/layer4{
-	dir = 8
-	},
-/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer2{
-	dir = 4
-	},
-/obj/structure/catwalk/over/plated_catwalk,
-/turf/open/floor/plating,
-/area/ship/engineering)
-"Vb" = (
-/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer4,
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer2,
-/obj/effect/turf_decal/trimline/opaque/blue/filled/warning,
-/turf/open/floor/plasteel/dark,
-/area/ship/hallway/central)
-"Vi" = (
-/obj/structure/cable{
-	icon_state = "2-4"
-	},
-/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2,
-/obj/effect/turf_decal/industrial/traffic{
-	dir = 8
-	},
-/turf/open/floor/plasteel/dark,
-/area/ship/crew/dorm)
-"Vn" = (
-/obj/effect/decal/cleanable/dirt,
-/obj/effect/decal/cleanable/dirt,
-/obj/effect/turf_decal/corner/opaque/brown/border{
-	dir = 4
-	},
-/turf/open/floor/plasteel/mono/dark,
-/area/ship/cargo)
-"Vs" = (
-/obj/machinery/atmospherics/components/binary/volume_pump,
-/obj/structure/catwalk/over/plated_catwalk,
-/turf/open/floor/plating,
-/area/ship/engineering)
-"VG" = (
-/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer4,
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer2,
-/obj/effect/decal/cleanable/dirt,
-/obj/structure/catwalk/over/plated_catwalk/dark,
-/obj/effect/turf_decal/number/two{
-	dir = 4
-	},
-/turf/open/floor/plating,
-/area/ship/engineering)
-"VR" = (
-/turf/closed/wall/r_wall/syndicate/nodiagonal,
-/area/ship/engineering)
-"VS" = (
-/obj/structure/closet/crate,
-/obj/item/stack/sheet/metal/fifty,
-/obj/item/stack/sheet/glass/fifty,
-/obj/item/stack/sheet/plastitaniumglass{
-	amount = 20
-	},
-/obj/item/stack/sheet/mineral/plastitanium{
-	amount = 20
-	},
-/obj/item/stack/sheet/metal/fifty,
-/obj/item/stack/sheet/glass/fifty,
-/obj/effect/decal/cleanable/dirt,
-/obj/item/hand_labeler_refill,
-/obj/item/stack/sheet/mineral/wood/fifty,
-/turf/open/floor/plasteel/mono/dark,
-/area/ship/storage)
-"Wh" = (
-/obj/structure/cable{
-	icon_state = "1-2"
-	},
-/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer4,
-/obj/effect/turf_decal/trimline/opaque/orange/filled/warning,
-/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer2{
-	dir = 8
-	},
-/turf/open/floor/plasteel/patterned,
-/area/ship/crew/dorm)
-"Wt" = (
-/obj/machinery/smartfridge/bloodbank/preloaded,
-/turf/closed/wall/mineral/plastitanium/nodiagonal,
-/area/ship/storage)
-"WB" = (
-/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer4{
-	dir = 4
-	},
-/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer2,
-/obj/effect/turf_decal/siding/blue{
-	dir = 4
-	},
-/turf/open/floor/plasteel/dark,
-/area/ship/hallway/central)
-"WE" = (
-/turf/closed/wall/mineral/plastitanium/nodiagonal,
-/area/ship/hallway/central)
-"WQ" = (
-/obj/machinery/firealarm/directional/east,
-/obj/machinery/suit_storage_unit/inherit{
-	req_access_txt = "41"
-	},
-/obj/item/clothing/suit/space/syndicate,
-/obj/item/clothing/head/helmet/space/syndicate,
-/obj/item/clothing/mask/breath,
-/turf/open/floor/plasteel/mono/dark,
-/area/ship/engineering)
-"WU" = (
-/obj/effect/turf_decal/siding/blue{
-	dir = 8
-	},
-/obj/effect/turf_decal/siding/blue{
-	dir = 4
-	},
-/obj/machinery/atmospherics/pipe/manifold4w/supply/hidden/layer4,
-/obj/machinery/atmospherics/pipe/manifold4w/scrubbers/hidden/layer2,
-/turf/open/floor/plasteel/dark,
-/area/ship/hallway/central)
-"Xf" = (
-/obj/machinery/power/terminal{
-	dir = 8
-	},
-/obj/machinery/power/terminal{
-	dir = 4
-	},
-/obj/structure/cable/yellow,
-/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer4,
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer2,
-/obj/machinery/door/firedoor/border_only,
-/obj/machinery/door/firedoor/border_only{
-	dir = 1
-	},
-/obj/machinery/navbeacon/wayfinding{
-	codes_txt = "patrol;next_patrol=lux_warehouse";
-	location = "lux_engine"
-	},
-/turf/open/floor/plasteel/tech/techmaint,
-/area/ship/engineering)
-"Xw" = (
-/obj/machinery/washing_machine,
-/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{
-	dir = 8
-	},
-/obj/machinery/light/small/directional/north,
-/turf/open/floor/plasteel/patterned,
-/area/ship/crew/dorm)
-"XM" = (
-/obj/structure/cable{
-	icon_state = "1-4"
-	},
-/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer4{
-	dir = 4
-	},
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer2{
-	dir = 4
-	},
-/obj/effect/decal/cleanable/dirt,
-/obj/machinery/portable_atmospherics/pump,
-/turf/open/floor/plasteel/tech/techmaint,
-/area/ship/engineering)
-"XS" = (
-/obj/machinery/atmospherics/components/unary/shuttle/heater{
-	dir = 1
-	},
-/obj/structure/window/reinforced/spawner,
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer2,
-/obj/machinery/door/poddoor/shutters{
-	id = "externalshutters"
-	},
-/turf/open/floor/plasteel/tech/techmaint,
-/area/ship/engineering)
-"Yd" = (
-/obj/structure/cable{
-	icon_state = "4-8"
-	},
-/obj/machinery/atmospherics/pipe/manifold/orange/visible{
-	dir = 1
-	},
-/obj/effect/decal/cleanable/dirt,
-/obj/structure/catwalk/over/plated_catwalk/white,
-/obj/structure/cable{
-	icon_state = "1-8"
-	},
-/turf/open/floor/plating,
-/area/ship/engineering)
-"Yq" = (
-/obj/machinery/atmospherics/pipe/manifold/supply/hidden/layer4{
-	dir = 8
-	},
-/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer2{
-	dir = 4
-	},
-/obj/effect/turf_decal/siding/blue{
-	dir = 8
-	},
-/obj/effect/turf_decal/siding/blue{
-	dir = 4
-	},
-/turf/open/floor/plasteel/dark,
-/area/ship/hallway/central)
-"YE" = (
-/obj/structure/window/plasma/reinforced,
-/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{
-	dir = 8
-	},
-/obj/item/radio/intercom/directional/east{
-	pixel_y = 37
-	},
-/turf/open/floor/carpet/red_gold,
-/area/ship/hallway/central)
-"YI" = (
-/turf/closed/wall/mineral/plastitanium/nodiagonal,
-/area/ship/crew/canteen)
-"YK" = (
-/obj/machinery/airalarm/directional/west,
-/obj/item/clothing/head/collectable/chef,
-/obj/item/clothing/head/collectable/paper,
-/obj/item/clothing/head/collectable/tophat,
-/obj/item/clothing/head/collectable/captain,
-/obj/item/clothing/head/collectable/beret,
-/obj/item/clothing/head/collectable/welding,
-/obj/item/clothing/head/collectable/flatcap,
-/obj/item/clothing/head/collectable/pirate,
-/obj/item/clothing/head/collectable/kitty,
-/obj/item/clothing/head/collectable/rabbitears,
-/obj/item/clothing/head/collectable/wizard,
-/obj/item/clothing/head/collectable/hardhat,
-/obj/item/clothing/head/collectable/HoS,
-/obj/item/clothing/head/collectable/HoP,
-/obj/item/clothing/head/collectable/thunderdome,
-/obj/item/clothing/head/collectable/swat,
-/obj/item/clothing/head/collectable/slime,
-/obj/item/clothing/head/collectable/police,
-/obj/item/clothing/head/collectable/xenom,
-/obj/item/clothing/head/collectable/petehat,
-/obj/structure/closet/crate,
-/turf/open/floor/plasteel/mono/dark,
-/area/ship/storage)
-"YL" = (
-/obj/structure/chair/plastic{
-	dir = 4
-	},
-/obj/effect/turf_decal/siding/red{
-	dir = 8
-	},
-/obj/effect/turf_decal/corner/opaque/neutral/border{
-	dir = 4
-	},
-/turf/open/floor/plasteel/mono/dark,
-/area/ship/hallway/central)
-"YO" = (
-/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer4{
-	dir = 5
-	},
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer2{
-	dir = 5
-	},
-/turf/open/floor/plasteel/patterned/cargo_one,
-/area/ship/storage)
-"YZ" = (
-/obj/structure/closet/secure{
-	icon_state = "eng_secure";
-	name = "GEC Engineer's locker"
-	},
-/obj/item/clothing/gloves/color/yellow,
-/obj/item/pipe_dispenser,
-/obj/item/clothing/glasses/meson/engine,
-/obj/item/clothing/suit/toggle/hazard,
-/obj/item/clothing/head/beret/eng/hazard,
-/obj/item/clothing/head/beret/eng,
-/obj/item/holosign_creator/engineering,
-/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer4{
-	dir = 4
-	},
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer2{
-	dir = 8
-	},
-/obj/item/clothing/under/syndicate/gec,
-/obj/item/clothing/under/syndicate/gec,
-/obj/item/stack/tape/industrial/pro,
-/obj/machinery/power/apc/auto_name/directional/north,
-/obj/structure/cable{
-	icon_state = "0-2"
-	},
-/obj/machinery/light_switch{
-	pixel_y = 23;
-	pixel_x = 11
-	},
-/turf/open/floor/plasteel/tech/techmaint,
-/area/ship/engineering)
-"Zm" = (
-/obj/structure/cable{
-	icon_state = "4-8"
-	},
-/obj/machinery/atmospherics/pipe/manifold/orange/visible{
-	dir = 1
-	},
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer2{
-	dir = 9
-	},
-/obj/structure/catwalk/over/plated_catwalk,
-/turf/open/floor/plating,
-/area/ship/engineering)
-"ZV" = (
-/obj/structure/cable{
-	icon_state = "1-4"
-	},
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer2{
-	dir = 5
-	},
-/obj/structure/catwalk/over/plated_catwalk,
-/obj/machinery/atmospherics/components/unary/portables_connector{
-	dir = 8
-	},
-/turf/open/floor/plating,
-/area/ship/engineering)
-
-(1,1,1) = {"
-Nr
-Nr
-Nr
-Nr
-Nr
-Nr
-Nr
-Nr
-Nr
-GD
-Nr
-Nr
-Nr
-Nr
-Nr
-Nr
-Nr
-Nr
-Nr
-Nr
-Nr
-Nr
-Nr
-Nr
-Nr
-Nr
-Nr
-"}
-(2,1,1) = {"
-Nr
-Nr
-Nr
-Nr
-Nr
-Nr
-hs
-HG
-JT
-JT
-JT
-it
-Ka
-Nr
-Nr
-Nr
-Nr
-Nr
-Nr
-Nr
-Nr
-Nr
-Nr
-Nr
-Nr
-Nr
-Nr
-"}
-(3,1,1) = {"
-Nr
-Nr
-Nr
-Nr
-Bw
-MT
-hs
-OY
-hX
-hX
-fB
-Ps
-Ka
-TJ
-TJ
-Uk
-Nr
-Nr
-Nr
-Nr
-pt
-VR
-pt
-Nr
-Nr
-Nr
-Nr
-"}
-(4,1,1) = {"
-Nr
-Nr
-Nr
-Bw
-hs
-Mz
-qh
-JV
-AL
-hi
-CC
-RM
-vb
-VS
-qV
-Wt
-TJ
-Uk
-Nr
-Uk
-VR
-qe
-VR
-pt
-Nr
-Nr
-Nr
-"}
-(5,1,1) = {"
-Nr
-Nr
-hs
-hs
-bB
-TY
-CC
-OR
-gf
-Je
-wP
-fy
-lQ
-QU
-kI
-iF
-vT
-Ka
-TJ
-Ka
-VR
-qR
-jK
-VR
-Nr
-Nr
-Nr
-"}
-(6,1,1) = {"
-Nr
-Nr
-RH
-sV
-yh
-BZ
-Vn
-Ee
-EG
-hu
-uX
-JU
-Ka
-JO
-iO
-Fj
-YO
-YK
-ks
-On
-vp
-rV
-LU
-VR
-pt
-Nr
-Nr
-"}
-(7,1,1) = {"
-Nr
-Nr
-hs
-hs
-hs
-ga
-ug
-Mi
-tV
-hs
-hs
-hs
-Ka
-Ka
-Ty
-Ko
-Uu
-lg
-hm
-rU
-Ro
-uo
-ZV
-mK
-vp
-pt
-Nr
-"}
-(8,1,1) = {"
-Nr
-Nr
-Nr
-WE
-WE
-La
-aB
-NJ
-Ud
-TP
-Rk
-PW
-cI
-Ka
-Ka
-KX
-LY
-cq
-pd
-ke
-vp
-dC
-GG
-Uo
-XS
-iR
-hd
-"}
-(9,1,1) = {"
-tU
-WE
-kZ
-WE
-QG
-NH
-wd
-WB
-tO
-Iv
-Iv
-Iv
-yf
-DG
-Ka
-Ka
-Ka
-Ka
-Ka
-Ka
-vp
-gj
-Zm
-Vs
-vz
-sh
-Nr
-"}
-(10,1,1) = {"
-WE
-WE
-Ej
-bi
-QQ
-xa
-dp
-bV
-Sn
-TP
-TP
-jv
-pL
-Mx
-vp
-fo
-SS
-EZ
-mm
-tx
-pR
-XM
-ql
-pJ
-vp
-vp
-vp
-"}
-(11,1,1) = {"
-Ij
-Ga
-dA
-jr
-MU
-rh
-TB
-WU
-yX
-gC
-gC
-Yq
-Jq
-Vb
-dL
-VG
-Ph
-DJ
-mE
-yQ
-Xf
-CM
-Va
-dM
-AE
-Mj
-qP
-"}
-(12,1,1) = {"
-WE
-WE
-jH
-fv
-YE
-xa
-dp
-dH
-Sn
-TP
-TP
-DE
-Jr
-PO
-vp
-WQ
-xt
-cB
-Ip
-ul
-pR
-lb
-Gr
-eD
-na
-UO
-Er
-"}
-(13,1,1) = {"
-vw
-WE
-kZ
-WE
-QT
-bp
-Oz
-vf
-lK
-ym
-cs
-eX
-CI
-DG
-EO
-EO
-EO
-EO
-EO
-EO
-vp
-CW
-lW
-lt
-vz
-sh
-Nr
-"}
-(14,1,1) = {"
-Nr
-Nr
-Nr
-WE
-WE
-YL
-YL
-qO
-xc
-tH
-IT
-HK
-zc
-EO
-EO
-BX
-if
-EO
-Kg
-Uw
-vp
-YZ
-Yd
-lt
-vz
-sh
-UE
-"}
-(15,1,1) = {"
-Nr
-Nr
-YI
-YI
-YI
-qf
-HZ
-Lr
-Dw
-rq
-YI
-EO
-EO
-EO
-nz
-Vi
-sI
-Ai
-FV
-Wh
-eL
-iZ
-bt
-CT
-vp
-pt
-Nr
-"}
-(16,1,1) = {"
-Nr
-Nr
-ow
-YI
-yd
-UI
-UI
-Fq
-UI
-Tj
-YI
-Ji
-NQ
-BM
-zW
-bN
-aK
-Pb
-Xw
-eF
-vp
-uK
-wT
-VR
-pt
-Nr
-Nr
-"}
-(17,1,1) = {"
-Nr
-Nr
-Bt
-YI
-wN
-UI
-rG
-Mg
-Dq
-CV
-Da
-cb
-aD
-Id
-rm
-xw
-KH
-EO
-mi
-EO
-VR
-EW
-Kk
-VR
-Nr
-Nr
-Nr
-"}
-(18,1,1) = {"
-Nr
-Nr
-Nr
-Bt
-YI
-uB
-kE
-sF
-UI
-KZ
-YI
-Rp
-DW
-Oq
-Lu
-EO
-mi
-Hx
-Nr
-Hx
-VR
-sk
-VR
-pt
-Nr
-Nr
-Nr
-"}
-(19,1,1) = {"
-Nr
-Nr
-Nr
-Nr
-Bt
-Op
-YI
-fn
-LV
-DA
-YI
-tF
-EO
-mi
-mi
-Hx
-Nr
-Nr
-Nr
-Nr
-pt
-VR
-pt
-Nr
-Nr
-Nr
-Nr
-"}
-(20,1,1) = {"
-Nr
-Nr
-Nr
-Nr
-Nr
-Nr
-YI
-YI
-Op
-YI
-YI
-EO
-EO
-Nr
-Nr
-Nr
-Nr
-Nr
-Nr
-Nr
-Nr
-Nr
-Nr
-Nr
-Nr
-Nr
-Nr
-"}

From cc2405948d782bb508b8f8b3d3e0724b855ba7c4 Mon Sep 17 00:00:00 2001
From: fallcon <falloutfalconplays@gmail.com>
Date: Thu, 18 Apr 2024 13:38:15 -0500
Subject: [PATCH 79/89] yea

---
 code/modules/projectiles/guns/ballistic/smg.dm | 5 -----
 1 file changed, 5 deletions(-)

diff --git a/code/modules/projectiles/guns/ballistic/smg.dm b/code/modules/projectiles/guns/ballistic/smg.dm
index 5d9aa00788f6..23ec4247a5da 100644
--- a/code/modules/projectiles/guns/ballistic/smg.dm
+++ b/code/modules/projectiles/guns/ballistic/smg.dm
@@ -167,11 +167,6 @@
 	underbarrel = new /obj/item/gun/ballistic/revolver/grenadelauncher(src)
 	update_appearance()
 
-/obj/item/gun/ballistic/automatic/smg/m90/Initialize()
-	. = ..()
-	underbarrel = new /obj/item/gun/ballistic/revolver/grenadelauncher(src)
-	update_appearance()
-
 /obj/item/gun/ballistic/automatic/smg/m90/afterattack(atom/target, mob/living/user, flag, params)
 	if(select == 2)
 		underbarrel.afterattack(target, user, flag, params)

From 243c78f6c9414569dffb2c3506058d3d8a2a8f71 Mon Sep 17 00:00:00 2001
From: fallcon <falloutfalconplays@gmail.com>
Date: Wed, 24 Apr 2024 09:10:35 -0500
Subject: [PATCH 80/89] retrigger checks


From 9ba236141f774eea0aa0f0d0ba3fe4a2971fcb45 Mon Sep 17 00:00:00 2001
From: FalloutFalcon <falloutfalconplays@gmail.com>
Date: Fri, 31 May 2024 08:16:36 -0500
Subject: [PATCH 81/89] readds tentacle

---
 .../hostile/megafauna/codename_claw.dm        | 115 +++++++++++++++++-
 1 file changed, 113 insertions(+), 2 deletions(-)

diff --git a/code/modules/mob/living/simple_animal/hostile/megafauna/codename_claw.dm b/code/modules/mob/living/simple_animal/hostile/megafauna/codename_claw.dm
index 59ab203d4a85..a00e2c1be3f3 100644
--- a/code/modules/mob/living/simple_animal/hostile/megafauna/codename_claw.dm
+++ b/code/modules/mob/living/simple_animal/hostile/megafauna/codename_claw.dm
@@ -146,7 +146,7 @@
 			if(3) //only should fire duing phase 2
 				emp_pulse()
 			if(4)
-				sting_attack(target)
+				tentacle(target)
 			if(5)
 				summon_creatures()
 			if(6)
@@ -161,7 +161,10 @@
 			swift_dash(target, dash_num_long, 15)
 	else
 		if((get_dist(src, target) >= 4) && ((get_dist(src, target)) <= 8) && !shouldnt_move)
-			if(prob(40))
+			if(prob(60))
+				tentacle(target)
+				return
+			else if(prob(40))
 				sting_attack(target)
 				return
 			else
@@ -227,6 +230,15 @@
 	empulse(src, 2, 4)
 	shouldnt_move = FALSE
 
+/////TENTACLE
+/mob/living/simple_animal/hostile/megafauna/claw/proc/tentacle(target)
+	shake_animation(2)
+	projectiletype = /obj/projectile/tentacle
+	projectilesound = 'sound/effects/splat.ogg'
+	Shoot(target)
+
+/////TENTACLE END
+
 /////STING ATTACK
 /mob/living/simple_animal/hostile/megafauna/claw/proc/sting_attack(target)
 	shouldnt_move = TRUE
@@ -307,3 +319,102 @@
 	empulse(src, 5, 8)
 	new /obj/effect/gibspawner/human(get_turf(src))
 	qdel(src)
+
+/obj/projectile/tentacle
+	name = "tentacle"
+	icon_state = "tentacle_end"
+	pass_flags = PASSTABLE
+	damage = 0
+	damage_type = BRUTE
+	range = 8
+	hitsound = 'sound/weapons/thudswoosh.ogg'
+	var/chain
+
+/obj/projectile/tentacle/fire(setAngle)
+	if(firer)
+		chain = firer.Beam(src, icon_state = "tentacle", emissive = FALSE)
+	..()
+
+/obj/projectile/tentacle/proc/reset_throw(mob/living/carbon/human/H)
+	if(H.throw_mode)
+		H.throw_mode_off() //Don't annoy the changeling if he doesn't catch the item
+
+/obj/projectile/tentacle/proc/tentacle_grab(mob/living/carbon/human/H, mob/living/carbon/C)
+	if(H.Adjacent(C))
+		if(H.get_active_held_item() && !H.get_inactive_held_item())
+			H.swap_hand()
+		if(H.get_active_held_item())
+			return
+		C.grabbedby(H)
+		C.grippedby(H, instant = TRUE) //instant aggro grab
+
+/obj/projectile/tentacle/proc/tentacle_stab(mob/living/carbon/human/H, mob/living/carbon/C)
+	if(H.Adjacent(C))
+		for(var/obj/item/I in H.held_items)
+			if(I.get_sharpness())
+				C.visible_message("<span class='danger'>[H] impales [C] with [H.p_their()] [I.name]!</span>", "<span class='userdanger'>[H] impales you with [H.p_their()] [I.name]!</span>")
+				C.apply_damage(I.force, BRUTE, BODY_ZONE_CHEST)
+				H.do_item_attack_animation(C, used_item = I)
+				H.add_mob_blood(C)
+				playsound(get_turf(H),I.hitsound,75,TRUE)
+				return
+
+/obj/projectile/tentacle/on_hit(atom/target, blocked = FALSE)
+	var/mob/living/carbon/human/H = firer
+	if(blocked >= 100)
+		return BULLET_ACT_BLOCK
+	if(isitem(target))
+		var/obj/item/I = target
+		if(!I.anchored)
+			to_chat(firer, "<span class='notice'>You pull [I] towards yourself.</span>")
+			H.throw_mode_on()
+			I.throw_at(H, 10, 2)
+			. = BULLET_ACT_HIT
+
+	else if(isliving(target))
+		var/mob/living/L = target
+		if(!L.anchored && !L.throwing)//avoid double hits
+			if(iscarbon(L))
+				var/mob/living/carbon/C = L
+				var/firer_intent = INTENT_HARM
+				var/mob/M = firer
+				if(istype(M))
+					firer_intent = M.a_intent
+				switch(firer_intent)
+					if(INTENT_HELP)
+						C.visible_message("<span class='danger'>[L] is pulled by [H]'s tentacle!</span>","<span class='userdanger'>A tentacle grabs you and pulls you towards [H]!</span>")
+						C.throw_at(get_step_towards(H,C), 8, 2)
+						return BULLET_ACT_HIT
+
+					if(INTENT_DISARM)
+						var/obj/item/I = C.get_active_held_item()
+						if(I)
+							if(C.dropItemToGround(I))
+								C.visible_message("<span class='danger'>[I] is yanked off [C]'s hand by [src]!</span>","<span class='userdanger'>A tentacle pulls [I] away from you!</span>")
+								on_hit(I) //grab the item as if you had hit it directly with the tentacle
+								return BULLET_ACT_HIT
+							else
+								to_chat(firer, "<span class='warning'>You can't seem to pry [I] off [C]'s hands!</span>")
+								return BULLET_ACT_BLOCK
+						else
+							to_chat(firer, "<span class='danger'>[C] has nothing in hand to disarm!</span>")
+							return BULLET_ACT_HIT
+
+					if(INTENT_GRAB)
+						C.visible_message("<span class='danger'>[L] is grabbed by [H]'s tentacle!</span>","<span class='userdanger'>A tentacle grabs you and pulls you towards [H]!</span>")
+						C.throw_at(get_step_towards(H,C), 8, 2, H, TRUE, TRUE, callback=CALLBACK(src, PROC_REF(tentacle_grab), H, C))
+						return BULLET_ACT_HIT
+
+					if(INTENT_HARM)
+						C.visible_message("<span class='danger'>[L] is thrown towards [H] by a tentacle!</span>","<span class='userdanger'>A tentacle grabs you and throws you towards [H]!</span>")
+						C.throw_at(get_step_towards(H,C), 8, 2, H, TRUE, TRUE, callback=CALLBACK(src, PROC_REF(tentacle_stab), H, C))
+						return BULLET_ACT_HIT
+			else
+				L.visible_message("<span class='danger'>[L] is pulled by [H]'s tentacle!</span>","<span class='userdanger'>A tentacle grabs you and pulls you towards [H]!</span>")
+				L.throw_at(get_step_towards(H,L), 8, 2)
+				. = BULLET_ACT_HIT
+
+/obj/projectile/tentacle/Destroy()
+	qdel(chain)
+	return ..()
+

From 86d3ab7abae15356fcc0529457e6d1c7a8a61560 Mon Sep 17 00:00:00 2001
From: FalloutFalcon <falloutfalconplays@gmail.com>
Date: Fri, 31 May 2024 08:31:29 -0500
Subject: [PATCH 82/89] hm

---
 code/modules/projectiles/guns/ballistic/pistol.dm | 2 ++
 1 file changed, 2 insertions(+)

diff --git a/code/modules/projectiles/guns/ballistic/pistol.dm b/code/modules/projectiles/guns/ballistic/pistol.dm
index 63e0d014c6bf..cc3d56cad686 100644
--- a/code/modules/projectiles/guns/ballistic/pistol.dm
+++ b/code/modules/projectiles/guns/ballistic/pistol.dm
@@ -85,6 +85,8 @@
 	icon_state = "phenex"
 	item_state = "hp_phenex"
 
+
+
 /obj/item/gun/ballistic/automatic/pistol/deagle
 	name = "\improper Desert Eagle"
 	desc = "An oversized handgun chambered in .50 AE. A true hand cannon."

From 32026542f1d60a27afd18b435935a0ea710f9812 Mon Sep 17 00:00:00 2001
From: FalloutFalcon <falloutfalconplays@gmail.com>
Date: Fri, 31 May 2024 08:31:35 -0500
Subject: [PATCH 83/89] fix?

---
 code/modules/projectiles/guns/ballistic/pistol.dm | 2 --
 1 file changed, 2 deletions(-)

diff --git a/code/modules/projectiles/guns/ballistic/pistol.dm b/code/modules/projectiles/guns/ballistic/pistol.dm
index cc3d56cad686..63e0d014c6bf 100644
--- a/code/modules/projectiles/guns/ballistic/pistol.dm
+++ b/code/modules/projectiles/guns/ballistic/pistol.dm
@@ -85,8 +85,6 @@
 	icon_state = "phenex"
 	item_state = "hp_phenex"
 
-
-
 /obj/item/gun/ballistic/automatic/pistol/deagle
 	name = "\improper Desert Eagle"
 	desc = "An oversized handgun chambered in .50 AE. A true hand cannon."

From 212a24b17393c5b22d43322e82520ba9aa69f49c Mon Sep 17 00:00:00 2001
From: FalloutFalcon <falloutfalconplays@gmail.com>
Date: Fri, 31 May 2024 08:32:26 -0500
Subject: [PATCH 84/89] there is NOT whitespace there

---
 code/modules/projectiles/guns/ballistic/pistol.dm | 1 -
 1 file changed, 1 deletion(-)

diff --git a/code/modules/projectiles/guns/ballistic/pistol.dm b/code/modules/projectiles/guns/ballistic/pistol.dm
index 63e0d014c6bf..e77c384ca464 100644
--- a/code/modules/projectiles/guns/ballistic/pistol.dm
+++ b/code/modules/projectiles/guns/ballistic/pistol.dm
@@ -84,7 +84,6 @@
 	desc = "A uniquely modified version of the Candor, famously created by Hunter's Pride. Named after the daemonic Phoenix of legend that the Ashen Huntsman had once slain, this hell-kissed weapon is more visually intimidating than its original counterpart, but mechanically acts the same. Chambered in .45."
 	icon_state = "phenex"
 	item_state = "hp_phenex"
-
 /obj/item/gun/ballistic/automatic/pistol/deagle
 	name = "\improper Desert Eagle"
 	desc = "An oversized handgun chambered in .50 AE. A true hand cannon."

From e84dc4e8a260cdf8651d9a25f48d275ade68bd7a Mon Sep 17 00:00:00 2001
From: FalloutFalcon <falloutfalconplays@gmail.com>
Date: Fri, 31 May 2024 08:33:12 -0500
Subject: [PATCH 85/89] oh im dumb wrong pr.

---
 code/modules/projectiles/guns/ballistic/pistol.dm | 1 +
 1 file changed, 1 insertion(+)

diff --git a/code/modules/projectiles/guns/ballistic/pistol.dm b/code/modules/projectiles/guns/ballistic/pistol.dm
index e77c384ca464..63e0d014c6bf 100644
--- a/code/modules/projectiles/guns/ballistic/pistol.dm
+++ b/code/modules/projectiles/guns/ballistic/pistol.dm
@@ -84,6 +84,7 @@
 	desc = "A uniquely modified version of the Candor, famously created by Hunter's Pride. Named after the daemonic Phoenix of legend that the Ashen Huntsman had once slain, this hell-kissed weapon is more visually intimidating than its original counterpart, but mechanically acts the same. Chambered in .45."
 	icon_state = "phenex"
 	item_state = "hp_phenex"
+
 /obj/item/gun/ballistic/automatic/pistol/deagle
 	name = "\improper Desert Eagle"
 	desc = "An oversized handgun chambered in .50 AE. A true hand cannon."

From 2b91a5241ea6a2550f8f80aae58c577848bb226e Mon Sep 17 00:00:00 2001
From: FalloutFalcon <falloutfalconplays@gmail.com>
Date: Thu, 6 Jun 2024 21:34:35 -0500
Subject: [PATCH 86/89] stuff

---
 code/__DEFINES/gun.dm | 23 +++++++++++++++++++++--
 1 file changed, 21 insertions(+), 2 deletions(-)

diff --git a/code/__DEFINES/gun.dm b/code/__DEFINES/gun.dm
index c5936e6f2d0e..e281a9252019 100644
--- a/code/__DEFINES/gun.dm
+++ b/code/__DEFINES/gun.dm
@@ -5,13 +5,14 @@
 #define WEAPON_MEDIUM 2
 /// You must wield the gun to fire this gun
 #define WEAPON_HEAVY 3
+/// You must FULLY wield (wait the full wield delay) the gun to fire this gun
+#define WEAPON_VERY_HEAVY 4
 //Gun trigger guards
 #define TRIGGER_GUARD_ALLOW_ALL -1
 #define TRIGGER_GUARD_NONE 0
 #define TRIGGER_GUARD_NORMAL 1
 //Gun bolt types
-///Gun has a bolt, it stays closed while not cycling. The gun must be racked to have a bullet chambered when a mag is inserted.
-/// Example: c20, shotguns, m90
+///The gun has a closed bolt, when resting it's closed, and must be racked to get a bullet from a magazine. see: Every Fucking Videogame Gun Ever
 #define BOLT_TYPE_STANDARD 1
 ///Gun has a bolt, it is open when ready to fire. The gun can never have a chambered bullet with no magazine, but the bolt stays ready when a mag is removed.
 /// Example: Some SMGs, the L6
@@ -28,6 +29,18 @@
 ///added recoil of sawn off guns
 #define SAWN_OFF_RECOIL 1
 
+//ammo box sprite defines
+///ammo box will always use provided icon state
+#define AMMO_BOX_ONE_SPRITE 0
+///ammo box will have a different state for each bullet; <icon_state>-<bullets left>
+#define AMMO_BOX_PER_BULLET 1
+///ammo box will have a different state for full and empty; <icon_state>-max_ammo and <icon_state>-0
+#define AMMO_BOX_FULL_EMPTY 2
+
+#define SUPPRESSED_NONE 0
+#define SUPPRESSED_QUIET 1 ///standard suppressed
+#define SUPPRESSED_VERY 2 /// no message
+
 //Autofire component
 /// Compatible firemode is in the gun. Wait until it's held in the user hands.
 #define AUTOFIRE_STAT_IDLE (1<<0)
@@ -93,3 +106,9 @@
 
 #define MOVES_HITSCAN -1		//Not actually hitscan but close as we get without actual hitscan.
 #define MUZZLE_EFFECT_PIXEL_INCREMENT 17	//How many pixels to move the muzzle flash up so your character doesn't look like they're shitting out lasers.
+
+#define FIREMODE_SEMIAUTO "single"
+#define FIREMODE_BURST "burst"
+#define FIREMODE_FULLAUTO "auto"
+#define FIREMODE_OTHER "other"
+#define FIREMODE_OTHER_TWO "other2"

From f7bfd3074ddc335a7d97a40b44e916ef502733d7 Mon Sep 17 00:00:00 2001
From: FalloutFalcon <falloutfalconplays@gmail.com>
Date: Thu, 6 Jun 2024 21:38:23 -0500
Subject: [PATCH 87/89] renamed

---
 code/__DEFINES/{gun.dm => guns.dm} | 0
 1 file changed, 0 insertions(+), 0 deletions(-)
 rename code/__DEFINES/{gun.dm => guns.dm} (100%)

diff --git a/code/__DEFINES/gun.dm b/code/__DEFINES/guns.dm
similarity index 100%
rename from code/__DEFINES/gun.dm
rename to code/__DEFINES/guns.dm

From f2dff8ea3cf937d9d7f6914ad4b811cadc6aa1fb Mon Sep 17 00:00:00 2001
From: FalloutFalcon <falloutfalconplays@gmail.com>
Date: Thu, 6 Jun 2024 21:45:46 -0500
Subject: [PATCH 88/89] yea

---
 shiptest.dme | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/shiptest.dme b/shiptest.dme
index 1dac66fb7b14..630c5d479767 100644
--- a/shiptest.dme
+++ b/shiptest.dme
@@ -66,7 +66,7 @@
 #include "code\__DEFINES\food.dm"
 #include "code\__DEFINES\footsteps.dm"
 #include "code\__DEFINES\forensics.dm"
-#include "code\__DEFINES\gun.dm"
+#include "code\__DEFINES\guns.dm"
 #include "code\__DEFINES\hud.dm"
 #include "code\__DEFINES\icon_smoothing.dm"
 #include "code\__DEFINES\important_recursive_contents.dm"

From e70591dda57784ea34a9917f542ab4e4f6bf7714 Mon Sep 17 00:00:00 2001
From: FalloutFalcon <falloutfalconplays@gmail.com>
Date: Fri, 7 Jun 2024 00:45:44 -0500
Subject: [PATCH 89/89] oops double defined

---
 code/__DEFINES/guns.dm | 16 ----------------
 1 file changed, 16 deletions(-)

diff --git a/code/__DEFINES/guns.dm b/code/__DEFINES/guns.dm
index e281a9252019..dba7ce93afaf 100644
--- a/code/__DEFINES/guns.dm
+++ b/code/__DEFINES/guns.dm
@@ -54,10 +54,6 @@
 #define COMSIG_AUTOFIRE_SHOT "autofire_shot"
 	#define COMPONENT_AUTOFIRE_SHOT_SUCCESS (1<<0)
 
-#define SUPPRESSED_NONE 0
-#define SUPPRESSED_QUIET 1 ///standard suppressed
-#define SUPPRESSED_VERY 2 /// no message
-
 #define DUALWIELD_PENALTY_EXTRA_MULTIPLIER 1.6
 
 #define MANUFACTURER_NONE null
@@ -92,18 +88,6 @@
 #define REFLECT_NORMAL (1<<0)
 #define REFLECT_FAKEPROJECTILE (1<<1)
 
-//ammo box sprite defines
-///ammo box will always use provided icon state
-#define AMMO_BOX_ONE_SPRITE 0
-///ammo box will have a different state for each bullet; <icon_state>-<bullets left>
-#define AMMO_BOX_PER_BULLET 1
-///ammo box will have a different state for full and empty; <icon_state>-max_ammo and <icon_state>-0
-#define AMMO_BOX_FULL_EMPTY 2
-
-//Projectile Reflect
-#define REFLECT_NORMAL (1<<0)
-#define REFLECT_FAKEPROJECTILE (1<<1)
-
 #define MOVES_HITSCAN -1		//Not actually hitscan but close as we get without actual hitscan.
 #define MUZZLE_EFFECT_PIXEL_INCREMENT 17	//How many pixels to move the muzzle flash up so your character doesn't look like they're shitting out lasers.