diff --git a/_maps/RandomRuins/LavaRuins/lavaland_surface_ash_walker1.dmm b/_maps/RandomRuins/LavaRuins/lavaland_surface_ash_walker1.dmm
index f219cfcc992..a6c92c7610c 100644
--- a/_maps/RandomRuins/LavaRuins/lavaland_surface_ash_walker1.dmm
+++ b/_maps/RandomRuins/LavaRuins/lavaland_surface_ash_walker1.dmm
@@ -145,7 +145,7 @@
/area/ruin/unpowered)
"u" = (
/obj/structure/closet/crate/engineering,
-/obj/item/weapon/rcd/loaded,
+/obj/item/weapon/construction/rcd/loaded,
/turf/open/floor/engine/cult{
baseturf = /turf/open/floor/plating/lava/smooth
},
diff --git a/_maps/map_files/debug/runtimestation.dmm b/_maps/map_files/debug/runtimestation.dmm
index b3facda8d26..2c90bf7f22f 100644
--- a/_maps/map_files/debug/runtimestation.dmm
+++ b/_maps/map_files/debug/runtimestation.dmm
@@ -1,3 +1,4 @@
+
"aa" = (/turf/open/space/basic,/area/space)
"ab" = (/obj/structure/lattice,/turf/open/space,/area/space)
"ac" = (/turf/open/space,/area/space/nearstation)
@@ -87,7 +88,7 @@
"bI" = (/obj/structure/table,/turf/open/floor/plasteel,/area/bridge)
"bJ" = (/obj/structure/table,/obj/item/weapon/card/id/captains_spare,/turf/open/floor/plasteel,/area/bridge)
"bK" = (/obj/structure/table,/obj/item/weapon/storage/backpack/holding,/turf/open/floor/plasteel,/area/bridge)
-"bL" = (/obj/structure/table,/obj/item/weapon/rcd_ammo/large,/obj/item/weapon/rcd_ammo/large,/obj/item/weapon/rcd_ammo/large,/obj/item/weapon/rcd,/turf/open/floor/plasteel,/area/bridge)
+"bL" = (/obj/structure/table,/obj/item/weapon/rcd_ammo/large,/obj/item/weapon/rcd_ammo/large,/obj/item/weapon/rcd_ammo/large,/obj/item/weapon/construction/rcd,/turf/open/floor/plasteel,/area/bridge)
"bM" = (/obj/structure/closet/secure_closet/hop,/turf/open/floor/plasteel/blue/side{dir = 4},/area/bridge)
"bN" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden,/turf/open/floor/plasteel,/area/hallway/primary/central)
"bO" = (/obj/structure/cable{d1 = 1;d2 = 2;icon_state = "1-2"},/turf/open/floor/plasteel,/area/hallway/primary/central)
@@ -200,56 +201,2810 @@
"dR" = (/obj/structure/table,/obj/item/device/flashlight{pixel_y = 5},/turf/open/floor/plasteel,/area/storage/primary)
(1,1,1) = {"
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaabacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacabaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaabacadadadadadadadadadaeaeaeaeaeaeaeadadadadadadadadadadadadadadadadacabaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaabacadafafafafafafafadagagagagacacacadafafafafafafafafafafafafafafadacabaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaabacadafahahahahahahahagaiaiagacacacajajajajakakakakakakakakakakafadacabaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaabacadafahalamamamamahaganaoagagajajajapaqarakasatauavavavavavakafadacabaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaabacadafahawaxayayazahagaiaAaBaBaCaDaCaDaEaFakaGaHaIavaJaKaLavakafadacabaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaabacadafahaMawaNaOaPahagaQaRagagajajajaSaTaDaUaVaWaXavaKavaKaYakafadacabaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaabacadafahaZbabbbcaPahagaiaiagacacacajbdbebfakbgbhaIavaLbiaJavakafadacabaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaabacadafahbjbkblbmbnahagagagagacacacajbobebpakbqbraIavavavavavakafadacabaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaabacadafahbsbtahahahbububvbvbvbvbvbububwbxajakakakakbybybybybybyafadacabaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaabacadbzbAbBbCbDbEbFbubGbHbIbJbKbLbMbubNbObPbQbRbSbTbybUbVbWbXbyafadacabaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaabacbYafbZcacbcccccccdcecfcfcfcfcfcgchcicjccccccccccckclcmcmcmcnafadacabaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaabacbYafbZbObNbEbEcobucpcqcqcqcqcqcrcsctbEbEbEbEbEcobycucmcmcmbybybyacabaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaabacbYafbZbObNbEbEbEbucvbvbucwbubvbucsbNbEbEbEbEbEbEcxcucmcmcycnczcnacabaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaabacbYafbZbObCcAcAcAcBcCcDcDcDcDcDcDcEcFcAcAcAcAcAcAcGcHcmcmcmbybybyacabaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaabacbYafbZbObNbEbEbEbEbEbEbEbEbEbEbEbObNbEbEbEbEbEbEbycIcmcmcmcnafadacabaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaabacadbzbAbObNbEbEbEbEbEbEbEbEbEbEbEbObNbEbEbEbEbEbEbycJcKcLcMbyafadacabaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaabacadafcNcOcPcQcQcNcRcRcRcNcQcQcNcScTcUcScScScVcVcVbybybybybybyafadacabaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaabacadafcNcWcXcYcYcYcYcYcYcYcYcYcZcSdadbdcdddedfdgdhdidjdkdldlcSafadacabaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaabacadafcNdmdndndndndndndndndndndocSdpdldcdqdrdsdtdudvdwdkdldxcSafadacabaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaabacadafcNdydndndndndndndndndndndzcSdldldAdBdBdBdBdBdBdBdCdldlcSafadacabaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaabacadafcNdydndndndndndndndndndndzcSdldldldldldldldldldldldldlcSafadacabaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaabacadafcNdydndndndndndndndndndndzcSdldldDdEdEdEdEdEdEdEdFdldlcSafadacabaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaabacadafcNdydndndndndndndndndndndzdGdldldcdHdHdHdHdHdHdHdkdldlcSafadacabaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaabacadafcNdydndndndndndndndndndndzdGdldldcdIdIdIdIdIdIdIdkdldlcSafadacabaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaabacadafcNdydndndndndndndndndndndzcSdldldAdBdBdBdBdBdBdBdCdldlcSafadacabaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaabacadafcNdydndndndndndndndndndndzcSdldldldldldldldldldldldldlcSafadacabaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaabacadafcNdydndndndndndndndndndndzcSdldldDdEdEdEdEdEdEdEdFdldlcSafadacabaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaabacadafcNdmdndndndndndndndndndndocSdpdldcdJdJdJdJdJdJdJdkdldxcSafadacabaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaabacadafcNdKdLdLdLdLdLdLdLdLdLdLdMcSdldldcdNdOdNdNdPdQdRdkdldlcSafadacabaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaabacadafcNcNcNcNcNcNcNcNcNcNcNcNcNcScScScScScScScScScScScScScScSafadacabaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaabacadafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafadacabaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaabacadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadacabaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaabacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacabaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+"}
+(2,1,1) = {"
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+"}
+(3,1,1) = {"
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+"}
+(4,1,1) = {"
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+"}
+(5,1,1) = {"
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+"}
+(6,1,1) = {"
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+"}
+(7,1,1) = {"
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+"}
+(8,1,1) = {"
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+"}
+(9,1,1) = {"
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+"}
+(10,1,1) = {"
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+ab
+ac
+ac
+ac
+ac
+ac
+ac
+ac
+ac
+ac
+ac
+ac
+ac
+ac
+ac
+ac
+ac
+ac
+ac
+ac
+ac
+ac
+ac
+ac
+ac
+ac
+ac
+ac
+ac
+ac
+ac
+ac
+ac
+ac
+ac
+ab
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+"}
+(11,1,1) = {"
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+ab
+ac
+ad
+ad
+ad
+ad
+ad
+ad
+ad
+ad
+ad
+ad
+bY
+bY
+bY
+bY
+bY
+ad
+ad
+ad
+ad
+ad
+ad
+ad
+ad
+ad
+ad
+ad
+ad
+ad
+ad
+ad
+ad
+ad
+ac
+ab
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+"}
+(12,1,1) = {"
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+ab
+ac
+ad
+af
+af
+af
+af
+af
+af
+af
+af
+bz
+af
+af
+af
+af
+af
+bz
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+ad
+ac
+ab
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+"}
+(13,1,1) = {"
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+ab
+ac
+ad
+af
+ah
+ah
+ah
+ah
+ah
+ah
+ah
+bA
+bZ
+bZ
+bZ
+bZ
+bZ
+bA
+cN
+cN
+cN
+cN
+cN
+cN
+cN
+cN
+cN
+cN
+cN
+cN
+cN
+cN
+af
+ad
+ac
+ab
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+"}
+(14,1,1) = {"
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+ab
+ac
+ad
+af
+ah
+al
+aw
+aM
+aZ
+bj
+bs
+bB
+ca
+bO
+bO
+bO
+bO
+bO
+cO
+cW
+dm
+dy
+dy
+dy
+dy
+dy
+dy
+dy
+dy
+dm
+dK
+cN
+af
+ad
+ac
+ab
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+"}
+(15,1,1) = {"
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+ab
+ac
+ad
+af
+ah
+am
+ax
+aw
+ba
+bk
+bt
+bC
+cb
+bN
+bN
+bC
+bN
+bN
+cP
+cX
+dn
+dn
+dn
+dn
+dn
+dn
+dn
+dn
+dn
+dn
+dL
+cN
+af
+ad
+ac
+ab
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+"}
+(16,1,1) = {"
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+ab
+ac
+ad
+af
+ah
+am
+ay
+aN
+bb
+bl
+ah
+bD
+cc
+bE
+bE
+cA
+bE
+bE
+cQ
+cY
+dn
+dn
+dn
+dn
+dn
+dn
+dn
+dn
+dn
+dn
+dL
+cN
+af
+ad
+ac
+ab
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+"}
+(17,1,1) = {"
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+ab
+ac
+ad
+af
+ah
+am
+ay
+aO
+bc
+bm
+ah
+bE
+cc
+bE
+bE
+cA
+bE
+bE
+cQ
+cY
+dn
+dn
+dn
+dn
+dn
+dn
+dn
+dn
+dn
+dn
+dL
+cN
+af
+ad
+ac
+ab
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+"}
+(18,1,1) = {"
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+ab
+ac
+ad
+af
+ah
+am
+az
+aP
+aP
+bn
+ah
+bF
+cc
+co
+bE
+cA
+bE
+bE
+cN
+cY
+dn
+dn
+dn
+dn
+dn
+dn
+dn
+dn
+dn
+dn
+dL
+cN
+af
+ad
+ac
+ab
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+"}
+(19,1,1) = {"
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+ab
+ac
+ad
+ad
+ah
+ah
+ah
+ah
+ah
+ah
+bu
+bu
+cd
+bu
+bu
+cB
+bE
+bE
+cR
+cY
+dn
+dn
+dn
+dn
+dn
+dn
+dn
+dn
+dn
+dn
+dL
+cN
+af
+ad
+ac
+ab
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+"}
+(20,1,1) = {"
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+ab
+ac
+ae
+ag
+ag
+ag
+ag
+ag
+ag
+ag
+bu
+bG
+ce
+cp
+cv
+cC
+bE
+bE
+cR
+cY
+dn
+dn
+dn
+dn
+dn
+dn
+dn
+dn
+dn
+dn
+dL
+cN
+af
+ad
+ac
+ab
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+"}
+(21,1,1) = {"
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+ab
+ac
+ae
+ag
+ai
+an
+ai
+aQ
+ai
+ag
+bv
+bH
+cf
+cq
+bv
+cD
+bE
+bE
+cR
+cY
+dn
+dn
+dn
+dn
+dn
+dn
+dn
+dn
+dn
+dn
+dL
+cN
+af
+ad
+ac
+ab
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+"}
+(22,1,1) = {"
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+ab
+ac
+ae
+ag
+ai
+ao
+aA
+aR
+ai
+ag
+bv
+bI
+cf
+cq
+bu
+cD
+bE
+bE
+cN
+cY
+dn
+dn
+dn
+dn
+dn
+dn
+dn
+dn
+dn
+dn
+dL
+cN
+af
+ad
+ac
+ab
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+"}
+(23,1,1) = {"
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+ab
+ac
+ae
+ag
+ag
+ag
+aB
+ag
+ag
+ag
+bv
+bJ
+cf
+cq
+cw
+cD
+bE
+bE
+cQ
+cY
+dn
+dn
+dn
+dn
+dn
+dn
+dn
+dn
+dn
+dn
+dL
+cN
+af
+ad
+ac
+ab
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+"}
+(24,1,1) = {"
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+ab
+ac
+ae
+ac
+ac
+ag
+aB
+ag
+ac
+ac
+bv
+bK
+cf
+cq
+bu
+cD
+bE
+bE
+cQ
+cY
+dn
+dn
+dn
+dn
+dn
+dn
+dn
+dn
+dn
+dn
+dL
+cN
+af
+ad
+ac
+ab
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+"}
+(25,1,1) = {"
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+ab
+ac
+ae
+ac
+ac
+aj
+aC
+aj
+ac
+ac
+bv
+bL
+cf
+cq
+bv
+cD
+bE
+bE
+cN
+cZ
+do
+dz
+dz
+dz
+dz
+dz
+dz
+dz
+dz
+do
+dM
+cN
+af
+ad
+ac
+ab
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+"}
+(26,1,1) = {"
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+ab
+ac
+ae
+ac
+ac
+aj
+aD
+aj
+ac
+ac
+bu
+bM
+cg
+cr
+bu
+cD
+bE
+bE
+cS
+cS
+cS
+cS
+cS
+cS
+dG
+dG
+cS
+cS
+cS
+cS
+cS
+cS
+af
+ad
+ac
+ab
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+"}
+(27,1,1) = {"
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+ab
+ac
+ad
+ad
+aj
+aj
+aC
+aj
+aj
+aj
+bu
+bu
+ch
+cs
+cs
+cE
+bO
+bO
+cT
+da
+dp
+dl
+dl
+dl
+dl
+dl
+dl
+dl
+dl
+dp
+dl
+cS
+af
+ad
+ac
+ab
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+"}
+(28,1,1) = {"
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+ab
+ac
+ad
+af
+aj
+ap
+aD
+aS
+bd
+bo
+bw
+bN
+ci
+ct
+bN
+cF
+bN
+bN
+cU
+db
+dl
+dl
+dl
+dl
+dl
+dl
+dl
+dl
+dl
+dl
+dl
+cS
+af
+ad
+ac
+ab
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+"}
+(29,1,1) = {"
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+ab
+ac
+ad
+af
+aj
+aq
+aE
+aT
+be
+be
+bx
+bO
+cj
+bE
+bE
+cA
+bE
+bE
+cS
+dc
+dc
+dA
+dl
+dD
+dc
+dc
+dA
+dl
+dD
+dc
+dc
+cS
+af
+ad
+ac
+ab
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+"}
+(30,1,1) = {"
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+ab
+ac
+ad
+af
+aj
+ar
+aF
+aD
+bf
+bp
+aj
+bP
+cc
+bE
+bE
+cA
+bE
+bE
+cS
+dd
+dq
+dB
+dl
+dE
+dH
+dI
+dB
+dl
+dE
+dJ
+dN
+cS
+af
+ad
+ac
+ab
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+"}
+(31,1,1) = {"
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+ab
+ac
+ad
+af
+ak
+ak
+ak
+aU
+ak
+ak
+ak
+bQ
+cc
+bE
+bE
+cA
+bE
+bE
+cS
+de
+dr
+dB
+dl
+dE
+dH
+dI
+dB
+dl
+dE
+dJ
+dO
+cS
+af
+ad
+ac
+ab
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+"}
+(32,1,1) = {"
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+ab
+ac
+ad
+af
+ak
+as
+aG
+aV
+bg
+bq
+ak
+bR
+cc
+bE
+bE
+cA
+bE
+bE
+cV
+df
+ds
+dB
+dl
+dE
+dH
+dI
+dB
+dl
+dE
+dJ
+dN
+cS
+af
+ad
+ac
+ab
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+"}
+(33,1,1) = {"
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+ab
+ac
+ad
+af
+ak
+at
+aH
+aW
+bh
+br
+ak
+bS
+cc
+bE
+bE
+cA
+bE
+bE
+cV
+dg
+dt
+dB
+dl
+dE
+dH
+dI
+dB
+dl
+dE
+dJ
+dN
+cS
+af
+ad
+ac
+ab
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+"}
+(34,1,1) = {"
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+ab
+ac
+ad
+af
+ak
+au
+aI
+aX
+aI
+aI
+ak
+bT
+cc
+co
+bE
+cA
+bE
+bE
+cV
+dh
+du
+dB
+dl
+dE
+dH
+dI
+dB
+dl
+dE
+dJ
+dP
+cS
+af
+ad
+ac
+ab
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+"}
+(35,1,1) = {"
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+ab
+ac
+ad
+af
+ak
+av
+av
+av
+av
+av
+by
+by
+ck
+by
+cx
+cG
+by
+by
+by
+di
+dv
+dB
+dl
+dE
+dH
+dI
+dB
+dl
+dE
+dJ
+dQ
+cS
+af
+ad
+ac
+ab
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+"}
+(36,1,1) = {"
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+ab
+ac
+ad
+af
+ak
+av
+aJ
+aK
+aL
+av
+by
+bU
+cl
+cu
+cu
+cH
+cI
+cJ
+by
+dj
+dw
+dB
+dl
+dE
+dH
+dI
+dB
+dl
+dE
+dJ
+dR
+cS
+af
+ad
+ac
+ab
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+"}
+(37,1,1) = {"
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+ab
+ac
+ad
+af
+ak
+av
+aK
+av
+bi
+av
+by
+bV
+cm
+cm
+cm
+cm
+cm
+cK
+by
+dk
+dk
+dC
+dl
+dF
+dk
+dk
+dC
+dl
+dF
+dk
+dk
+cS
+af
+ad
+ac
+ab
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+"}
+(38,1,1) = {"
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+ab
+ac
+ad
+af
+ak
+av
+aL
+aK
+aJ
+av
+by
+bW
+cm
+cm
+cm
+cm
+cm
+cL
+by
+dl
+dl
+dl
+dl
+dl
+dl
+dl
+dl
+dl
+dl
+dl
+dl
+cS
+af
+ad
+ac
+ab
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+"}
+(39,1,1) = {"
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+ab
+ac
+ad
+af
+ak
+av
+av
+aY
+av
+av
+by
+bX
+cm
+cm
+cy
+cm
+cm
+cM
+by
+dl
+dx
+dl
+dl
+dl
+dl
+dl
+dl
+dl
+dl
+dx
+dl
+cS
+af
+ad
+ac
+ab
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+"}
+(40,1,1) = {"
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+ab
+ac
+ad
+af
+ak
+ak
+ak
+ak
+ak
+ak
+by
+by
+cn
+by
+cn
+by
+cn
+by
+by
+cS
+cS
+cS
+cS
+cS
+cS
+cS
+cS
+cS
+cS
+cS
+cS
+cS
+af
+ad
+ac
+ab
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+"}
+(41,1,1) = {"
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+ab
+ac
+ad
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+by
+cz
+by
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+ad
+ac
+ab
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+"}
+(42,1,1) = {"
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+ab
+ac
+ad
+ad
+ad
+ad
+ad
+ad
+ad
+ad
+ad
+ad
+ad
+by
+cn
+by
+ad
+ad
+ad
+ad
+ad
+ad
+ad
+ad
+ad
+ad
+ad
+ad
+ad
+ad
+ad
+ad
+ad
+ad
+ac
+ab
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+"}
+(43,1,1) = {"
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+ab
+ac
+ac
+ac
+ac
+ac
+ac
+ac
+ac
+ac
+ac
+ac
+ac
+ac
+ac
+ac
+ac
+ac
+ac
+ac
+ac
+ac
+ac
+ac
+ac
+ac
+ac
+ac
+ac
+ac
+ac
+ac
+ac
+ac
+ac
+ab
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+"}
+(44,1,1) = {"
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+"}
+(45,1,1) = {"
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+"}
+(46,1,1) = {"
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+"}
+(47,1,1) = {"
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+"}
+(48,1,1) = {"
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+"}
+(49,1,1) = {"
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+"}
+(50,1,1) = {"
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+"}
+(51,1,1) = {"
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+"}
+(52,1,1) = {"
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
"}
diff --git a/code/datums/action.dm b/code/datums/action.dm
index 03b293b13dc..63de6b19e37 100644
--- a/code/datums/action.dm
+++ b/code/datums/action.dm
@@ -198,6 +198,9 @@
if(target == C.internal)
button.icon_state = "template_active"
+/datum/action/item_action/pick_color
+ name = "Choose A Color"
+
/datum/action/item_action/toggle_mister
name = "Toggle Mister"
diff --git a/code/game/atoms.dm b/code/game/atoms.dm
index 95b77d9d67a..c12d828fff7 100644
--- a/code/game/atoms.dm
+++ b/code/game/atoms.dm
@@ -445,10 +445,10 @@ GLOBAL_LIST_EMPTY(blood_splatter_icons)
/atom/proc/ratvar_act()
return
-/atom/proc/rcd_vals(mob/user, obj/item/weapon/rcd/the_rcd)
+/atom/proc/rcd_vals(mob/user, obj/item/weapon/construction/rcd/the_rcd)
return FALSE
-/atom/proc/rcd_act(mob/user, obj/item/weapon/rcd/the_rcd, passed_mode)
+/atom/proc/rcd_act(mob/user, obj/item/weapon/construction/rcd/the_rcd, passed_mode)
return FALSE
/atom/proc/storage_contents_dump_act(obj/item/weapon/storage/src_object, mob/user)
diff --git a/code/game/gamemodes/malfunction/Malf_Modules.dm b/code/game/gamemodes/malfunction/Malf_Modules.dm
index d581af11b94..4eea55dbca7 100644
--- a/code/game/gamemodes/malfunction/Malf_Modules.dm
+++ b/code/game/gamemodes/malfunction/Malf_Modules.dm
@@ -197,8 +197,8 @@
return
for(var/I in GLOB.rcd_list)
- if(!istype(I, /obj/item/weapon/rcd/borg)) //Ensures that cyborg RCDs are spared.
- var/obj/item/weapon/rcd/RCD = I
+ if(!istype(I, /obj/item/weapon/construction/rcd/borg)) //Ensures that cyborg RCDs are spared.
+ var/obj/item/weapon/construction/rcd/RCD = I
RCD.detonate_pulse()
to_chat(src, "RCD detonation pulse emitted.")
diff --git a/code/game/gamemodes/sandbox/h_sandbox.dm b/code/game/gamemodes/sandbox/h_sandbox.dm
index ae0486c399f..07a4e0af6c0 100644
--- a/code/game/gamemodes/sandbox/h_sandbox.dm
+++ b/code/game/gamemodes/sandbox/h_sandbox.dm
@@ -218,7 +218,7 @@ GLOBAL_VAR_INIT(hsboxspawn, TRUE)
if("hsbrcd")
if(!GLOB.hsboxspawn) return
- new/obj/item/weapon/rcd/combat(usr.loc)
+ new/obj/item/weapon/construction/rcd/combat(usr.loc)
//
// New sandbox airlock maker
diff --git a/code/game/machinery/doors/airlock.dm b/code/game/machinery/doors/airlock.dm
index 9a3af5b627f..147e07fe1da 100644
--- a/code/game/machinery/doors/airlock.dm
+++ b/code/game/machinery/doors/airlock.dm
@@ -1540,13 +1540,13 @@
ae.loc = src.loc
qdel(src)
-/obj/machinery/door/airlock/rcd_vals(mob/user, obj/item/weapon/rcd/the_rcd)
+/obj/machinery/door/airlock/rcd_vals(mob/user, obj/item/weapon/construction/rcd/the_rcd)
switch(the_rcd.mode)
if(RCD_DECONSTRUCT)
return list("mode" = RCD_DECONSTRUCT, "delay" = 50, "cost" = 32)
return FALSE
-/obj/machinery/door/airlock/rcd_act(mob/user, obj/item/weapon/rcd/the_rcd, passed_mode)
+/obj/machinery/door/airlock/rcd_act(mob/user, obj/item/weapon/construction/rcd/the_rcd, passed_mode)
switch(passed_mode)
if(RCD_DECONSTRUCT)
to_chat(user, "You deconstruct the airlock.")
diff --git a/code/game/machinery/vending.dm b/code/game/machinery/vending.dm
index 92984b4852b..a05a5af3755 100644
--- a/code/game/machinery/vending.dm
+++ b/code/game/machinery/vending.dm
@@ -1052,7 +1052,7 @@ IF YOU MODIFY THE PRODUCTS LIST OF A MACHINE, MAKE SURE TO UPDATE ITS RESUPPLY C
icon_state = "engivend"
icon_deny = "engivend-deny"
req_access_txt = "11" //Engineering Equipment access
- products = list(/obj/item/clothing/glasses/meson/engine = 2,/obj/item/device/multitool = 4,/obj/item/weapon/electronics/airlock = 10,/obj/item/weapon/electronics/apc = 10,/obj/item/weapon/electronics/airalarm = 10,/obj/item/weapon/stock_parts/cell/high = 10, /obj/item/weapon/rcd/loaded = 3, /obj/item/device/geiger_counter = 5)
+ products = list(/obj/item/clothing/glasses/meson/engine = 2,/obj/item/device/multitool = 4,/obj/item/weapon/electronics/airlock = 10,/obj/item/weapon/electronics/apc = 10,/obj/item/weapon/electronics/airalarm = 10,/obj/item/weapon/stock_parts/cell/high = 10, /obj/item/weapon/construction/rcd/loaded = 3, /obj/item/device/geiger_counter = 5)
contraband = list(/obj/item/weapon/stock_parts/cell/potato = 3)
premium = list(/obj/item/weapon/storage/belt/utility = 3)
armor = list(melee = 100, bullet = 100, laser = 100, energy = 100, bomb = 0, bio = 0, rad = 0, fire = 100, acid = 50)
diff --git a/code/game/objects/items/weapons/RCD.dm b/code/game/objects/items/weapons/RCD.dm
index dbb3149a385..f8e716ea694 100644
--- a/code/game/objects/items/weapons/RCD.dm
+++ b/code/game/objects/items/weapons/RCD.dm
@@ -1,14 +1,14 @@
-
+#define GLOW_MODE 3
+#define LIGHT_MODE 2
+#define REMOVE_MODE 1
/*
CONTAINS:
RCD
+ARCD
*/
-/obj/item/weapon/rcd
- name = "rapid-construction-device (RCD)"
- desc = "A device used to rapidly build and deconstruct walls and floors."
- icon = 'icons/obj/tools.dmi'
- icon_state = "rcd"
+
+obj/item/weapon/construction
opacity = 0
density = 0
anchored = 0
@@ -25,30 +25,114 @@ RCD
resistance_flags = FIRE_PROOF
var/datum/effect_system/spark_spread/spark_system
var/matter = 0
- var/max_matter = 160
- var/working = 0
+ var/max_matter = 100
+ var/sheetmultiplier = 4 //Controls the amount of matter added for each glass/metal sheet, triple for plasteel
+ var/plasteelmultiplier = 3 //Plasteel is worth 3 times more than glass or metal
+ var/no_ammo_message = "The \'Low Ammo\' light on the device blinks yellow."
+
+/obj/item/weapon/construction/Initialize()
+ ..()
+ desc = "A [src]. It currently holds [matter]/[max_matter] matter-units."
+ spark_system = new /datum/effect_system/spark_spread
+ spark_system.set_up(5, 0, src)
+ spark_system.attach(src)
+
+
+/obj/item/weapon/construction/Destroy()
+ QDEL_NULL(spark_system)
+ . = ..()
+
+/obj/item/weapon/construction/attackby(obj/item/weapon/W, mob/user, params)
+ if(iscyborg(user))
+ return
+ var/loaded = 0
+ if(istype(W, /obj/item/weapon/rcd_ammo))
+ var/obj/item/weapon/rcd_ammo/R = W
+ if((matter + R.ammoamt) > max_matter)
+ to_chat(user, "The [src] can't hold any more matter-units!")
+ return
+ qdel(W)
+ matter += R.ammoamt
+ playsound(src.loc, 'sound/machines/click.ogg', 50, 1)
+ loaded = 1
+ else if(istype(W, /obj/item/stack/sheet/metal) || istype(W, /obj/item/stack/sheet/glass))
+ loaded = loadwithsheets(W, sheetmultiplier, user)
+ else if(istype(W, /obj/item/stack/sheet/plasteel))
+ loaded = loadwithsheets(W, plasteelmultiplier*sheetmultiplier, user) //Plasteel is worth 3 times more than glass or metal
+ if(loaded)
+ to_chat(user, "The [src] now holds [matter]/[max_matter] matter-units.")
+ desc = "A RCD. It currently holds [matter]/[max_matter] matter-units."
+ else
+ return ..()
+
+/obj/item/weapon/construction/proc/loadwithsheets(obj/item/stack/sheet/S, value, mob/user)
+ var/maxsheets = round((max_matter-matter)/value) //calculate the max number of sheets that will fit in RCD
+ if(maxsheets > 0)
+ var/amount_to_use = min(S.amount, maxsheets)
+ S.use(amount_to_use)
+ matter += value*amount_to_use
+ playsound(src.loc, 'sound/machines/click.ogg', 50, 1)
+ to_chat(user, "You insert [amount_to_use] [S.name] sheets into the [src]. ")
+ return 1
+ to_chat(user, "You can't insert any more [S.name] sheets into the [src]!")
+ return 0
+
+/obj/item/weapon/construction/proc/activate()
+ playsound(src.loc, 'sound/items/Deconstruct.ogg', 50, 1)
+
+/obj/item/weapon/construction/attack_self(mob/user)
+ playsound(src.loc, 'sound/effects/pop.ogg', 50, 0)
+ if(prob(20))
+ spark_system.start()
+
+/obj/item/weapon/construction/proc/useResource(amount, mob/user)
+ if(matter < amount)
+ if(user)
+ to_chat(user, no_ammo_message)
+ return 0
+ matter -= amount
+ desc = "A [src]. It currently holds [matter]/[max_matter] matter-units."
+ return 1
+
+/obj/item/weapon/construction/proc/checkResource(amount, mob/user)
+ . = matter >= amount
+ if(!. && user)
+ to_chat(user, no_ammo_message)
+ return .
+
+/obj/item/weapon/construction/proc/range_check(atom/A, mob/user)
+ if(!(A in view(7, get_turf(user))))
+ to_chat(user, "The \'Out of Range\' light on the [src] blinks red.")
+ return FALSE
+
+/obj/item/weapon/construction/proc/prox_check(proximity)
+ if(!proximity)
+ return
+
+
+/obj/item/weapon/construction/rcd
+ name = "rapid-construction-device (RCD)"
+ desc = "A device used to rapidly build and deconstruct walls and floors."
+ icon = 'icons/obj/tools.dmi'
+ icon_state = "rcd"
+ max_matter = 160
var/mode = 1
var/canRturf = 0
+ var/ranged = FALSE
var/airlock_type = /obj/machinery/door/airlock
var/window_type = /obj/structure/window/fulltile
var/advanced_airlock_setting = 1 //Set to 1 if you want more paintjobs available
- var/sheetmultiplier = 4 //Controls the amount of matter added for each glass/metal sheet, triple for plasteel
- var/plasteelmultiplier = 3 //Plasteel is worth 3 times more than glass or metal
-
var/list/conf_access = null
var/use_one_access = 0 //If the airlock should require ALL or only ONE of the listed accesses.
-
var/delay_mod = 1
- var/no_ammo_message = "The \'Low Ammo\' light on \
- the RCD blinks yellow."
-/obj/item/weapon/rcd/suicide_act(mob/user)
+/obj/item/weapon/construction/rcd/suicide_act(mob/user)
user.visible_message("[user] sets the RCD to 'Wall' and points it down [user.p_their()] throat! It looks like [user.p_theyre()] trying to commit suicide..")
return (BRUTELOSS)
-/obj/item/weapon/rcd/verb/toggle_window_type()
+/obj/item/weapon/construction/rcd/verb/toggle_window_type()
set name = "Toggle Window Type"
set category = "Object"
set src in usr // What does this do?
@@ -64,7 +148,7 @@ RCD
to_chat(usr, "You change \the [src]'s window mode to [window_type_name].")
-/obj/item/weapon/rcd/verb/change_airlock_access()
+/obj/item/weapon/construction/rcd/verb/change_airlock_access()
set name = "Change Airlock Access"
set category = "Object"
set src in usr
@@ -79,7 +163,6 @@ RCD
var/t1 = text("")
-
if(use_one_access)
t1 += "Restriction Type: At least one access required
"
else
@@ -114,7 +197,7 @@ RCD
popup.open()
onclose(usr, "airlock")
-/obj/item/weapon/rcd/Topic(href, href_list)
+/obj/item/weapon/construction/rcd/Topic(href, href_list)
..()
if (usr.stat || usr.restrained())
return
@@ -127,7 +210,7 @@ RCD
change_airlock_access()
-/obj/item/weapon/rcd/proc/toggle_access(acc)
+/obj/item/weapon/construction/rcd/proc/toggle_access(acc)
if (acc == "all")
conf_access = null
else if(acc == "one")
@@ -145,7 +228,7 @@ RCD
if (!conf_access.len)
conf_access = null
-/obj/item/weapon/rcd/verb/change_airlock_setting()
+/obj/item/weapon/construction/rcd/verb/change_airlock_setting()
set name = "Change Airlock Setting"
set category = "Object"
set src in usr
@@ -207,59 +290,16 @@ RCD
airlock_type = /obj/machinery/door/airlock
-/obj/item/weapon/rcd/New()
+/obj/item/weapon/construction/rcd/New()
..()
- desc = "An RCD. It currently holds [matter]/[max_matter] matter-units."
- src.spark_system = new /datum/effect_system/spark_spread
- spark_system.set_up(5, 0, src)
- spark_system.attach(src)
GLOB.rcd_list += src
-
-/obj/item/weapon/rcd/Destroy()
- qdel(spark_system)
- spark_system = null
+/obj/item/weapon/construction/rcd/Destroy()
GLOB.rcd_list -= src
. = ..()
-/obj/item/weapon/rcd/attackby(obj/item/weapon/W, mob/user, params)
- if(iscyborg(user)) //Make sure cyborgs can't load their RCDs
- return
- var/loaded = 0
- if(istype(W, /obj/item/weapon/rcd_ammo))
- var/obj/item/weapon/rcd_ammo/R = W
- if((matter + R.ammoamt) > max_matter)
- to_chat(user, "The RCD can't hold any more matter-units!")
- return
- qdel(W)
- matter += R.ammoamt
- playsound(src.loc, 'sound/machines/click.ogg', 50, 1)
- loaded = 1
- else if(istype(W, /obj/item/stack/sheet/metal) || istype(W, /obj/item/stack/sheet/glass))
- loaded = loadwithsheets(W, sheetmultiplier, user)
- else if(istype(W, /obj/item/stack/sheet/plasteel))
- loaded = loadwithsheets(W, plasteelmultiplier*sheetmultiplier, user) //Plasteel is worth 3 times more than glass or metal
- if(loaded)
- to_chat(user, "The RCD now holds [matter]/[max_matter] matter-units.")
- desc = "A RCD. It currently holds [matter]/[max_matter] matter-units."
- else
- return ..()
-
-/obj/item/weapon/rcd/proc/loadwithsheets(obj/item/stack/sheet/S, value, mob/user)
- var/maxsheets = round((max_matter-matter)/value) //calculate the max number of sheets that will fit in RCD
- if(maxsheets > 0)
- var/amount_to_use = min(S.amount, maxsheets)
- S.use(amount_to_use)
- matter += value*amount_to_use
- playsound(src.loc, 'sound/machines/click.ogg', 50, 1)
- to_chat(user, "You insert [amount_to_use] [S.name] sheets into the RCD. ")
- return 1
- to_chat(user, "You can't insert any more [S.name] sheets into the RCD!")
- return 0
-
-/obj/item/weapon/rcd/attack_self(mob/user)
- //Change the mode
- playsound(src.loc, 'sound/effects/pop.ogg', 50, 0)
+/obj/item/weapon/construction/rcd/attack_self(mob/user)
+ ..()
switch(mode)
if(1)
mode = 2
@@ -274,16 +314,14 @@ RCD
mode = 1
to_chat(user, "You change RCD's mode to 'Floor & Walls'.")
- if(prob(20))
- src.spark_system.start()
-
-/obj/item/weapon/rcd/proc/activate()
- playsound(src.loc, 'sound/items/Deconstruct.ogg', 50, 1)
-
-
-/obj/item/weapon/rcd/afterattack(atom/A, mob/user, proximity)
- if(!proximity)
+/obj/item/weapon/construction/rcd/proc/target_check(atom/A, mob/user) // only returns true for stuff the device can actually work with
+ if((isturf(A) && A.density && mode==RCD_DECONSTRUCT) || (isturf(A) && !A.density) || (istype(A, /obj/machinery/door/airlock) && mode==RCD_DECONSTRUCT) || istype(A, /obj/structure/grille) || (istype(A, /obj/structure/window) && mode==RCD_DECONSTRUCT) || istype(A, /obj/structure/girder))
+ return TRUE
+ else
return FALSE
+
+/obj/item/weapon/construction/rcd/afterattack(atom/A, mob/user, proximity)
+ prox_check()
var/list/rcd_results = A.rcd_vals(user, src)
if(!rcd_results)
return FALSE
@@ -295,40 +333,26 @@ RCD
playsound(src.loc, 'sound/machines/click.ogg', 50, 1)
return TRUE
-/obj/item/weapon/rcd/proc/useResource(amount, mob/user)
- if(matter < amount)
- if(user)
- to_chat(user, no_ammo_message)
- return 0
- matter -= amount
- desc = "An RCD. It currently holds [matter]/[max_matter] matter-units."
- return 1
-/obj/item/weapon/rcd/proc/checkResource(amount, mob/user)
- . = matter >= amount
- if(!. && user)
- to_chat(user, no_ammo_message)
- return .
-
-/obj/item/weapon/rcd/proc/detonate_pulse()
+/obj/item/weapon/construction/rcd/proc/detonate_pulse()
audible_message("[src] begins to vibrate and \
buzz loudly!","[src] begins \
vibrating violently!")
// 5 seconds to get rid of it
addtimer(CALLBACK(src, .proc/detonate_pulse_explode), 50)
-/obj/item/weapon/rcd/proc/detonate_pulse_explode()
+/obj/item/weapon/construction/rcd/proc/detonate_pulse_explode()
explosion(src, 0, 0, 3, 1, flame_range = 1)
qdel(src)
-/obj/item/weapon/rcd/borg/New()
+/obj/item/weapon/construction/rcd/borg/New()
..()
no_ammo_message = "Insufficient charge."
desc = "A device used to rapidly build walls and floors."
canRturf = 1
-/obj/item/weapon/rcd/borg/useResource(amount, mob/user)
+/obj/item/weapon/construction/rcd/borg/useResource(amount, mob/user)
if(!iscyborg(user))
return 0
var/mob/living/silicon/robot/borgy = user
@@ -341,7 +365,7 @@ RCD
to_chat(user, no_ammo_message)
return .
-/obj/item/weapon/rcd/borg/checkResource(amount, mob/user)
+/obj/item/weapon/construction/rcd/borg/checkResource(amount, mob/user)
if(!iscyborg(user))
return 0
var/mob/living/silicon/robot/borgy = user
@@ -354,10 +378,10 @@ RCD
to_chat(user, no_ammo_message)
return .
-/obj/item/weapon/rcd/loaded
+/obj/item/weapon/construction/rcd/loaded
matter = 160
-/obj/item/weapon/rcd/combat
+/obj/item/weapon/construction/rcd/combat
name = "industrial RCD"
max_matter = 500
matter = 500
@@ -378,7 +402,188 @@ RCD
ammoamt = 160
-/obj/item/weapon/rcd/admin
+/obj/item/weapon/construction/rcd/admin
name = "admin RCD"
max_matter = INFINITY
matter = INFINITY
+
+
+// Ranged RCD
+
+
+/obj/item/weapon/construction/rcd/arcd
+ name = "advanced rapid-construction-device (ARCD)"
+ desc = "A prototype RCD with ranged capability and extended capacity"
+ max_matter = 300
+ matter = 300
+ delay_mod = 0.6
+ ranged = TRUE
+ icon_state = "arcd"
+
+/obj/item/weapon/construction/rcd/arcd/afterattack(atom/A, mob/user)
+ range_check(A,user)
+ if(target_check(A,user))
+ user.Beam(A,icon_state="rped_upgrade",time=30)
+ ..()
+
+
+
+// RAPID LIGHTING DEVICE
+
+
+
+/obj/item/weapon/construction/rld
+ name = "rapid-light-device (RLD)"
+ desc = "A device used to rapidly provide lighting sources to an area."
+ icon = 'icons/obj/tools.dmi'
+ icon_state = "rld-5"
+ matter = 200
+ max_matter = 200
+ var/mode = LIGHT_MODE
+ actions_types = list(/datum/action/item_action/pick_color)
+
+ var/wallcost = 10
+ var/floorcost = 15
+ var/launchcost = 5
+ var/deconcost = 10
+
+ var/walldelay = 10
+ var/floordelay = 10
+ var/decondelay = 15
+
+ var/color_choice = null
+
+
+/obj/item/weapon/construction/rld/ui_action_click(mob/user, var/datum/action/A)
+ if(istype(A, /datum/action/item_action/pick_color))
+ color_choice = input(user,"Choose Color") as color
+ else
+ ..()
+
+/obj/item/weapon/construction/rld/update_icon()
+ icon_state = "rld-[round(matter/35)]"
+ ..()
+
+
+/obj/item/weapon/construction/rld/attack_self(mob/user)
+ ..()
+ switch(mode)
+ if(REMOVE_MODE)
+ mode = LIGHT_MODE
+ to_chat(user, "You change RLD's mode to 'Permanent Light Construction'.")
+ if(LIGHT_MODE)
+ mode = GLOW_MODE
+ to_chat(user, "You change RLD's mode to 'Light Launcher'.")
+ if(GLOW_MODE)
+ mode = REMOVE_MODE
+ to_chat(user, "You change RLD's mode to 'Deconstruct'.")
+
+
+/obj/item/weapon/construction/rld/proc/checkdupes(var/target)
+ . = list()
+ var/turf/checking = get_turf(target)
+ for(var/obj/machinery/light/dupe in checking)
+ if(istype(dupe, /obj/machinery/light))
+ . |= dupe
+
+
+/obj/item/weapon/construction/rld/afterattack(atom/A, mob/user)
+ range_check(A,user)
+ var/turf/start = get_turf(src)
+ switch(mode)
+ if(REMOVE_MODE)
+ if(istype(A, /obj/machinery/light/))
+ if(checkResource(deconcost, user))
+ to_chat(user, "You start deconstructing [A]...")
+ user.Beam(A,icon_state="nzcrentrs_power",time=15)
+ playsound(src.loc, 'sound/machines/click.ogg', 50, 1)
+ if(do_after(user, decondelay, target = A))
+ if(!useResource(deconcost, user))
+ return 0
+ activate()
+ qdel(A)
+ return TRUE
+ return FALSE
+ if(LIGHT_MODE)
+ if(iswallturf(A))
+ var/turf/closed/wall/W = A
+ if(checkResource(floorcost, user))
+ to_chat(user, "You start building a wall light...")
+ user.Beam(A,icon_state="nzcrentrs_power",time=15)
+ playsound(src.loc, 'sound/machines/click.ogg', 50, 1)
+ playsound(src.loc, 'sound/effects/light_flicker.ogg', 50, 0)
+ if(do_after(user, floordelay, target = A))
+ if(!istype(W))
+ return FALSE
+ var/list/candidates = list()
+ var/turf/open/winner = null
+ var/winning_dist = null
+ for(var/direction in GLOB.cardinal)
+ var/turf/C = get_step(W, direction)
+ var/list/dupes = checkdupes(C)
+ if(start.CanAtmosPass(C) && !dupes.len)
+ candidates += C
+ if(!candidates.len)
+ to_chat(user, "Valid target not found...")
+ playsound(src.loc, 'sound/misc/compiler-failure.ogg', 30, 1)
+ return FALSE
+ for(var/turf/open/O in candidates)
+ if(istype(O))
+ var/x0 = O.x
+ var/y0 = O.y
+ var/contender = cheap_hypotenuse(start.x, start.y, x0, y0)
+ if(!winner)
+ winner = O
+ winning_dist = contender
+ else
+ if(contender < winning_dist) // lower is better
+ winner = O
+ winning_dist = contender
+ activate()
+ if(!useResource(wallcost, user))
+ return FALSE
+ var/light = get_turf(winner)
+ var/align = get_dir(winner, A)
+ var/obj/machinery/light/L = new /obj/machinery/light(light)
+ L.dir = align
+ L.color = color_choice
+ L.light_color = L.color
+ return TRUE
+ return FALSE
+
+ if(isfloorturf(A))
+ var/turf/open/floor/F = A
+ if(checkResource(floorcost, user))
+ to_chat(user, "You start building a floor light...")
+ user.Beam(A,icon_state="nzcrentrs_power",time=15)
+ playsound(src.loc, 'sound/machines/click.ogg', 50, 1)
+ playsound(src.loc, 'sound/effects/light_flicker.ogg', 50, 1)
+ if(do_after(user, floordelay, target = A))
+ if(!istype(F))
+ return 0
+ if(!useResource(floorcost, user))
+ return 0
+ activate()
+ var/destination = get_turf(A)
+ var/obj/machinery/light/floor/FL = new /obj/machinery/light/floor(destination)
+ FL.color = color_choice
+ FL.light_color = FL.color
+ return TRUE
+ return FALSE
+
+ if(GLOW_MODE)
+ if(useResource(launchcost, user))
+ activate()
+ to_chat(user, "You fire a glowstick!")
+ var/obj/item/device/flashlight/glowstick/G = new /obj/item/device/flashlight/glowstick(start)
+ G.color = color_choice
+ G.light_color = G.color
+ G.throw_at(A, 9, 3, user)
+ G.on = TRUE
+ G.update_brightness()
+ return TRUE
+ return FALSE
+
+#undef GLOW_MODE
+#undef LIGHT_MODE
+#undef REMOVE_MODE
diff --git a/code/game/objects/structures/crates_lockers/crates.dm b/code/game/objects/structures/crates_lockers/crates.dm
index 4270e765a29..040edcd9316 100644
--- a/code/game/objects/structures/crates_lockers/crates.dm
+++ b/code/game/objects/structures/crates_lockers/crates.dm
@@ -139,7 +139,7 @@
..()
for(var/i in 1 to 4)
new /obj/item/weapon/rcd_ammo(src)
- new /obj/item/weapon/rcd(src)
+ new /obj/item/weapon/construction/rcd(src)
/obj/structure/closet/crate/science
name = "science crate"
diff --git a/code/game/objects/structures/girders.dm b/code/game/objects/structures/girders.dm
index 4a3ab87770d..9f37710d78d 100644
--- a/code/game/objects/structures/girders.dm
+++ b/code/game/objects/structures/girders.dm
@@ -396,7 +396,7 @@
new/obj/item/stack/sheet/runed_metal/(get_turf(src), 1)
qdel(src)
-/obj/structure/girder/rcd_vals(mob/user, obj/item/weapon/rcd/the_rcd)
+/obj/structure/girder/rcd_vals(mob/user, obj/item/weapon/construction/rcd/the_rcd)
switch(the_rcd.mode)
if(RCD_FLOORWALL)
return list("mode" = RCD_FLOORWALL, "delay" = 20, "cost" = 8)
@@ -404,7 +404,7 @@
return list("mode" = RCD_DECONSTRUCT, "delay" = 20, "cost" = 13)
return FALSE
-/obj/structure/girder/rcd_act(mob/user, obj/item/weapon/rcd/the_rcd, passed_mode)
+/obj/structure/girder/rcd_act(mob/user, obj/item/weapon/construction/rcd/the_rcd, passed_mode)
var/turf/T = get_turf(src)
switch(passed_mode)
if(RCD_FLOORWALL)
diff --git a/code/game/objects/structures/grille.dm b/code/game/objects/structures/grille.dm
index 478b3273b29..2dc159d4828 100644
--- a/code/game/objects/structures/grille.dm
+++ b/code/game/objects/structures/grille.dm
@@ -18,7 +18,7 @@
var/grille_type = null
var/broken_type = /obj/structure/grille/broken
-/obj/structure/grille/rcd_vals(mob/user, obj/item/weapon/rcd/the_rcd)
+/obj/structure/grille/rcd_vals(mob/user, obj/item/weapon/construction/rcd/the_rcd)
switch(the_rcd.mode)
if(RCD_DECONSTRUCT)
return list("mode" = RCD_DECONSTRUCT, "delay" = 20, "cost" = 5)
@@ -26,7 +26,7 @@
return list("mode" = RCD_WINDOWGRILLE, "delay" = 40, "cost" = 10)
return FALSE
-/obj/structure/grille/rcd_act(mob/user, var/obj/item/weapon/rcd/the_rcd, passed_mode)
+/obj/structure/grille/rcd_act(mob/user, var/obj/item/weapon/construction/rcd/the_rcd, passed_mode)
switch(passed_mode)
if(RCD_DECONSTRUCT)
to_chat(user, "You deconstruct the grille.")
diff --git a/code/game/objects/structures/window.dm b/code/game/objects/structures/window.dm
index d5bcb8b60b5..c6c2ef358bc 100644
--- a/code/game/objects/structures/window.dm
+++ b/code/game/objects/structures/window.dm
@@ -57,13 +57,13 @@
if(rods)
debris += new /obj/item/stack/rods(src, rods)
-/obj/structure/window/rcd_vals(mob/user, obj/item/weapon/rcd/the_rcd)
+/obj/structure/window/rcd_vals(mob/user, obj/item/weapon/construction/rcd/the_rcd)
switch(the_rcd.mode)
if(RCD_DECONSTRUCT)
return list("mode" = RCD_DECONSTRUCT, "delay" = 20, "cost" = 5)
return FALSE
-/obj/structure/window/rcd_act(mob/user, var/obj/item/weapon/rcd/the_rcd)
+/obj/structure/window/rcd_act(mob/user, var/obj/item/weapon/construction/rcd/the_rcd)
switch(the_rcd.mode)
if(RCD_DECONSTRUCT)
to_chat(user, "You deconstruct the window.")
diff --git a/code/game/turfs/simulated/floor.dm b/code/game/turfs/simulated/floor.dm
index 98c28256e92..5f581fba63f 100644
--- a/code/game/turfs/simulated/floor.dm
+++ b/code/game/turfs/simulated/floor.dm
@@ -200,7 +200,7 @@
/turf/open/floor/acid_melt()
ChangeTurf(baseturf)
-/turf/open/floor/rcd_vals(mob/user, obj/item/weapon/rcd/the_rcd)
+/turf/open/floor/rcd_vals(mob/user, obj/item/weapon/construction/rcd/the_rcd)
switch(the_rcd.mode)
if(RCD_FLOORWALL)
return list("mode" = RCD_FLOORWALL, "delay" = 20, "cost" = 16)
@@ -212,7 +212,7 @@
return list("mode" = RCD_WINDOWGRILLE, "delay" = 40, "cost" = 4)
return FALSE
-/turf/open/floor/rcd_act(mob/user, obj/item/weapon/rcd/the_rcd, passed_mode)
+/turf/open/floor/rcd_act(mob/user, obj/item/weapon/construction/rcd/the_rcd, passed_mode)
switch(passed_mode)
if(RCD_FLOORWALL)
to_chat(user, "You build a wall.")
diff --git a/code/game/turfs/simulated/wall/reinf_walls.dm b/code/game/turfs/simulated/wall/reinf_walls.dm
index c1eff8e4154..c15e478c499 100644
--- a/code/game/turfs/simulated/wall/reinf_walls.dm
+++ b/code/game/turfs/simulated/wall/reinf_walls.dm
@@ -251,12 +251,12 @@
if(prob(30))
dismantle_wall()
-/turf/closed/wall/r_wall/rcd_vals(mob/user, obj/item/weapon/rcd/the_rcd)
+/turf/closed/wall/r_wall/rcd_vals(mob/user, obj/item/weapon/construction/rcd/the_rcd)
if(!the_rcd.canRturf)
return FALSE
return ..()
-/turf/closed/wall/r_wall/rcd_act(mob/user, obj/item/weapon/rcd/the_rcd, passed_mode)
+/turf/closed/wall/r_wall/rcd_act(mob/user, obj/item/weapon/construction/rcd/the_rcd, passed_mode)
if(!the_rcd.canRturf)
return FALSE
return ..()
diff --git a/code/game/turfs/simulated/walls.dm b/code/game/turfs/simulated/walls.dm
index 2fd5b4433ff..1aea3d7dbc4 100644
--- a/code/game/turfs/simulated/walls.dm
+++ b/code/game/turfs/simulated/walls.dm
@@ -258,13 +258,13 @@
/turf/closed/wall/acid_melt()
dismantle_wall(1)
-/turf/closed/wall/rcd_vals(mob/user, obj/item/weapon/rcd/the_rcd)
+/turf/closed/wall/rcd_vals(mob/user, obj/item/weapon/construction/rcd/the_rcd)
switch(the_rcd.mode)
if(RCD_DECONSTRUCT)
return list("mode" = RCD_DECONSTRUCT, "delay" = 40, "cost" = 26)
return FALSE
-/turf/closed/wall/rcd_act(mob/user, obj/item/weapon/rcd/the_rcd, passed_mode)
+/turf/closed/wall/rcd_act(mob/user, obj/item/weapon/construction/rcd/the_rcd, passed_mode)
switch(passed_mode)
if(RCD_DECONSTRUCT)
to_chat(user, "You deconstruct the wall.")
diff --git a/code/game/turfs/space/space.dm b/code/game/turfs/space/space.dm
index 4d96decc5aa..f71e7dbe0f8 100644
--- a/code/game/turfs/space/space.dm
+++ b/code/game/turfs/space/space.dm
@@ -159,15 +159,16 @@
return 0
-/turf/open/space/rcd_vals(mob/user, obj/item/weapon/rcd/the_rcd)
+/turf/open/space/rcd_vals(mob/user, obj/item/weapon/construction/rcd/the_rcd)
if(!CanBuildHere())
return FALSE
+
switch(the_rcd.mode)
if(RCD_FLOORWALL)
return list("mode" = RCD_FLOORWALL, "delay" = 0, "cost" = 2)
return FALSE
-/turf/open/space/rcd_act(mob/user, obj/item/weapon/rcd/the_rcd, passed_mode)
+/turf/open/space/rcd_act(mob/user, obj/item/weapon/construction/rcd/the_rcd, passed_mode)
switch(passed_mode)
if(RCD_FLOORWALL)
to_chat(user, "You build a floor.")
diff --git a/code/modules/cargo/exports/tools.dm b/code/modules/cargo/exports/tools.dm
index 71b778e931f..683f2c08cc0 100644
--- a/code/modules/cargo/exports/tools.dm
+++ b/code/modules/cargo/exports/tools.dm
@@ -105,7 +105,7 @@
/datum/export/rcd
cost = 100 // 15 metal -> 75 credits, +25 credits for production
unit_name = "rapid construction device"
- export_types = list(/obj/item/weapon/rcd)
+ export_types = list(/obj/item/weapon/construction/rcd)
/datum/export/rcd_ammo
cost = 15 // 1.5 metal, 1 glass -> 12.5 credits, +2.5 credits
diff --git a/code/modules/clothing/outfits/ert.dm b/code/modules/clothing/outfits/ert.dm
index 83a8747252e..b3f74b038fa 100644
--- a/code/modules/clothing/outfits/ert.dm
+++ b/code/modules/clothing/outfits/ert.dm
@@ -139,7 +139,7 @@
/obj/item/weapon/melee/baton/loaded=1,\
/obj/item/clothing/mask/gas/sechailer=1,\
/obj/item/weapon/gun/energy/e_gun=1,\
- /obj/item/weapon/rcd/loaded=1)
+ /obj/item/weapon/construction/rcd/loaded=1)
/datum/outfit/ert/engineer/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE)
..()
@@ -158,7 +158,7 @@
/obj/item/weapon/melee/baton/loaded=1,\
/obj/item/clothing/mask/gas/sechailer/swat=1,\
/obj/item/weapon/gun/energy/pulse/pistol/loyalpin=1,\
- /obj/item/weapon/rcd/combat=1)
+ /obj/item/weapon/construction/rcd/combat=1)
/datum/outfit/centcom_official
diff --git a/code/modules/clothing/spacesuits/hardsuit.dm b/code/modules/clothing/spacesuits/hardsuit.dm
index 6cc485a34c9..d8a0c97f51c 100644
--- a/code/modules/clothing/spacesuits/hardsuit.dm
+++ b/code/modules/clothing/spacesuits/hardsuit.dm
@@ -67,7 +67,7 @@
obj_integrity = 300
max_integrity = 300
armor = list(melee = 10, bullet = 5, laser = 10, energy = 5, bomb = 10, bio = 100, rad = 75, fire = 50, acid = 75)
- allowed = list(/obj/item/device/flashlight,/obj/item/weapon/tank/internals,/obj/item/device/t_scanner, /obj/item/weapon/rcd, /obj/item/weapon/pipe_dispenser)
+ allowed = list(/obj/item/device/flashlight,/obj/item/weapon/tank/internals,/obj/item/device/t_scanner, /obj/item/weapon/construction/rcd, /obj/item/weapon/pipe_dispenser)
siemens_coefficient = 0
var/obj/item/clothing/head/helmet/space/hardsuit/helmet
actions_types = list(/datum/action/item_action/toggle_helmet)
diff --git a/code/modules/clothing/suits/miscellaneous.dm b/code/modules/clothing/suits/miscellaneous.dm
index e0b92a8fad6..321163d1040 100644
--- a/code/modules/clothing/suits/miscellaneous.dm
+++ b/code/modules/clothing/suits/miscellaneous.dm
@@ -493,7 +493,7 @@
icon_state = "coatengineer"
item_state = "coatengineer"
armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 0, rad = 20, fire = 30, acid = 45)
- allowed = list(/obj/item/device/flashlight,/obj/item/weapon/tank/internals/emergency_oxygen,/obj/item/device/t_scanner, /obj/item/weapon/rcd, /obj/item/weapon/pipe_dispenser)
+ allowed = list(/obj/item/device/flashlight,/obj/item/weapon/tank/internals/emergency_oxygen,/obj/item/device/t_scanner, /obj/item/weapon/construction/rcd, /obj/item/weapon/pipe_dispenser)
hoodtype = /obj/item/clothing/head/hooded/winterhood/engineering
/obj/item/clothing/head/hooded/winterhood/engineering
diff --git a/code/modules/flufftext/Hallucination.dm b/code/modules/flufftext/Hallucination.dm
index d735d8e534f..cd034a11174 100644
--- a/code/modules/flufftext/Hallucination.dm
+++ b/code/modules/flufftext/Hallucination.dm
@@ -538,7 +538,7 @@ Gunshots/explosions/opening doors/less rare audio (done)
/obj/item/device/radio/headset/syndicate, /obj/item/weapon/grenade/plastic/c4,\
/obj/item/device/powersink, /obj/item/weapon/storage/box/syndie_kit,\
/obj/item/toy/syndicateballoon, /obj/item/weapon/gun/energy/laser/captain,\
- /obj/item/weapon/hand_tele, /obj/item/weapon/rcd, /obj/item/weapon/tank/jetpack,\
+ /obj/item/weapon/hand_tele, /obj/item/weapon/construction/rcd, /obj/item/weapon/tank/jetpack,\
/obj/item/clothing/under/rank/captain, /obj/item/device/aicard,\
/obj/item/clothing/shoes/magboots, /obj/item/areaeditor/blueprints, /obj/item/weapon/disk/nuclear,\
/obj/item/clothing/suit/space/nasavoid, /obj/item/weapon/tank)
@@ -673,7 +673,6 @@ Gunshots/explosions/opening doors/less rare audio (done)
QDEL_IN(O, 300)
-
/obj/effect/hallucination/bolts
var/list/doors = list()
diff --git a/code/modules/mining/aux_base_camera.dm b/code/modules/mining/aux_base_camera.dm
index fcbced3210d..ebcd35f6df9 100644
--- a/code/modules/mining/aux_base_camera.dm
+++ b/code/modules/mining/aux_base_camera.dm
@@ -20,7 +20,7 @@
dir = direct //This camera eye is visible as a drone, and needs to keep the dir updated
..()
-/obj/item/weapon/rcd/internal //Base console's internal RCD. Roundstart consoles are filled, rebuilt cosoles start empty.
+/obj/item/weapon/construction/rcd/internal //Base console's internal RCD. Roundstart consoles are filled, rebuilt cosoles start empty.
name = "internal RCD"
max_matter = 600 //Bigger container and faster speeds due to being specialized and stationary.
no_ammo_message = "Internal matter exhausted. Please add additional materials."
@@ -30,7 +30,7 @@
name = "base contruction console"
desc = "An industrial computer integrated with a camera-assisted rapid construction drone."
networks = list("SS13")
- var/obj/item/weapon/rcd/internal/RCD //Internal RCD. The computer passes user commands to this in order to avoid massive copypaste.
+ var/obj/item/weapon/construction/rcd/internal/RCD //Internal RCD. The computer passes user commands to this in order to avoid massive copypaste.
circuit = /obj/item/weapon/circuitboard/computer/base_construction
off_action = new/datum/action/innate/camera_off/base_construction
var/datum/action/innate/aux_base/switch_mode/switch_mode_action = new //Action for switching the RCD's build modes
@@ -50,7 +50,7 @@
/obj/machinery/computer/camera_advanced/base_construction/New()
..()
- RCD = new /obj/item/weapon/rcd/internal(src)
+ RCD = new /obj/item/weapon/construction/rcd/internal(src)
/obj/machinery/computer/camera_advanced/base_construction/Initialize(mapload)
..()
@@ -117,7 +117,7 @@
remote_eye = C.remote_control
B = target
if(!B.RCD) //The console must always have an RCD.
- B.RCD = new /obj/item/weapon/rcd/internal(src) //If the RCD is lost somehow, make a new (empty) one!
+ B.RCD = new /obj/item/weapon/construction/rcd/internal(src) //If the RCD is lost somehow, make a new (empty) one!
/datum/action/innate/aux_base/proc/check_spot()
//Check a loction to see if it is inside the aux base at the station. Camera visbility checks omitted so as to not hinder construction.
diff --git a/code/modules/mob/living/silicon/robot/robot_modules.dm b/code/modules/mob/living/silicon/robot/robot_modules.dm
index 1ac95b26af2..257bf11163c 100644
--- a/code/modules/mob/living/silicon/robot/robot_modules.dm
+++ b/code/modules/mob/living/silicon/robot/robot_modules.dm
@@ -287,7 +287,7 @@
basic_modules = list(
/obj/item/device/assembly/flash/cyborg,
/obj/item/borg/sight/meson,
- /obj/item/weapon/rcd/borg,
+ /obj/item/weapon/construction/rcd/borg,
/obj/item/weapon/pipe_dispenser,
/obj/item/weapon/extinguisher,
/obj/item/weapon/weldingtool/largetank/cyborg,
diff --git a/code/modules/power/lighting.dm b/code/modules/power/lighting.dm
index 82124c14099..133fad1b4d8 100644
--- a/code/modules/power/lighting.dm
+++ b/code/modules/power/lighting.dm
@@ -649,3 +649,14 @@
force = 5
playsound(src.loc, 'sound/effects/Glasshit.ogg', 75, 1)
update()
+
+
+/obj/machinery/light/floor
+ name = "floor light"
+ icon = 'icons/obj/lighting.dmi'
+ base_state = "floor" // base description and icon_state
+ icon_state = "floor1"
+ brightness = 4
+ layer = 2.5
+ light_type = /obj/item/weapon/light/bulb
+ fitting = "bulb"
diff --git a/code/modules/research/designs/autolathe_designs.dm b/code/modules/research/designs/autolathe_designs.dm
index 28b5a893a98..9f2fbda1f34 100644
--- a/code/modules/research/designs/autolathe_designs.dm
+++ b/code/modules/research/designs/autolathe_designs.dm
@@ -581,7 +581,7 @@
id = "rcd"
build_type = AUTOLATHE
materials = list(MAT_METAL = 30000)
- build_path = /obj/item/weapon/rcd
+ build_path = /obj/item/weapon/construction/rcd
category = list("hacked", "Construction")
/datum/design/rpd
diff --git a/code/modules/research/experimentor.dm b/code/modules/research/experimentor.dm
index 877ef70c66f..c12a6d553fd 100644
--- a/code/modules/research/experimentor.dm
+++ b/code/modules/research/experimentor.dm
@@ -73,7 +73,7 @@
valid_items += rand(1,max(2,35-probWeight))
valid_items += I
- if(ispath(I,/obj/item/weapon/rcd) || ispath(I,/obj/item/weapon/grenade) || ispath(I,/obj/item/device/aicard) || ispath(I,/obj/item/weapon/storage/backpack/holding) || ispath(I,/obj/item/slime_extract) || ispath(I,/obj/item/device/onetankbomb) || ispath(I,/obj/item/device/transfer_valve))
+ if(ispath(I,/obj/item/weapon/construction/rcd) || ispath(I,/obj/item/weapon/grenade) || ispath(I,/obj/item/device/aicard) || ispath(I,/obj/item/weapon/storage/backpack/holding) || ispath(I,/obj/item/slime_extract) || ispath(I,/obj/item/device/onetankbomb) || ispath(I,/obj/item/device/transfer_valve))
var/obj/item/tempCheck = I
if(initial(tempCheck.icon_state) != null)
critical_items += I
diff --git a/icons/obj/tools.dmi b/icons/obj/tools.dmi
index cd0d3f835ed..042a8c12cd3 100644
Binary files a/icons/obj/tools.dmi and b/icons/obj/tools.dmi differ