diff --git a/.github/CONTRIBUTING.md b/.github/CONTRIBUTING.md
index 1b1a8f07c83..859af746b47 100644
--- a/.github/CONTRIBUTING.md
+++ b/.github/CONTRIBUTING.md
@@ -276,6 +276,22 @@ H.gib()
however DM also has a dot variable, accessed just as ```.``` on it's own, defaulting to a value of null, now what's special about the dot operator is that it is automatically returned (as in the ```return``` statment) at the end of a proc, provided the proc does not already manually return (```return count``` for example). Why is this special? well the ```return``` statement should ideally be free from overhead (functionally free, of course nothing's free) but DM fails to fulfill this, DM's return statement is actually fairly costly for what it does and for what it's used for.
With ```.``` being everpresent in every proc can we use it as a temporary variable? Of course we can! However the ```.``` operator cannot replace a typecasted variable, it can hold data any other var in DM can, it just can't be accessed as one, however the ```.``` operator is compatible with a few operators that look weird but work perfectly fine, such as: ```.++``` for incrementing ```.'s``` value, or ```.[1]``` for accessing the first element of ```.``` (provided it's a list).
+## Globals versus Static
+
+Byond has a var keyword, called global. This var keyword is for vars inside of types. IE:
+
+```
+mob
+ var
+ global
+ thing = 1
+```
+It DOES NOT mean that you can access it everywhere like a global var, instead It means that that var will only exist once for all instances of its type, in this case that var will only exist once for all mobs, ie its shared across everything in it's type. (much more like the keyword static in other languages like php/c++/c#/java)
+
+Isn't that confusing?
+
+There is also an undocumented keyword static, that has the same behaviour as global but more correctly describes byond's behaviour. Therefore we always use static instead of global where we need it as it reduces suprise when reading byond code.
+
## Pull Request Process
There is no strict process when it comes to merging pull requests, pull requests will sometimes take a while before they are looked at by a maintainer, the bigger the change the more time it will take before they are accepted into the code. Every team member is a volunteer who is giving up their own time to help maintain and contribute, so please be nice. Here are some helpful ways to make it easier for you and for the maintainer when making a pull request.
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/_maps/shuttles/emergency_pubby.dmm b/_maps/shuttles/emergency_pubby.dmm
index dfcd18a724f..e1823034341 100644
--- a/_maps/shuttles/emergency_pubby.dmm
+++ b/_maps/shuttles/emergency_pubby.dmm
@@ -177,6 +177,9 @@
/obj/item/weapon/twohanded/required/kirbyplants{
icon_state = "plant-22"
},
+/obj/machinery/light{
+ dir = 1
+ },
/turf/open/floor/mineral/titanium/blue,
/area/shuttle/escape)
"aG" = (
@@ -421,11 +424,11 @@ ab
ab
ab
ab
-aI
+ao
aL
aL
aL
-aT
+ao
ab
ab
ab
@@ -445,7 +448,7 @@ ao
ao
ao
ao
-ao
+aT
ab
aV
aY
@@ -525,7 +528,7 @@ ao
ao
ao
ao
-ao
+aT
ab
aW
aZ
@@ -541,11 +544,11 @@ ab
ab
ab
ab
-aI
+ao
aK
aK
aK
-aT
+ao
ab
ab
ab
diff --git a/code/orphaned_procs/AStar.dm b/code/__HELPERS/AStar.dm
similarity index 100%
rename from code/orphaned_procs/AStar.dm
rename to code/__HELPERS/AStar.dm
diff --git a/code/orphaned_procs/priority_announce.dm b/code/__HELPERS/priority_announce.dm
similarity index 100%
rename from code/orphaned_procs/priority_announce.dm
rename to code/__HELPERS/priority_announce.dm
diff --git a/code/controllers/master.dm b/code/controllers/master.dm
index f90960b92f0..b4c5bc7d6d7 100644
--- a/code/controllers/master.dm
+++ b/code/controllers/master.dm
@@ -10,6 +10,10 @@
//This is the ABSOLUTE ONLY THING that should init globally like this
GLOBAL_REAL(Master, /datum/controller/master) = new
+//THIS IS THE INIT ORDER
+//Master -> SSPreInit -> GLOB -> world -> config -> SSInit -> Failsafe
+//GOT IT MEMORIZED?
+
GLOBAL_VAR_INIT(MC_restart_clear, 0)
GLOBAL_VAR_INIT(MC_restart_timeout, 0)
GLOBAL_VAR_INIT(MC_restart_count, 0)
diff --git a/code/controllers/subsystem/garbage.dm b/code/controllers/subsystem/garbage.dm
index 1fff5c64304..f0bfb6a76a2 100644
--- a/code/controllers/subsystem/garbage.dm
+++ b/code/controllers/subsystem/garbage.dm
@@ -47,6 +47,21 @@ SUBSYSTEM_DEF(garbage)
msg += "TGR:[round((totalgcs/(totaldels+totalgcs))*100, 0.01)]%"
..(msg)
+/datum/controller/subsystem/garbage/Shutdown()
+ //Adds the del() log to world.log in a format condensable by the runtime condenser found in tools
+ if(didntgc.len || sleptDestroy.len)
+ var/list/dellog = list()
+ for(var/path in didntgc)
+ dellog += "Path : [path] \n"
+ dellog += "Failures : [didntgc[path]] \n"
+ if(path in sleptDestroy)
+ dellog += "Sleeps : [sleptDestroy[path]] \n"
+ sleptDestroy -= path
+ for(var/path in sleptDestroy)
+ dellog += "Path : [path] \n"
+ dellog += "Sleeps : [sleptDestroy[path]] \n"
+ log_world(dellog.Join())
+
/datum/controller/subsystem/garbage/fire()
HandleToBeQueued()
if(state == SS_RUNNING)
diff --git a/code/controllers/subsystem/ticker.dm b/code/controllers/subsystem/ticker.dm
index 3f7f23b62e2..5d572f8a07a 100644
--- a/code/controllers/subsystem/ticker.dm
+++ b/code/controllers/subsystem/ticker.dm
@@ -590,22 +590,6 @@ SUBSYSTEM_DEF(ticker)
CHECK_TICK
- //Adds the del() log to world.log in a format condensable by the runtime condenser found in tools
- if(SSgarbage.didntgc.len || SSgarbage.sleptDestroy.len)
- var/dellog = ""
- for(var/path in SSgarbage.didntgc)
- dellog += "Path : [path] \n"
- dellog += "Failures : [SSgarbage.didntgc[path]] \n"
- if(path in SSgarbage.sleptDestroy)
- dellog += "Sleeps : [SSgarbage.sleptDestroy[path]] \n"
- SSgarbage.sleptDestroy -= path
- for(var/path in SSgarbage.sleptDestroy)
- dellog += "Path : [path] \n"
- dellog += "Sleeps : [SSgarbage.sleptDestroy[path]] \n"
- log_world(dellog)
-
- CHECK_TICK
-
//Collects persistence features
SSpersistence.CollectData()
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/datums/riding.dm b/code/datums/riding.dm
index aa167307036..c069e0cdeb2 100644
--- a/code/datums/riding.dm
+++ b/code/datums/riding.dm
@@ -335,11 +335,11 @@
/datum/riding/human/ride_check(mob/living/M)
var/mob/living/carbon/human/H = ridden //IF this runtimes I'm blaming the admins.
if(M.incapacitated(FALSE, TRUE) || H.incapacitated(FALSE, TRUE))
- M.visible_message("[M] falls off of [ridden]!")
+ M.visible_message("[M] falls off [ridden]!")
Unbuckle(M)
return FALSE
if(M.restrained(TRUE))
- M.visible_message("[M] can't hang onto [ridden] with their hands cuffed!") //Honestly this should put the ridden mob in a chokehold.
+ M.visible_message("[M] can't hang onto [ridden] with their hands cuffed!") //Honestly this should put the ridden mob in a chokehold.
Unbuckle(M)
return FALSE
if(H.pulling == M)
@@ -375,7 +375,7 @@
ridden.unbuckle_mob(user)
user.Weaken(3)
user.Stun(3)
- user.visible_message("[ridden] pushes [user] off of them!")
+ user.visible_message("[ridden] pushes [user] off of them!")
/datum/riding/cyborg
keytype = null
@@ -436,7 +436,7 @@
var/turf/target = get_edge_target_turf(ridden, ridden.dir)
var/turf/targetm = get_step(get_turf(ridden), ridden.dir)
M.Move(targetm)
- M.visible_message("[M] is thrown clear of [ridden]!")
+ M.visible_message("[M] is thrown clear of [ridden]!")
M.throw_at(target, 14, 5, ridden)
M.Weaken(3)
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/cloning.dm b/code/game/machinery/cloning.dm
index fcf09bca3d6..794f1ccda32 100644
--- a/code/game/machinery/cloning.dm
+++ b/code/game/machinery/cloning.dm
@@ -126,6 +126,15 @@
if (is_operational() && (!isnull(occupant)) && (occupant.stat != DEAD))
to_chat(user, "Current clone cycle is [round(get_completion())]% complete.")
+/obj/machinery/clonepod/return_air()
+ // We want to simulate the clone not being in contact with
+ // the atmosphere, so we'll put them in a constant pressure
+ // nitrogen. They'll breathe through the chemicals we pump into them.
+ var/static/datum/gas_mixture/immutable/cloner/GM //global so that there's only one instance made for all cloning pods
+ if(!GM)
+ GM = new
+ return GM
+
/obj/machinery/clonepod/proc/get_completion()
. = (100 * ((occupant.health + 100) / (heal_level + 100)))
diff --git a/code/game/machinery/computer/camera_advanced.dm b/code/game/machinery/computer/camera_advanced.dm
index f0adeac2266..39cdb1478cb 100644
--- a/code/game/machinery/computer/camera_advanced.dm
+++ b/code/game/machinery/computer/camera_advanced.dm
@@ -92,6 +92,12 @@ obj/machinery/computer/camera_advanced/attack_ai(mob/user)
var/eye_initialized = 0
var/visible_icon = 0
var/image/user_image = null
+
+/mob/camera/aiEye/remote/update_remote_sight(mob/living/user)
+ user.see_invisible = SEE_INVISIBLE_LIVING //can't see ghosts through cameras
+ user.sight = 0
+ user.see_in_dark = 2
+ return 1
/mob/camera/aiEye/remote/Destroy()
eye_user = null
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.dm b/code/game/objects/items.dm
index 9e962ddeeca..390fab562cb 100644
--- a/code/game/objects/items.dm
+++ b/code/game/objects/items.dm
@@ -1,5 +1,9 @@
GLOBAL_DATUM_INIT(fire_overlay, /image, image("icon" = 'icons/effects/fire.dmi', "icon_state" = "fire"))
+GLOBAL_VAR_INIT(rpg_loot_items, FALSE)
+// if true, everyone item when created will have its name changed to be
+// more... RPG-like.
+
/obj/item
name = "item"
icon = 'icons/obj/items.dmi'
@@ -99,6 +103,8 @@ GLOBAL_DATUM_INIT(fire_overlay, /image, image("icon" = 'icons/effects/fire.dmi',
// non-clothing items
var/datum/dog_fashion/dog_fashion = null
+ var/datum/rpg_loot/rpg_loot = null
+
/obj/item/Initialize()
if (!materials)
materials = list()
@@ -107,6 +113,9 @@ GLOBAL_DATUM_INIT(fire_overlay, /image, image("icon" = 'icons/effects/fire.dmi',
new path(src)
actions_types = null
+ if(GLOB.rpg_loot_items)
+ rpg_loot = new(src)
+
/obj/item/Destroy()
flags &= ~DROPDEL //prevent reqdels
if(ismob(loc))
@@ -114,6 +123,7 @@ GLOBAL_DATUM_INIT(fire_overlay, /image, image("icon" = 'icons/effects/fire.dmi',
m.temporarilyRemoveItemFromInventory(src, TRUE)
for(var/X in actions)
qdel(X)
+ QDEL_NULL(rpg_loot)
return ..()
/obj/item/device
diff --git a/code/game/objects/items/charter.dm b/code/game/objects/items/charter.dm
index e5f4ac1cb75..98e03ef18ca 100644
--- a/code/game/objects/items/charter.dm
+++ b/code/game/objects/items/charter.dm
@@ -86,7 +86,7 @@
name = "station charter for [station_name()]"
desc = "An official document entrusting the governance of \
[station_name()] and surrounding space to Captain [uname]."
-
+ feedback_set_details("station_renames","[station_name()]")
if(!unlimited_uses)
used = TRUE
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/items/weapons/twohanded.dm b/code/game/objects/items/weapons/twohanded.dm
index 0b36647b986..002c7773b47 100644
--- a/code/game/objects/items/weapons/twohanded.dm
+++ b/code/game/objects/items/weapons/twohanded.dm
@@ -106,6 +106,8 @@
/obj/item/weapon/twohanded/equip_to_best_slot(mob/M)
if(..())
+ if(istype(src, /obj/item/weapon/twohanded/required))
+ return // unwield forces twohanded-required items to be dropped.
unwield(M)
return
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/minerals.dm b/code/game/turfs/simulated/minerals.dm
index ba84d0ff113..d418c0a48a5 100644
--- a/code/game/turfs/simulated/minerals.dm
+++ b/code/game/turfs/simulated/minerals.dm
@@ -44,7 +44,6 @@
/turf/closed/mineral/attackby(obj/item/weapon/pickaxe/P, mob/user, params)
-
if (!user.IsAdvancedToolUser())
to_chat(usr, "You don't have the dexterity to do this!")
return
@@ -67,18 +66,16 @@
feedback_add_details("pick_used_mining","[P.type]")
else
return attack_hand(user)
- return
/turf/closed/mineral/proc/gets_drilled()
if (mineralType && (src.mineralAmt > 0) && (src.mineralAmt < 11))
var/i
- for (i=0;i= 2)
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..6c1e2743cd5 100644
--- a/code/game/turfs/space/space.dm
+++ b/code/game/turfs/space/space.dm
@@ -12,7 +12,7 @@
var/destination_x
var/destination_y
- var/global/datum/gas_mixture/space/space_gas = new
+ var/global/datum/gas_mixture/immutable/space/space_gas = new
plane = PLANE_SPACE
light_power = 0.25
dynamic_lighting = DYNAMIC_LIGHTING_DISABLED
@@ -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/atmospherics/environmental/LINDA_turf_tile.dm b/code/modules/atmospherics/environmental/LINDA_turf_tile.dm
index f78f1724d8b..7e9df7d22ce 100644
--- a/code/modules/atmospherics/environmental/LINDA_turf_tile.dm
+++ b/code/modules/atmospherics/environmental/LINDA_turf_tile.dm
@@ -322,10 +322,10 @@
for(var/t in turf_list)
var/turf/open/T = t
- if (space_is_all_consuming && !space_in_group && istype(T.air, /datum/gas_mixture/space))
+ if (space_is_all_consuming && !space_in_group && istype(T.air, /datum/gas_mixture/immutable/space))
space_in_group = 1
qdel(A)
- A = new/datum/gas_mixture/space()
+ A = new/datum/gas_mixture/immutable/space()
A.merge(T.air)
for(var/id in A_gases)
diff --git a/code/modules/atmospherics/gasmixtures/immutable_mixtures.dm b/code/modules/atmospherics/gasmixtures/immutable_mixtures.dm
new file mode 100644
index 00000000000..7dc112434f6
--- /dev/null
+++ b/code/modules/atmospherics/gasmixtures/immutable_mixtures.dm
@@ -0,0 +1,81 @@
+//"immutable" gas mixture used for immutable calculations
+//it can be changed, but any changes will ultimately be undone before they can have any effect
+
+/datum/gas_mixture/immutable
+ var/initial_temperature
+
+/datum/gas_mixture/immutable/proc/reset_gas_mix()
+ temperature = initial_temperature
+ temperature_archived = initial_temperature
+
+/datum/gas_mixture/immutable/New()
+ ..()
+ reset_gas_mix()
+
+/datum/gas_mixture/immutable/garbage_collect()
+ reset_gas_mix()
+
+/datum/gas_mixture/immutable/archive()
+ return 1 //nothing changes, so we do nothing and the archive is successful
+
+/datum/gas_mixture/immutable/merge()
+ return 0 //we're immutable.
+
+/datum/gas_mixture/immutable/heat_capacity_archived()
+ return heat_capacity()
+
+/datum/gas_mixture/immutable/share(datum/gas_mixture/sharer, atmos_adjacent_turfs = 4)
+ . = ..(sharer, 0)
+ reset_gas_mix()
+
+/datum/gas_mixture/immutable/after_share()
+ temperature = initial_temperature
+ reset_gas_mix()
+
+/datum/gas_mixture/immutable/react()
+ return 0 //we're immutable.
+
+/datum/gas_mixture/immutable/copy()
+ return new type //we're immutable, so we can just return a new instance.
+
+/datum/gas_mixture/immutable/copy_from()
+ return 0 //we're immutable.
+
+/datum/gas_mixture/immutable/copy_from_turf()
+ return 0 //we're immutable.
+
+/datum/gas_mixture/immutable/parse_gas_string()
+ return 0 //we're immutable.
+
+/datum/gas_mixture/immutable/temperature_share(datum/gas_mixture/sharer, conduction_coefficient, sharer_temperature, sharer_heat_capacity)
+ . = ..()
+ temperature = initial_temperature
+
+//used by space tiles
+/datum/gas_mixture/immutable/space
+ initial_temperature = TCMB
+
+/datum/gas_mixture/immutable/space/garbage_collect()
+ gases.Cut() //clever way of ensuring we always are empty.
+
+/datum/gas_mixture/immutable/space/heat_capacity()
+ return 7000
+
+/datum/gas_mixture/immutable/space/remove()
+ return copy() //we're always empty, so we can just return a copy.
+
+/datum/gas_mixture/immutable/space/remove_ratio()
+ return copy() //we're always empty, so we can just return a copy.
+
+
+//used by cloners
+/datum/gas_mixture/immutable/cloner
+ initial_temperature = T20C
+
+/datum/gas_mixture/immutable/cloner/reset_gas_mix()
+ assert_gas("n2")
+ gases["n2"][MOLES] = MOLES_O2STANDARD + MOLES_N2STANDARD
+ ..()
+
+/datum/gas_mixture/immutable/cloner/heat_capacity()
+ return (MOLES_O2STANDARD + MOLES_N2STANDARD)*20 //specific heat of nitrogen is 20
diff --git a/code/modules/atmospherics/gasmixtures/space_mixture.dm b/code/modules/atmospherics/gasmixtures/space_mixture.dm
deleted file mode 100644
index 5b590e4626a..00000000000
--- a/code/modules/atmospherics/gasmixtures/space_mixture.dm
+++ /dev/null
@@ -1,58 +0,0 @@
-//"immutable" gas mixture used for space calculations
-//it can be changed, but any changes will ultimately be undone before they can have any effect
-
-/datum/gas_mixture/space
-
-/datum/gas_mixture/space/New()
- ..()
- temperature = TCMB
- temperature_archived = TCMB
-
-/datum/gas_mixture/space/garbage_collect()
- gases.Cut() //clever way of ensuring we always are empty.
-
-/datum/gas_mixture/space/archive()
- return 1 //nothing changes, so we do nothing and the archive is successful
-
-/datum/gas_mixture/space/merge()
- return 0 //we're immutable.
-
-/datum/gas_mixture/space/heat_capacity()
- . = 7000
-
-/datum/gas_mixture/space/heat_capacity_archived()
- . = heat_capacity()
-
-/datum/gas_mixture/space/remove()
- return copy() //we're immutable, so we can just return a copy.
-
-/datum/gas_mixture/space/remove_ratio()
- return copy() //we're immutable, so we can just return a copy.
-
-/datum/gas_mixture/space/share(datum/gas_mixture/sharer, atmos_adjacent_turfs = 4)
- . = ..(sharer, 0)
- temperature = TCMB
- gases.Cut()
-
-/datum/gas_mixture/space/after_share()
- temperature = TCMB
- gases.Cut()
-
-/datum/gas_mixture/space/react()
- return 0 //we're immutable.
-
-/datum/gas_mixture/space/copy()
- return new /datum/gas_mixture/space //we're immutable, so we can just return a new instance.
-
-/datum/gas_mixture/space/copy_from()
- return 0 //we're immutable.
-
-/datum/gas_mixture/space/copy_from_turf()
- return 0 //we're immutable.
-
-/datum/gas_mixture/space/parse_gas_string()
- return 0 //we're immutable.
-
-/datum/gas_mixture/space/temperature_share(datum/gas_mixture/sharer, conduction_coefficient, sharer_temperature, sharer_heat_capacity)
- . = ..()
- temperature = TCMB
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/events/spacevine.dm b/code/modules/events/spacevine.dm
index 0e71965f892..a80147ccc73 100644
--- a/code/modules/events/spacevine.dm
+++ b/code/modules/events/spacevine.dm
@@ -422,7 +422,7 @@
var/list/growth_queue
var/spread_multiplier = 5
var/spread_cap = 30
- var/list/sv_mutations_list
+ var/list/vine_mutations_list
var/mutativeness = 1
/datum/spacevine_controller/New(turf/location, list/muts, potency, production)
@@ -430,8 +430,8 @@
START_PROCESSING(SSobj, src)
vines = list()
growth_queue = list()
- sv_mutations_list = list()
- init_subtypes(/datum/spacevine_mutation, sv_mutations_list)
+ vine_mutations_list = list()
+ init_subtypes(/datum/spacevine_mutation/, vine_mutations_list)
if(potency != null)
mutativeness = potency / 10
if(production != null)
@@ -473,7 +473,7 @@
var/parentcolor = parent.atom_colours[FIXED_COLOUR_PRIORITY]
SV.add_atom_colour(parentcolor, FIXED_COLOUR_PRIORITY)
if(prob(mutativeness))
- var/datum/spacevine_mutation/randmut = pick(sv_mutations_list - SV.mutations)
+ var/datum/spacevine_mutation/randmut = pick(vine_mutations_list - SV.mutations)
randmut.add_mutation_to_vinepiece(SV)
for(var/datum/spacevine_mutation/SM in SV.mutations)
diff --git a/code/modules/events/wizard/rpgloot.dm b/code/modules/events/wizard/rpgloot.dm
index d651400baa0..98ae7ba6aa5 100644
--- a/code/modules/events/wizard/rpgloot.dm
+++ b/code/modules/events/wizard/rpgloot.dm
@@ -6,27 +6,10 @@
earliest_start = 0
/datum/round_event/wizard/rpgloot/start()
- var/list/prefixespositive = list("greater", "major", "blessed", "superior", "enpowered", "honed", "true", "glorious", "robust")
- var/list/prefixesnegative = list("lesser", "minor", "blighted", "inferior", "enfeebled", "rusted", "unsteady", "tragic", "gimped")
- var/list/suffixes = list("orc slaying", "elf slaying", "corgi slaying", "strength", "dexterity", "constitution", "intelligence", "wisdom", "charisma", "the forest", "the hills", "the plains", "the sea", "the sun", "the moon", "the void", "the world", "the fool", "many secrets", "many tales", "many colors", "rending", "sundering", "the night", "the day")
- var/upgrade_scroll_chance = 0
+ var/upgrade_scroll_chance = 0
for(var/obj/item/I in world)
- if(istype(I,/obj/item/organ/))
- continue
- var/quality = pick(1;15, 2;14, 2;13, 2;12, 3;11, 3;10, 3;9, 4;8, 4;7, 4;6, 5;5, 5;4, 5;3, 6;2, 6;1, 6;0)
- if(prob(50))
- quality = -quality
- if(quality > 0)
- I.name = "[pick(prefixespositive)] [I.name] of [pick(suffixes)] +[quality]"
- else if(quality < 0)
- I.name = "[pick(prefixesnegative)] [I.name] of [pick(suffixes)] [quality]"
- else
- I.name = "[I.name] of [pick(suffixes)]"
-
- I.force = max(0,I.force + quality)
- I.throwforce = max(0,I.throwforce + quality)
- for(var/value in I.armor)
- I.armor[value] += quality
+ if(!istype(I.rpg_loot))
+ I.rpg_loot = new(I)
if(istype(I,/obj/item/weapon/storage))
var/obj/item/weapon/storage/S = I
@@ -36,28 +19,97 @@
upgrade_scroll_chance = max(0,upgrade_scroll_chance-100)
upgrade_scroll_chance += 25
+ GLOB.rpg_loot_items = TRUE
+
/obj/item/upgradescroll
- name = "Item Fortification Scroll"
+ name = "item fortification scroll"
desc = "Somehow, this piece of paper can be applied to items to make them \"better\". Apparently there's a risk of losing the item if it's already \"too good\". This all feels so arbitrary..."
icon = 'icons/obj/wizard.dmi'
icon_state = "scroll"
w_class = WEIGHT_CLASS_TINY
+ var/upgrade_amount = 1
+ var/can_backfire = TRUE
+ var/one_use = TRUE
+
/obj/item/upgradescroll/afterattack(obj/item/target, mob/user , proximity)
if(!proximity || !istype(target))
return
- var/quality = target.force - initial(target.force)
- if(quality > 9 && prob((quality - 9)*10))
- to_chat(user, "[target] catches fire!")
- if(target.resistance_flags & (LAVA_PROOF|FIRE_PROOF))
- target.resistance_flags &= ~(LAVA_PROOF|FIRE_PROOF)
- target.resistance_flags |= FLAMMABLE
- target.fire_act()
+
+ var/datum/rpg_loot/rpg_loot_datum = target.rpg_loot
+ if(!istype(rpg_loot_datum))
+ rpg_loot_datum = new /datum/rpg_loot(target)
+
+ var/quality = rpg_loot_datum.quality
+
+ if(can_backfire && (quality > 9 && prob((quality - 9)*10)))
+ to_chat(user, "[target] violently glows blue for a while, then evaporates.")
+ target.burn()
+ else
+ to_chat(user, "[target] glows blue and seems vaguely \"better\"!")
+ rpg_loot_datum.modify(upgrade_amount)
+
+ if(one_use)
qdel(src)
- return
- target.force += 1
- target.throwforce += 1
- for(var/value in target.armor)
- target.armor[value] += 1
- to_chat(user, "[target] glows blue and seems vaguely \"better\"!")
- qdel(src)
+
+/obj/item/upgradescroll/unlimited
+ name = "unlimited foolproof item fortification scroll"
+ desc = "Somehow, this piece of paper can be applied to items to make them \"better\". This scroll is made from the tongues of dead paper wizards, and can be used an unlimited number of times, with no drawbacks."
+ one_use = FALSE
+ can_backfire = FALSE
+
+/datum/rpg_loot
+ var/positive_prefix = "okay"
+ var/negative_prefix = "weak"
+ var/suffix = "something profound"
+ var/quality = 0
+
+ var/obj/item/attached
+ var/original_name
+
+/datum/rpg_loot/New(attached_item=null)
+ attached = attached_item
+
+ randomise()
+
+/datum/rpg_loot/Destroy()
+ attached = null
+
+/datum/rpg_loot/proc/randomise()
+ var/static/list/prefixespositive = list("greater", "major", "blessed", "superior", "enpowered", "honed", "true", "glorious", "robust")
+ var/static/list/prefixesnegative = list("lesser", "minor", "blighted", "inferior", "enfeebled", "rusted", "unsteady", "tragic", "gimped")
+ var/static/list/suffixes = list("orc slaying", "elf slaying", "corgi slaying", "strength", "dexterity", "constitution", "intelligence", "wisdom", "charisma", "the forest", "the hills", "the plains", "the sea", "the sun", "the moon", "the void", "the world", "the fool", "many secrets", "many tales", "many colors", "rending", "sundering", "the night", "the day")
+
+ var/new_quality = pick(1;15, 2;14, 2;13, 2;12, 3;11, 3;10, 3;9, 4;8, 4;7, 4;6, 5;5, 5;4, 5;3, 6;2, 6;1, 6;0)
+
+ suffix = pick(suffixes)
+ positive_prefix = pick(prefixespositive)
+ negative_prefix = pick(prefixesnegative)
+
+ if(prob(50))
+ new_quality = -new_quality
+
+ modify(new_quality)
+
+/datum/rpg_loot/proc/rename()
+ var/obj/item/I = attached
+ if(!original_name)
+ original_name = I.name
+ if(quality < 0)
+ I.name = "[negative_prefix] [original_name] of [suffix] [quality]"
+ else if(quality == 0)
+ I.name = "[original_name] of [suffix]"
+ else if(quality > 0)
+ I.name = "[positive_prefix] [original_name] of [suffix] +[quality]"
+
+/datum/rpg_loot/proc/modify(quality_mod)
+ var/obj/item/I = attached
+ quality += quality_mod
+
+ I.force = max(0,I.force + quality_mod)
+ I.throwforce = max(0,I.throwforce + quality_mod)
+
+ for(var/value in I.armor)
+ I.armor[value] += quality
+
+ rename()
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/lighting/lighting_object.dm b/code/modules/lighting/lighting_object.dm
index 2dfcd0e1034..369129fc578 100644
--- a/code/modules/lighting/lighting_object.dm
+++ b/code/modules/lighting/lighting_object.dm
@@ -133,6 +133,10 @@ GLOBAL_LIST_EMPTY(all_lighting_objects) // Global list of lighting objects.
/atom/movable/lighting_object/blob_act()
return
+// Nope nope nope!
+/atom/movable/lighting_object/onShuttleMove(turf/T1, rotation)
+ return FALSE
+
// Override here to prevent things accidentally moving around overlays.
/atom/movable/lighting_object/forceMove(atom/destination, var/no_tp=FALSE, var/harderforce = FALSE)
if(harderforce)
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/mining/equipment.dm b/code/modules/mining/equipment.dm
index 2b10ab05531..02a752c2d76 100644
--- a/code/modules/mining/equipment.dm
+++ b/code/modules/mining/equipment.dm
@@ -68,7 +68,7 @@
/obj/item/device/wormhole_jaunter/attack_self(mob/user)
user.visible_message("[user.name] activates the [src.name]!")
- feedback_add_details("jaunter", "U") // user activated
+ feedback_add_details("jaunter", "User") // user activated
activate(user)
/obj/item/device/wormhole_jaunter/proc/turf_check(mob/user)
@@ -124,13 +124,13 @@
if(triggered)
usr.visible_message("The [src] overloads and activates!")
- feedback_add_details("jaunter","E") // EMP accidental activation
+ feedback_add_details("jaunter","EMP") // EMP accidental activation
activate(usr)
/obj/item/device/wormhole_jaunter/proc/chasm_react(mob/user)
if(user.get_item_by_slot(slot_belt) == src)
to_chat(user, "Your [src] activates, saving you from the chasm!")
- feedback_add_details("jaunter","C") // chasm automatic activation
+ feedback_add_details("jaunter","Chasm") // chasm automatic activation
activate(user)
else
to_chat(user, "The [src] is not attached to your belt, preventing it from saving you from the chasm. RIP.")
diff --git a/code/modules/mining/lavaland/necropolis_chests.dm b/code/modules/mining/lavaland/necropolis_chests.dm
index 630359d402b..92a764d10cc 100644
--- a/code/modules/mining/lavaland/necropolis_chests.dm
+++ b/code/modules/mining/lavaland/necropolis_chests.dm
@@ -87,7 +87,7 @@
user.sight |= SEE_MOBS
icon_state = "lantern"
wisp.orbit(user, 20)
- feedback_add_details("wisp_lantern","F") // freed
+ feedback_add_details("wisp_lantern","Freed") // freed
else
to_chat(user, "You return the wisp to the lantern.")
@@ -102,7 +102,7 @@
wisp.stop_orbit()
wisp.loc = src
icon_state = "lantern-blue"
- feedback_add_details("wisp_lantern","R") // returned
+ feedback_add_details("wisp_lantern","Returned") // returned
/obj/item/device/wisp_lantern/Initialize()
..()
@@ -229,7 +229,7 @@
/obj/item/device/immortality_talisman/attack_self(mob/user)
if(cooldown < world.time)
- feedback_add_details("immortality_talisman","U") // usage
+ feedback_add_details("immortality_talisman","Activated") // usage
cooldown = world.time + 600
user.visible_message("[user] vanishes from reality, leaving a a hole in [user.p_their()] place!")
var/obj/effect/immortality_talisman/Z = new(get_turf(src.loc))
diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm
index a003c8cf174..7b604bc3699 100644
--- a/code/modules/mob/living/carbon/human/human.dm
+++ b/code/modules/mob/living/carbon/human/human.dm
@@ -920,18 +920,14 @@
return
if(!riding_datum)
riding_datum = new /datum/riding/human(src)
- if(buckled_mobs && ((M in buckled_mobs) || (buckled_mobs.len >= max_buckled_mobs)))
- return
- if(buckled) //NO INFINITE STACKING!!
- return
- if(M.stat != CONSCIOUS)
+ if(buckled_mobs && ((M in buckled_mobs) || (buckled_mobs.len >= max_buckled_mobs)) || buckled || (M.stat != CONSCIOUS))
return
if(iscarbon(M))
if(M.incapacitated(FALSE, TRUE) || incapacitated(FALSE, TRUE))
- M.visible_message("[M] can't hang onto [src]!")
+ M.visible_message("[M] can't hang onto [src]!")
return
if(!riding_datum.equip_buckle_inhands(M, 2)) //MAKE SURE THIS IS LAST!!
- M.visible_message("[M] can't climb onto [src] because [M.p_their()] hands are full!")
+ M.visible_message("[M] can't climb onto [src]!")
return
. = ..(M, force, check_loc)
stop_pulling()
diff --git a/code/modules/mob/living/carbon/human/inventory.dm b/code/modules/mob/living/carbon/human/inventory.dm
index 091800d46a1..101b06849b0 100644
--- a/code/modules/mob/living/carbon/human/inventory.dm
+++ b/code/modules/mob/living/carbon/human/inventory.dm
@@ -141,7 +141,7 @@
return not_handled //For future deeper overrides
-/mob/living/carbon/human/doUnEquip(obj/item/I, force, newloc, no_move, invdrop)
+/mob/living/carbon/human/doUnEquip(obj/item/I, force, newloc, no_move, invdrop = TRUE)
. = ..() //See mob.dm for an explanation on this and some rage about people copypasting instead of calling ..() like they should.
if(!. || !I)
return
diff --git a/code/modules/mob/living/carbon/human/species.dm b/code/modules/mob/living/carbon/human/species.dm
index 6cd9e2e7f3b..3eea0ea8e00 100644
--- a/code/modules/mob/living/carbon/human/species.dm
+++ b/code/modules/mob/living/carbon/human/species.dm
@@ -111,6 +111,12 @@
var/obj/item/thing = C.get_item_by_slot(slot_id)
if(thing && (!thing.species_exception || !is_type_in_list(src,thing.species_exception)))
C.dropItemToGround(thing)
+
+ // this needs to be FIRST because qdel calls update_body which checks if we have DIGITIGRADE legs or not and if not then removes DIGITIGRADE from species_traits
+ if(("legs" in C.dna.species.mutant_bodyparts) && C.dna.features["legs"] == "Digitigrade Legs")
+ species_traits += DIGITIGRADE
+ if(DIGITIGRADE in species_traits)
+ C.Digitigrade_Leg_Swap(FALSE)
var/obj/item/organ/heart/heart = C.getorganslot("heart")
var/obj/item/organ/lungs/lungs = C.getorganslot("lungs")
@@ -152,10 +158,6 @@
if(exotic_bloodtype && C.dna.blood_type != exotic_bloodtype)
C.dna.blood_type = exotic_bloodtype
- if(("legs" in C.dna.species.mutant_bodyparts) && C.dna.features["legs"] == "Digitigrade Legs")
- species_traits += DIGITIGRADE
- if(DIGITIGRADE in species_traits)
- C.Digitigrade_Leg_Swap(FALSE)
/datum/species/proc/on_species_loss(mob/living/carbon/C)
if(C.dna.species.exotic_bloodtype)
diff --git a/code/modules/mob/living/carbon/monkey/combat.dm b/code/modules/mob/living/carbon/monkey/combat.dm
index 7eed766eaab..c6c50252d75 100644
--- a/code/modules/mob/living/carbon/monkey/combat.dm
+++ b/code/modules/mob/living/carbon/monkey/combat.dm
@@ -132,6 +132,10 @@
return 0
/mob/living/carbon/monkey/proc/handle_combat()
+ // Don't do any AI if inside another mob (devoured)
+ if (ismob(loc))
+ // Really no idea what needs to be returned but everything else is TRUE
+ return TRUE
if(on_fire || buckled || restrained())
if(!resisting && prob(MONKEY_RESIST_PROB))
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/mob/living/simple_animal/guardian/guardian.dm b/code/modules/mob/living/simple_animal/guardian/guardian.dm
index 1eec40c264f..e49e4120478 100644
--- a/code/modules/mob/living/simple_animal/guardian/guardian.dm
+++ b/code/modules/mob/living/simple_animal/guardian/guardian.dm
@@ -338,7 +338,7 @@ GLOBAL_LIST_EMPTY(parasites) //all currently existing/living guardians
to_chat(src, "You don't have another mode!")
/mob/living/simple_animal/hostile/guardian/proc/ToggleLight()
- if(!luminosity)
+ if(light_range<3)
to_chat(src, "You activate your light.")
set_light(3)
else
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/power/singularity/emitter.dm b/code/modules/power/singularity/emitter.dm
index 4947715b318..7aa09e8edfc 100644
--- a/code/modules/power/singularity/emitter.dm
+++ b/code/modules/power/singularity/emitter.dm
@@ -1,5 +1,3 @@
-
-
/obj/machinery/power/emitter
name = "Emitter"
desc = "A heavy duty industrial laser.\nAlt-click to rotate it clockwise."
@@ -9,6 +7,11 @@
anchored = 0
density = 1
req_access = list(GLOB.access_engine_equip)
+
+ // The following 3 vars are mostly for the prototype
+ var/manual = FALSE
+ var/charge = 0
+ var/atom/target = null
use_power = 0
idle_power_usage = 10
@@ -174,9 +177,11 @@
investigate_log("lost power and turned off at [get_area(src)]","singulo")
log_game("Emitter lost power in ([x],[y],[z])")
return
- if(!check_delay())
+ if(charge <=80)
+ charge+=5
+ if(!check_delay() || manual == TRUE)
return FALSE
- fire_beam()
+ fire_beam(target)
/obj/machinery/power/emitter/proc/check_delay()
if((src.last_shot + src.fire_delay) <= world.time)
@@ -192,34 +197,62 @@
add_load(active_power_usage)
fire_beam()
-/obj/machinery/power/emitter/proc/fire_beam()
- src.last_shot = world.time
- if(src.shot_number < 3)
- src.fire_delay = 20
- src.shot_number ++
- else
- src.fire_delay = rand(minimum_fire_delay,maximum_fire_delay)
- src.shot_number = 0
- var/obj/item/projectile/A = new projectile_type(src.loc)
- A.setDir(src.dir)
- playsound(src.loc, projectile_sound, 25, 1)
+/obj/machinery/power/emitter/proc/fire_beam(atom/targeted_atom, mob/user)
+ var/turf/targets_from = get_turf(src)
+ if(targeted_atom == user|| targeted_atom == targets_from)
+ return
+ var/obj/item/projectile/P = new projectile_type(targets_from)
+ playsound(src.loc, projectile_sound, 50, 1)
if(prob(35))
sparks.start()
switch(dir)
if(NORTH)
- A.yo = 20
- A.xo = 0
+ P.yo = 20
+ P.xo = 0
+ if(NORTHEAST)
+ P.yo = 20
+ P.xo = 20
if(EAST)
- A.yo = 0
- A.xo = 20
+ P.yo = 0
+ P.xo = 20
+ if(SOUTHEAST)
+ P.yo = -20
+ P.xo = 20
if(WEST)
- A.yo = 0
- A.xo = -20
+ P.yo = 0
+ P.xo = -20
+ if(SOUTHWEST)
+ P.yo = -20
+ P.xo = -20
+ if(NORTHWEST)
+ P.yo = 20
+ P.xo = -20
else // Any other
- A.yo = -20
- A.xo = 0
- A.starting = loc
- A.fire()
+ P.yo = -20
+ P.xo = 0
+ if(target)
+ P.yo = targeted_atom.y - targets_from.y
+ P.xo = targeted_atom.x - targets_from.x
+ P.current = targets_from
+ P.starting = targets_from
+ P.firer = src
+ P.original = targeted_atom
+ if(!manual)
+ last_shot = world.time
+ if(shot_number < 3)
+ fire_delay = 20
+ shot_number ++
+ else
+ fire_delay = rand(minimum_fire_delay,maximum_fire_delay)
+ shot_number = 0
+ if(!target)
+ P.setDir(src.dir)
+ P.starting = loc
+ else
+ if(QDELETED(target))
+ target = null
+ P.fire()
+ return P
/obj/machinery/power/emitter/can_be_unfasten_wrench(mob/user, silent)
if(state == EM_WELDED)
@@ -312,3 +345,148 @@
emagged = 1
if(user)
user.visible_message("[user.name] emags the [src.name].","You short out the lock.")
+
+
+/obj/machinery/power/emitter/prototype
+ name = "Prototype Emitter"
+ icon = 'icons/obj/turrets.dmi'
+ icon_state = "protoemitter"
+ icon_state_on = "protoemitter_+a"
+ can_buckle = TRUE
+ buckle_lying = 0
+ var/view_range = 12
+ var/datum/action/innate/protoemitter/firing/auto
+
+//BUCKLE HOOKS
+
+/obj/machinery/power/emitter/prototype/unbuckle_mob(mob/living/buckled_mob,force = 0)
+ playsound(src,'sound/mecha/mechmove01.ogg', 50, 1)
+ manual = FALSE
+ for(var/obj/item/I in buckled_mob.held_items)
+ if(istype(I, /obj/item/weapon/turret_control))
+ qdel(I)
+ if(istype(buckled_mob))
+ buckled_mob.pixel_x = 0
+ buckled_mob.pixel_y = 0
+ if(buckled_mob.client)
+ buckled_mob.client.change_view(world.view)
+ auto.Remove(buckled_mob)
+ . = ..()
+
+/obj/machinery/power/emitter/prototype/user_buckle_mob(mob/living/M, mob/living/carbon/user)
+ if(user.incapacitated() || !istype(user))
+ return
+ for(var/atom/movable/A in get_turf(src))
+ if(A.density && (A != src && A != M))
+ return
+ M.forceMove(get_turf(src))
+ ..()
+ playsound(src,'sound/mecha/mechmove01.ogg', 50, 1)
+ M.pixel_y = 14
+ layer = 4.1
+ if(M.client)
+ M.client.change_view(view_range)
+ if(!auto)
+ auto = new()
+ auto.Grant(M, src)
+
+/datum/action/innate/protoemitter
+ check_flags = AB_CHECK_RESTRAINED | AB_CHECK_STUNNED | AB_CHECK_CONSCIOUS
+ var/obj/machinery/power/emitter/prototype/PE
+ var/mob/living/carbon/U
+
+
+/datum/action/innate/protoemitter/Grant(mob/living/carbon/L, obj/machinery/power/emitter/prototype/proto)
+ PE = proto
+ U = L
+ . = ..()
+
+/datum/action/innate/protoemitter/firing
+ name = "Switch to Manual Firing"
+ desc = "The emitter will only fire on your command and at your designated target"
+ button_icon_state = "mech_zoom_on"
+
+/datum/action/innate/protoemitter/firing/Activate()
+ if(PE.manual)
+ playsound(PE,'sound/mecha/mechmove01.ogg', 50, 1)
+ PE.manual = FALSE
+ name = "Switch to Manual Firing"
+ desc = "The emitter will only fire on your command and at your designated target"
+ button_icon_state = "mech_zoom_on"
+ for(var/obj/item/I in U.held_items)
+ if(istype(I, /obj/item/weapon/turret_control))
+ qdel(I)
+ UpdateButtonIcon()
+ return
+ else
+ playsound(PE,'sound/mecha/mechmove01.ogg', 50, 1)
+ name = "Switch to Automatic Firing"
+ desc = "Emitters will switch to periodic firing at your last target"
+ button_icon_state = "mech_zoom_off"
+ PE.manual = TRUE
+ for(var/V in U.held_items)
+ var/obj/item/I = V
+ if(istype(I))
+ if(U.dropItemToGround(I))
+ var/obj/item/weapon/turret_control/TC = new /obj/item/weapon/turret_control()
+ U.put_in_hands(TC)
+ else //Entries in the list should only ever be items or null, so if it's not an item, we can assume it's an empty hand
+ var/obj/item/weapon/turret_control/TC = new /obj/item/weapon/turret_control()
+ U.put_in_hands(TC)
+ UpdateButtonIcon()
+
+
+/obj/item/weapon/turret_control
+ name = "turret controls"
+ icon_state = "offhand"
+ w_class = WEIGHT_CLASS_HUGE
+ flags = ABSTRACT | NODROP
+ resistance_flags = FIRE_PROOF | UNACIDABLE | ACID_PROOF | NOBLUDGEON
+ var/delay = 0
+
+/obj/item/weapon/turret_control/afterattack(atom/targeted_atom, mob/user)
+ ..()
+ var/obj/machinery/power/emitter/E = user.buckled
+ E.setDir(get_dir(E,targeted_atom))
+ user.setDir(E.dir)
+ switch(E.dir)
+ if(NORTH)
+ E.layer = 3.9
+ user.pixel_x = 0
+ user.pixel_y = -14
+ if(NORTHEAST)
+ E.layer = 3.9
+ user.pixel_x = -8
+ user.pixel_y = -12
+ if(EAST)
+ E.layer = 4.1
+ user.pixel_x = -14
+ user.pixel_y = 0
+ if(SOUTHEAST)
+ E.layer = 3.9
+ user.pixel_x = -8
+ user.pixel_y = 12
+ if(SOUTH)
+ E.layer = 4.1
+ user.pixel_x = 0
+ user.pixel_y = 14
+ if(SOUTHWEST)
+ E.layer = 3.9
+ user.pixel_x = 8
+ user.pixel_y = 12
+ if(WEST)
+ E.layer = 4.1
+ user.pixel_x = 14
+ user.pixel_y = 0
+ if(NORTHWEST)
+ E.layer = 3.9
+ user.pixel_x = 8
+ user.pixel_y = -12
+
+ if(E.charge >= 10 && world.time > delay)
+ E.charge -= 10
+ E.target = targeted_atom
+ E.fire_beam(targeted_atom, user)
+ delay = world.time + 10
+ else if (E.charge < 10)
+ playsound(get_turf(user),'sound/machines/buzz-sigh.ogg', 50, 1)
diff --git a/code/modules/projectiles/pins.dm b/code/modules/projectiles/pins.dm
index 907082cc8b7..2347cc3c7c1 100644
--- a/code/modules/projectiles/pins.dm
+++ b/code/modules/projectiles/pins.dm
@@ -95,9 +95,8 @@
var/obj/item/weapon/implant/req_implant = null
/obj/item/device/firing_pin/implant/pin_auth(mob/living/user)
- if(iscarbon(user))
- var/mob/living/carbon/C = user
- for(var/obj/item/weapon/implant/I in C.implants)
+ if(istype(user))
+ for(var/obj/item/weapon/implant/I in user.implants)
if(req_implant && I.type == req_implant)
return 1
return 0
diff --git a/code/modules/reagents/chemistry/recipes/slime_extracts.dm b/code/modules/reagents/chemistry/recipes/slime_extracts.dm
index 7246a26ce5c..f270fa567fa 100644
--- a/code/modules/reagents/chemistry/recipes/slime_extracts.dm
+++ b/code/modules/reagents/chemistry/recipes/slime_extracts.dm
@@ -1,8 +1,11 @@
/datum/chemical_reaction/slime
+ var/deletes_extract = TRUE
/datum/chemical_reaction/slime/on_reaction(datum/reagents/holder)
- delete_extract(holder)
+ feedback_add_details("slime_cores_used","[type]")
+ if(deletes_extract)
+ delete_extract(holder)
/datum/chemical_reaction/slime/proc/delete_extract(datum/reagents/holder)
var/obj/item/slime_extract/M = holder.my_atom
@@ -19,12 +22,9 @@
required_other = 1
/datum/chemical_reaction/slime/slimespawn/on_reaction(datum/reagents/holder)
- feedback_add_details("slime_cores_used","[type]")
var/mob/living/simple_animal/slime/S
S = new(get_turf(holder.my_atom), "grey")
- S.visible_message("Infused with plasma, the \
- core begins to quiver and grow, and soon a new baby slime \
- emerges from it!")
+ S.visible_message("Infused with plasma, the core begins to quiver and grow, and a new baby slime emerges from it!")
..()
/datum/chemical_reaction/slime/slimeinaprov
@@ -35,10 +35,6 @@
required_other = 1
required_container = /obj/item/slime_extract/grey
-/datum/chemical_reaction/slime/slimeinaprov/on_reaction(datum/reagents/holder)
- feedback_add_details("slime_cores_used","[type]")
- ..()
-
/datum/chemical_reaction/slime/slimemonkey
name = "Slime Monkey"
id = "m_monkey"
@@ -47,10 +43,8 @@
required_other = 1
/datum/chemical_reaction/slime/slimemonkey/on_reaction(datum/reagents/holder)
- feedback_add_details("slime_cores_used","[type]")
- for(var/i = 1, i <= 3, i++)
- var /obj/item/weapon/reagent_containers/food/snacks/monkeycube/M = new /obj/item/weapon/reagent_containers/food/snacks/monkeycube
- M.loc = get_turf(holder.my_atom)
+ for(var/i in 1 to 3)
+ new /obj/item/weapon/reagent_containers/food/snacks/monkeycube(get_turf(holder.my_atom))
..()
//Green
@@ -62,10 +56,6 @@
required_other = 1
required_container = /obj/item/slime_extract/green
-/datum/chemical_reaction/slime/slimemutate/on_reaction(datum/reagents/holder)
- feedback_add_details("slime_cores_used","[type]")
- ..()
-
//Mutated Green
/datum/chemical_reaction/slime/slimemutate_unstable
name = "Unstable Mutation Toxin"
@@ -76,10 +66,6 @@
required_container = /obj/item/slime_extract/green
mix_message = "The mixture rapidly expands and contracts, its appearance shifting into a sickening green."
-/datum/chemical_reaction/slime/slimemutate_unstable/on_reaction(datum/reagents/holder)
- feedback_add_details("slime_cores_used","[type]")
- ..()
-
//Metal
/datum/chemical_reaction/slime/slimemetal
name = "Slime Metal"
@@ -89,10 +75,9 @@
required_other = 1
/datum/chemical_reaction/slime/slimemetal/on_reaction(datum/reagents/holder)
- feedback_add_details("slime_cores_used","[type]")
var/turf/location = get_turf(holder.my_atom)
- new /obj/item/stack/sheet/plasteel (location, 5)
- new /obj/item/stack/sheet/metal (location, 15)
+ new /obj/item/stack/sheet/plasteel(location, 5)
+ new /obj/item/stack/sheet/metal(location, 15)
..()
/datum/chemical_reaction/slime/slimeglass
@@ -103,60 +88,49 @@
required_other = 1
/datum/chemical_reaction/slime/slimeglass/on_reaction(datum/reagents/holder)
- feedback_add_details("slime_cores_used","[type]")
var/turf/location = get_turf(holder.my_atom)
- new /obj/item/stack/sheet/rglass (location, 5)
- new /obj/item/stack/sheet/glass (location, 15)
+ new /obj/item/stack/sheet/rglass(location, 5)
+ new /obj/item/stack/sheet/glass(location, 15)
..()
//Gold
-/datum/chemical_reaction/slime/slimecrit
+/datum/chemical_reaction/slime/slimemobspawn
name = "Slime Crit"
id = "m_tele"
required_reagents = list("plasma" = 1)
required_container = /obj/item/slime_extract/gold
required_other = 1
+ deletes_extract = FALSE //we do delete, but we don't do so instantly
-/datum/chemical_reaction/slime/slimecrit/on_reaction(datum/reagents/holder)
- feedback_add_details("slime_cores_used","[type]")
+/datum/chemical_reaction/slime/slimemobspawn/on_reaction(datum/reagents/holder)
var/turf/T = get_turf(holder.my_atom)
- T.visible_message("The slime extract begins to vibrate violently !")
- addtimer(CALLBACK(src, .proc/chemical_mob_spawn, holder, 5, "Gold Slime"), 50)
+ summon_mobs(T)
var/obj/item/slime_extract/M = holder.my_atom
deltimer(M.qdel_timer)
+ ..()
M.qdel_timer = addtimer(CALLBACK(src, .proc/delete_extract, holder), 55, TIMER_STOPPABLE)
-/datum/chemical_reaction/slime/slimecritlesser
+/datum/chemical_reaction/slime/slimemobspawn/proc/summon_mobs(datum/reagents/holder, turf/T)
+ T.visible_message("The slime extract begins to vibrate violently!")
+ addtimer(CALLBACK(src, .proc/chemical_mob_spawn, holder, 5, "Gold Slime"), 50)
+
+/datum/chemical_reaction/slime/slimemobspawn/lesser
name = "Slime Crit Lesser"
id = "m_tele3"
required_reagents = list("blood" = 1)
- required_container = /obj/item/slime_extract/gold
- required_other = 1
-/datum/chemical_reaction/slime/slimecritlesser/on_reaction(datum/reagents/holder)
- feedback_add_details("slime_cores_used","[type]")
- var/turf/T = get_turf(holder.my_atom)
- T.visible_message("The slime extract begins to vibrate violently !")
+/datum/chemical_reaction/slime/slimemobspawn/lesser/summon_mobs(datum/reagents/holder, turf/T)
+ T.visible_message("The slime extract begins to vibrate violently!")
addtimer(CALLBACK(src, .proc/chemical_mob_spawn, holder, 3, "Lesser Gold Slime", "neutral"), 50)
- var/obj/item/slime_extract/M = holder.my_atom
- deltimer(M.qdel_timer)
- M.qdel_timer = addtimer(CALLBACK(src, .proc/delete_extract, holder), 55, TIMER_STOPPABLE)
-/datum/chemical_reaction/slime/slimecritfriendly
+/datum/chemical_reaction/slime/slimemobspawn/friendly
name = "Slime Crit Friendly"
id = "m_tele5"
required_reagents = list("water" = 1)
- required_container = /obj/item/slime_extract/gold
- required_other = 1
-/datum/chemical_reaction/slime/slimecritfriendly/on_reaction(datum/reagents/holder)
- feedback_add_details("slime_cores_used","[type]")
- var/turf/T = get_turf(holder.my_atom)
- T.visible_message("The slime extract begins to vibrate adorably !")
+/datum/chemical_reaction/slime/slimemobspawn/friendly/summon_mobs(datum/reagents/holder, turf/T)
+ T.visible_message("The slime extract begins to vibrate adorably!")
addtimer(CALLBACK(src, .proc/chemical_mob_spawn, holder, 1, "Friendly Gold Slime", "neutral"), 50)
- var/obj/item/slime_extract/M = holder.my_atom
- deltimer(M.qdel_timer)
- M.qdel_timer = addtimer(CALLBACK(src, .proc/delete_extract, holder), 55, TIMER_STOPPABLE)
//Silver
/datum/chemical_reaction/slime/slimebork
@@ -167,8 +141,24 @@
required_other = 1
/datum/chemical_reaction/slime/slimebork/on_reaction(datum/reagents/holder)
+ //BORK BORK BORK
+ var/list/borks = getborks()
+ var/turf/T = get_turf(holder.my_atom)
- feedback_add_details("slime_cores_used","[type]")
+ playsound(T, 'sound/effects/phasein.ogg', 100, 1)
+
+ for(var/mob/living/carbon/C in viewers(T, null))
+ C.flash_act()
+
+ for(var/i in 1 to 4 + rand(1,2))
+ var/chosen = pick(borks)
+ var/obj/B = new chosen(T)
+ if(prob(50))
+ for(var/j in 1 to rand(1, 3))
+ step(B, pick(NORTH,SOUTH,EAST,WEST))
+ ..()
+
+/datum/chemical_reaction/slime/slimebork/proc/getborks()
var/list/blocked = list(/obj/item/weapon/reagent_containers/food/snacks,
/obj/item/weapon/reagent_containers/food/snacks/store/bread,
/obj/item/weapon/reagent_containers/food/snacks/breadslice,
@@ -188,53 +178,15 @@
)
blocked |= typesof(/obj/item/weapon/reagent_containers/food/snacks/customizable)
- var/list/borks = typesof(/obj/item/weapon/reagent_containers/food/snacks) - blocked
- // BORK BORK BORK
+ return typesof(/obj/item/weapon/reagent_containers/food/snacks) - blocked
- playsound(get_turf(holder.my_atom), 'sound/effects/phasein.ogg', 100, 1)
-
- for(var/mob/living/carbon/C in viewers(get_turf(holder.my_atom), null))
- C.flash_act()
-
- for(var/i = 1, i <= 4 + rand(1,2), i++)
- var/chosen = pick(borks)
- var/obj/B = new chosen
- if(B)
- B.loc = get_turf(holder.my_atom)
- if(prob(50))
- for(var/j = 1, j <= rand(1, 3), j++)
- step(B, pick(NORTH,SOUTH,EAST,WEST))
- ..()
-
-
-/datum/chemical_reaction/slime/slimebork2
+/datum/chemical_reaction/slime/slimebork/drinks
name = "Slime Bork 2"
id = "m_tele4"
required_reagents = list("water" = 1)
- required_container = /obj/item/slime_extract/silver
- required_other = 1
-
-/datum/chemical_reaction/slime/slimebork2/on_reaction(datum/reagents/holder)
-
- feedback_add_details("slime_cores_used","[type]")
- var/list/borks = subtypesof(/obj/item/weapon/reagent_containers/food/drinks)
- // BORK BORK BORK
-
- playsound(get_turf(holder.my_atom), 'sound/effects/phasein.ogg', 100, 1)
-
- for(var/mob/living/carbon/M in viewers(get_turf(holder.my_atom), null))
- M.flash_act()
-
- for(var/i = 1, i <= 4 + rand(1,2), i++)
- var/chosen = pick(borks)
- var/obj/B = new chosen
- if(B)
- B.loc = get_turf(holder.my_atom)
- if(prob(50))
- for(var/j = 1, j <= rand(1, 3), j++)
- step(B, pick(NORTH,SOUTH,EAST,WEST))
- ..()
+/datum/chemical_reaction/slime/slimebork/drinks/getborks()
+ return subtypesof(/obj/item/weapon/reagent_containers/food/drinks)
//Blue
/datum/chemical_reaction/slime/slimefrost
@@ -245,11 +197,6 @@
required_container = /obj/item/slime_extract/blue
required_other = 1
-/datum/chemical_reaction/slime/slimefrost/on_reaction(datum/reagents/holder)
- feedback_add_details("slime_cores_used","[type]")
- ..()
-
-
/datum/chemical_reaction/slime/slimestabilizer
name = "Slime Stabilizer"
id = "m_slimestabilizer"
@@ -258,12 +205,9 @@
required_other = 1
/datum/chemical_reaction/slime/slimestabilizer/on_reaction(datum/reagents/holder)
- feedback_add_details("slime_cores_used","[type]")
- var/obj/item/slimepotion/stabilizer/P = new /obj/item/slimepotion/stabilizer
- P.loc = get_turf(holder.my_atom)
+ new /obj/item/slimepotion/stabilizer(get_turf(holder.my_atom))
..()
-
/datum/chemical_reaction/slime/slimefoam
name = "Slime Foam"
id = "m_foam"
@@ -272,11 +216,6 @@
required_container = /obj/item/slime_extract/blue
required_other = 1
-/datum/chemical_reaction/slime/slimefoam/on_reaction(datum/reagents/holder)
- feedback_add_details("slime_cores_used","[type]")
- ..()
-
-
//Dark Blue
/datum/chemical_reaction/slime/slimefreeze
name = "Slime Freeze"
@@ -286,12 +225,12 @@
required_other = 1
/datum/chemical_reaction/slime/slimefreeze/on_reaction(datum/reagents/holder)
- feedback_add_details("slime_cores_used","[type]")
var/turf/T = get_turf(holder.my_atom)
T.visible_message("The slime extract begins to vibrate adorably!")
addtimer(CALLBACK(src, .proc/freeze, holder), 50)
var/obj/item/slime_extract/M = holder.my_atom
deltimer(M.qdel_timer)
+ ..()
M.qdel_timer = addtimer(CALLBACK(src, .proc/delete_extract, holder), 55, TIMER_STOPPABLE)
/datum/chemical_reaction/slime/slimefreeze/proc/freeze(datum/reagents/holder)
@@ -300,8 +239,6 @@
if(istype(T))
T.atmos_spawn_air("freon=50;TEMP=120")
-
-
/datum/chemical_reaction/slime/slimefireproof
name = "Slime Fireproof"
id = "m_fireproof"
@@ -310,9 +247,7 @@
required_other = 1
/datum/chemical_reaction/slime/slimefireproof/on_reaction(datum/reagents/holder)
- feedback_add_details("slime_cores_used","[type]")
- var/obj/item/slimepotion/fireproof/P = new /obj/item/slimepotion/fireproof
- P.loc = get_turf(holder.my_atom)
+ new /obj/item/slimepotion/fireproof(get_turf(holder.my_atom))
..()
//Orange
@@ -324,24 +259,21 @@
required_container = /obj/item/slime_extract/orange
required_other = 1
-/datum/chemical_reaction/slime/slimecasp/on_reaction(datum/reagents/holder)
- feedback_add_details("slime_cores_used","[type]")
- ..()
-
/datum/chemical_reaction/slime/slimefire
name = "Slime fire"
id = "m_fire"
required_reagents = list("plasma" = 1)
required_container = /obj/item/slime_extract/orange
required_other = 1
+ deletes_extract = FALSE
/datum/chemical_reaction/slime/slimefire/on_reaction(datum/reagents/holder)
- feedback_add_details("slime_cores_used","[type]")
- var/turf/TU = get_turf(holder.my_atom)
- TU.visible_message("The slime extract begins to vibrate adorably!")
+ var/turf/T = get_turf(holder.my_atom)
+ T.visible_message("The slime extract begins to vibrate adorably!")
addtimer(CALLBACK(src, .proc/slime_burn, holder), 50)
var/obj/item/slime_extract/M = holder.my_atom
deltimer(M.qdel_timer)
+ ..()
M.qdel_timer = addtimer(CALLBACK(src, .proc/delete_extract, holder), 55, TIMER_STOPPABLE)
/datum/chemical_reaction/slime/slimefire/proc/slime_burn(datum/reagents/holder)
@@ -359,12 +291,7 @@
required_container = /obj/item/slime_extract/orange
required_other = 1
-/datum/chemical_reaction/slime/slimesmoke/on_reaction(datum/reagents/holder)
- feedback_add_details("slime_cores_used","[type]")
- ..()
-
//Yellow
-
/datum/chemical_reaction/slime/slimeoverload
name = "Slime EMP"
id = "m_emp"
@@ -373,11 +300,9 @@
required_other = 1
/datum/chemical_reaction/slime/slimeoverload/on_reaction(datum/reagents/holder, created_volume)
- feedback_add_details("slime_cores_used","[type]")
empulse(get_turf(holder.my_atom), 3, 7)
..()
-
/datum/chemical_reaction/slime/slimecell
name = "Slime Powercell"
id = "m_cell"
@@ -386,9 +311,7 @@
required_other = 1
/datum/chemical_reaction/slime/slimecell/on_reaction(datum/reagents/holder, created_volume)
- feedback_add_details("slime_cores_used","[type]")
- var/obj/item/weapon/stock_parts/cell/high/slime/P = new /obj/item/weapon/stock_parts/cell/high/slime
- P.loc = get_turf(holder.my_atom)
+ new /obj/item/weapon/stock_parts/cell/high/slime(get_turf(holder.my_atom))
..()
/datum/chemical_reaction/slime/slimeglow
@@ -399,15 +322,12 @@
required_other = 1
/datum/chemical_reaction/slime/slimeglow/on_reaction(datum/reagents/holder)
- feedback_add_details("slime_cores_used","[type]")
var/turf/T = get_turf(holder.my_atom)
T.visible_message("The slime begins to emit a soft light. Squeezing it will cause it to grow brightly.")
- var/obj/item/device/flashlight/slime/F = new /obj/item/device/flashlight/slime
- F.loc = get_turf(holder.my_atom)
+ new /obj/item/device/flashlight/slime(T)
..()
//Purple
-
/datum/chemical_reaction/slime/slimepsteroid
name = "Slime Steroid"
id = "m_steroid"
@@ -416,9 +336,7 @@
required_other = 1
/datum/chemical_reaction/slime/slimepsteroid/on_reaction(datum/reagents/holder)
- feedback_add_details("slime_cores_used","[type]")
- var/obj/item/slimepotion/steroid/P = new /obj/item/slimepotion/steroid
- P.loc = get_turf(holder.my_atom)
+ new /obj/item/slimepotion/steroid(get_turf(holder.my_atom))
..()
/datum/chemical_reaction/slime/slimejam
@@ -429,11 +347,6 @@
required_container = /obj/item/slime_extract/purple
required_other = 1
-/datum/chemical_reaction/slime/slimejam/on_reaction(datum/reagents/holder)
- feedback_add_details("slime_cores_used","[type]")
- ..()
-
-
//Dark Purple
/datum/chemical_reaction/slime/slimeplasma
name = "Slime Plasma"
@@ -443,9 +356,7 @@
required_other = 1
/datum/chemical_reaction/slime/slimeplasma/on_reaction(datum/reagents/holder)
- feedback_add_details("slime_cores_used","[type]")
- var/turf/location = get_turf(holder.my_atom)
- new /obj/item/stack/sheet/mineral/plasma (location, 3)
+ new /obj/item/stack/sheet/mineral/plasma(get_turf(holder.my_atom), 3)
..()
//Red
@@ -458,9 +369,7 @@
required_other = 1
/datum/chemical_reaction/slime/slimemutator/on_reaction(datum/reagents/holder)
- feedback_add_details("slime_cores_used","[type]")
- var/obj/item/slimepotion/mutator/P = new /obj/item/slimepotion/mutator
- P.loc = get_turf(holder.my_atom)
+ new /obj/item/slimepotion/mutator(get_turf(holder.my_atom))
..()
/datum/chemical_reaction/slime/slimebloodlust
@@ -471,13 +380,11 @@
required_other = 1
/datum/chemical_reaction/slime/slimebloodlust/on_reaction(datum/reagents/holder)
- feedback_add_details("slime_cores_used","[type]")
for(var/mob/living/simple_animal/slime/slime in viewers(get_turf(holder.my_atom), null))
slime.rabid = 1
slime.visible_message("The [slime] is driven into a frenzy!")
..()
-
/datum/chemical_reaction/slime/slimespeed
name = "Slime Speed"
id = "m_speed"
@@ -486,12 +393,9 @@
required_other = 1
/datum/chemical_reaction/slime/slimespeed/on_reaction(datum/reagents/holder)
- feedback_add_details("slime_cores_used","[type]")
- var/obj/item/slimepotion/speed/P = new /obj/item/slimepotion/speed
- P.loc = get_turf(holder.my_atom)
+ new /obj/item/slimepotion/speed(get_turf(holder.my_atom))
..()
-
//Pink
/datum/chemical_reaction/slime/docility
name = "Docility Potion"
@@ -501,9 +405,7 @@
required_other = 1
/datum/chemical_reaction/slime/docility/on_reaction(datum/reagents/holder)
- feedback_add_details("slime_cores_used","[type]")
- var/obj/item/slimepotion/docility/P = new /obj/item/slimepotion/docility
- P.loc = get_turf(holder.my_atom)
+ new /obj/item/slimepotion/docility(get_turf(holder.my_atom))
..()
/datum/chemical_reaction/slime/gender
@@ -514,9 +416,7 @@
required_other = 1
/datum/chemical_reaction/slime/gender/on_reaction(datum/reagents/holder)
- feedback_add_details("slime_cores_used","[type]")
- var/obj/item/slimepotion/genderchange/G = new /obj/item/slimepotion/genderchange
- G.loc = get_turf(holder.my_atom)
+ new /obj/item/slimepotion/genderchange(get_turf(holder.my_atom))
..()
//Black
@@ -528,10 +428,6 @@
required_other = 1
required_container = /obj/item/slime_extract/black
-/datum/chemical_reaction/slime/slimemutate2/on_reaction(datum/reagents/holder)
- feedback_add_details("slime_cores_used","[type]")
- ..()
-
//Oil
/datum/chemical_reaction/slime/slimeexplosion
name = "Slime Explosion"
@@ -539,9 +435,9 @@
required_reagents = list("plasma" = 1)
required_container = /obj/item/slime_extract/oil
required_other = 1
+ deletes_extract = FALSE
/datum/chemical_reaction/slime/slimeexplosion/on_reaction(datum/reagents/holder)
- feedback_add_details("slime_cores_used","[type]")
var/turf/T = get_turf(holder.my_atom)
var/lastkey = holder.my_atom.fingerprintslast
var/touch_msg = "N/A"
@@ -554,6 +450,7 @@
addtimer(CALLBACK(src, .proc/boom, holder), 50)
var/obj/item/slime_extract/M = holder.my_atom
deltimer(M.qdel_timer)
+ ..()
M.qdel_timer = addtimer(CALLBACK(src, .proc/delete_extract, holder), 55, TIMER_STOPPABLE)
/datum/chemical_reaction/slime/slimeexplosion/proc/boom(datum/reagents/holder)
@@ -569,10 +466,6 @@
required_container = /obj/item/slime_extract/oil
required_other = 1
-/datum/chemical_reaction/slime/slimecornoil/on_reaction(datum/reagents/holder)
- feedback_add_details("slime_cores_used","[type]")
- ..()
-
//Light Pink
/datum/chemical_reaction/slime/slimepotion2
name = "Slime Potion 2"
@@ -582,9 +475,7 @@
required_other = 1
/datum/chemical_reaction/slime/slimepotion2/on_reaction(datum/reagents/holder)
- feedback_add_details("slime_cores_used","[type]")
- var/obj/item/slimepotion/sentience/P = new /obj/item/slimepotion/sentience
- P.loc = get_turf(holder.my_atom)
+ new /obj/item/slimepotion/sentience
..()
//Adamantine
@@ -596,10 +487,7 @@
required_other = 1
/datum/chemical_reaction/slime/slimegolem/on_reaction(datum/reagents/holder)
- feedback_add_details("slime_cores_used","[type]")
- var/obj/effect/golemrune/Z = new /obj/effect/golemrune
- Z.loc = get_turf(holder.my_atom)
- notify_ghosts("Golem rune created in [get_area(Z)].", 'sound/effects/ghost2.ogg', source = Z)
+ new /obj/effect/golemrune(get_turf(holder.my_atom))
..()
/datum/chemical_reaction/slime/slimegolem2
@@ -610,9 +498,7 @@
required_other = 1
/datum/chemical_reaction/slime/slimegolem2/on_reaction(datum/reagents/holder)
- feedback_add_details("slime_cores_used","[type]")
- var/obj/item/golem_shell/artificial/Z = new /obj/item/golem_shell/artificial
- Z.loc = get_turf(holder.my_atom)
+ new /obj/item/golem_shell/artificial(get_turf(holder.my_atom))
..()
//Bluespace
@@ -624,10 +510,7 @@
required_other = 1
/datum/chemical_reaction/slime/slimefloor2/on_reaction(datum/reagents/holder, created_volume)
- feedback_add_details("slime_cores_used","[type]")
- var/obj/item/stack/tile/bluespace/P = new /obj/item/stack/tile/bluespace
- P.amount = 25
- P.loc = get_turf(holder.my_atom)
+ new /obj/item/stack/tile/bluespace(get_turf(holder.my_atom), 25)
..()
@@ -639,10 +522,8 @@
required_other = 1
/datum/chemical_reaction/slime/slimecrystal/on_reaction(datum/reagents/holder, created_volume)
- feedback_add_details("slime_cores_used","[type]")
- if(holder.my_atom)
- var/obj/item/weapon/ore/bluespace_crystal/BC = new(get_turf(holder.my_atom))
- BC.visible_message("The [BC.name] appears out of thin air!")
+ var/obj/item/weapon/ore/bluespace_crystal/BC = new (get_turf(holder.my_atom))
+ BC.visible_message("The [BC.name] appears out of thin air!")
..()
//Cerulean
@@ -654,12 +535,9 @@
required_other = 1
/datum/chemical_reaction/slime/slimepsteroid2/on_reaction(datum/reagents/holder)
- feedback_add_details("slime_cores_used","[type]")
- var/obj/item/slimepotion/enhancer/P = new /obj/item/slimepotion/enhancer
- P.loc = get_turf(holder.my_atom)
+ new /obj/item/slimepotion/enhancer(get_turf(holder.my_atom))
..()
-
/datum/chemical_reaction/slime/slime_territory
name = "Slime Territory"
id = "s_territory"
@@ -668,9 +546,7 @@
required_other = 1
/datum/chemical_reaction/slime/slime_territory/on_reaction(datum/reagents/holder)
- feedback_add_details("slime_cores_used","[type]")
- var/obj/item/areaeditor/blueprints/slime/P = new /obj/item/areaeditor/blueprints/slime
- P.loc = get_turf(holder.my_atom)
+ new /obj/item/areaeditor/blueprints/slime(get_turf(holder.my_atom))
..()
//Sepia
@@ -682,15 +558,12 @@
required_other = 1
/datum/chemical_reaction/slime/slimestop/on_reaction(datum/reagents/holder)
- feedback_add_details("slime_cores_used","[type]")
- var/mob/mob = get_mob_by_key(holder.my_atom.fingerprintslast)
var/obj/effect/timestop/T = new /obj/effect/timestop
- T.loc = get_turf(holder.my_atom)
- T.immune += mob
+ T.forceMove(get_turf(holder.my_atom))
+ T.immune += get_mob_by_key(holder.my_atom.fingerprintslast)
T.timestop()
..()
-
/datum/chemical_reaction/slime/slimecamera
name = "Slime Camera"
id = "m_camera"
@@ -699,11 +572,8 @@
required_other = 1
/datum/chemical_reaction/slime/slimecamera/on_reaction(datum/reagents/holder)
- feedback_add_details("slime_cores_used","[type]")
- var/obj/item/device/camera/P = new /obj/item/device/camera
- P.loc = get_turf(holder.my_atom)
- var/obj/item/device/camera_film/Z = new /obj/item/device/camera_film
- Z.loc = get_turf(holder.my_atom)
+ new /obj/item/device/camera(get_turf(holder.my_atom))
+ new /obj/item/device/camera_film(get_turf(holder.my_atom))
..()
/datum/chemical_reaction/slime/slimefloor
@@ -714,16 +584,10 @@
required_other = 1
/datum/chemical_reaction/slime/slimefloor/on_reaction(datum/reagents/holder)
- feedback_add_details("slime_cores_used","[type]")
- var/obj/item/stack/tile/sepia/P = new /obj/item/stack/tile/sepia
- P.amount = 25
- P.loc = get_turf(holder.my_atom)
+ new /obj/item/stack/tile/sepia(get_turf(holder.my_atom), 25)
..()
-
//Pyrite
-
-
/datum/chemical_reaction/slime/slimepaint
name = "Slime Paint"
id = "s_paint"
@@ -732,15 +596,10 @@
required_other = 1
/datum/chemical_reaction/slime/slimepaint/on_reaction(datum/reagents/holder)
- feedback_add_details("slime_cores_used","[type]")
- var/list/paints = subtypesof(/obj/item/weapon/paint)
- var/chosen = pick(paints)
- var/obj/P = new chosen
- if(P)
- P.loc = get_turf(holder.my_atom)
+ var/chosen = pick(subtypesof(/obj/item/weapon/paint))
+ new chosen(get_turf(holder.my_atom))
..()
-
/datum/chemical_reaction/slime/slimecrayon
name = "Slime Crayon"
id = "s_crayon"
@@ -749,12 +608,8 @@
required_other = 1
/datum/chemical_reaction/slime/slimecrayon/on_reaction(datum/reagents/holder)
- feedback_add_details("slime_cores_used","[type]")
- var/list/crayons = difflist(subtypesof(/obj/item/toy/crayon),typesof(/obj/item/toy/crayon/spraycan))
- var/chosen = pick(crayons)
- var/obj/P = new chosen
- if(P)
- P.loc = get_turf(holder.my_atom)
+ var/chosen = pick(difflist(subtypesof(/obj/item/toy/crayon),typesof(/obj/item/toy/crayon/spraycan)))
+ new chosen(get_turf(holder.my_atom))
..()
//Rainbow :o)
@@ -766,12 +621,8 @@
required_container = /obj/item/slime_extract/rainbow
/datum/chemical_reaction/slime/slimeRNG/on_reaction(datum/reagents/holder)
- feedback_add_details("slime_cores_used","[type]")
- var/mob/living/simple_animal/slime/random/S
- S = new(get_turf(holder.my_atom))
- S.visible_message("Infused with plasma, the \
- core begins to quiver and grow, and soon a new baby slime emerges \
- from it!")
+ var/mob/living/simple_animal/slime/random/S = new (get_turf(holder.my_atom))
+ S.visible_message("Infused with plasma, the core begins to quiver and grow, and a new baby slime emerges from it!")
..()
/datum/chemical_reaction/slime/slime_transfer
@@ -782,9 +633,7 @@
required_container = /obj/item/slime_extract/rainbow
/datum/chemical_reaction/slime/slime_transfer/on_reaction(datum/reagents/holder)
- feedback_add_details("slime_cores_used","[type]")
- var/obj/item/slimepotion/transference/P = new /obj/item/slimepotion/transference
- P.loc = get_turf(holder.my_atom)
+ new /obj/item/slimepotion/transference(get_turf(holder.my_atom))
..()
/datum/chemical_reaction/slime/flight_potion
@@ -795,7 +644,6 @@
required_container = /obj/item/slime_extract/rainbow
/datum/chemical_reaction/slime/flight_potion/on_reaction(datum/reagents/holder)
- feedback_add_details("slime_cores_used","[type]")
- new/obj/item/weapon/reagent_containers/glass/bottle/potion/flight(get_turf(holder.my_atom))
+ new /obj/item/weapon/reagent_containers/glass/bottle/potion/flight(get_turf(holder.my_atom))
..()
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/code/modules/research/xenobiology/xenobiology.dm b/code/modules/research/xenobiology/xenobiology.dm
index f31cd011312..38d742c5be0 100644
--- a/code/modules/research/xenobiology/xenobiology.dm
+++ b/code/modules/research/xenobiology/xenobiology.dm
@@ -482,9 +482,14 @@
resistance_flags = LAVA_PROOF | FIRE_PROOF | UNACIDABLE | ACID_PROOF
layer = TURF_LAYER
-/obj/effect/golemrune/New()
- ..()
+/obj/effect/golemrune/Initialize()
+ . = ..()
START_PROCESSING(SSobj, src)
+ notify_ghosts("Golem rune created in [get_area(src)].", 'sound/effects/ghost2.ogg', source = src)
+
+/obj/effect/golemrune/Destroy()
+ STOP_PROCESSING(SSobj, src)
+ return ..()
/obj/effect/golemrune/process()
var/mob/dead/observer/ghost
diff --git a/code/modules/shuttle/on_move.dm b/code/modules/shuttle/on_move.dm
index 13a2f453f3a..1cf42135d69 100644
--- a/code/modules/shuttle/on_move.dm
+++ b/code/modules/shuttle/on_move.dm
@@ -1,6 +1,3 @@
-/turf/proc/onShuttleMove(turf/oldturf)
- addtimer(CALLBACK(lighting_object, /atom/movable/lighting_object/proc/update), 0)
-
/atom/movable/proc/onShuttleMove(turf/T1, rotation)
if(rotation)
shuttleRotate(rotation)
@@ -80,7 +77,3 @@
var/oldPY = pixel_y
pixel_x = oldPY
pixel_y = (oldPX*(-1))
-
-// Nope nope nope!
-/atom/movable/lighting_object/onShuttleMove(turf/T1, rotation)
- return FALSE
\ No newline at end of file
diff --git a/code/modules/shuttle/shuttle.dm b/code/modules/shuttle/shuttle.dm
index f6f955f9e94..a271ddfe417 100644
--- a/code/modules/shuttle/shuttle.dm
+++ b/code/modules/shuttle/shuttle.dm
@@ -503,8 +503,6 @@
//move mobile to new location
for(var/atom/movable/AM in T0)
AM.onShuttleMove(T1, rotation)
-
- T1.onShuttleMove(T0)
if(rotation)
T1.shuttleRotate(rotation)
diff --git a/code/world.dm b/code/world.dm
index ea6c35ebec4..2fac93f87cb 100644
--- a/code/world.dm
+++ b/code/world.dm
@@ -210,14 +210,6 @@
/world/proc/OnReboot(reason, feedback_c, feedback_r, round_end_sound_sent)
feedback_set_details("[feedback_c]","[feedback_r]")
log_game("Rebooting World. [reason]")
-#ifdef dellogging
- var/log = file("data/logs/del.log")
- log << time2text(world.realtime)
- for(var/index in del_counter)
- var/count = del_counter[index]
- if(count > 10)
- log << "#[count]\t[index]"
-#endif
if(GLOB.blackbox)
GLOB.blackbox.save_all_data_to_sql()
Master.Shutdown() //run SS shutdowns
diff --git a/html/changelog.html b/html/changelog.html
index aad02c775fc..377341d284a 100644
--- a/html/changelog.html
+++ b/html/changelog.html
@@ -79,6 +79,11 @@
- Constructing lattice no longer prevents space transitions.
+ Robustin updated:
+
+ - Ranged RCD added to the game
+ - Rapid Lighting Device (also ranged) has been added. It can create wall, floor, and temporary lights of any color you desire.
+
coiax updated:
- Cigarette branding has been fixed.
diff --git a/html/changelogs/.all_changelog.yml b/html/changelogs/.all_changelog.yml
index 15b46468820..bd574806d91 100644
--- a/html/changelogs/.all_changelog.yml
+++ b/html/changelogs/.all_changelog.yml
@@ -10569,6 +10569,10 @@ DO NOT EDIT THIS FILE BY HAND! AUTOMATICALLY GENERATED BY ss13_genchangelog.py.
- bugfix: Bodies in body bags get cremated properly now
RemieRichards:
- bugfix: Constructing lattice no longer prevents space transitions.
+ Robustin:
+ - rscadd: Ranged RCD added to the game
+ - rscadd: Rapid Lighting Device (also ranged) has been added. It can create wall,
+ floor, and temporary lights of any color you desire.
coiax:
- bugfix: Cigarette branding has been fixed.
- rscadd: Uplift Smooth brand cigarettes now taste minty as advertised.
diff --git a/html/changelogs/AutoChangeLog-pr-25924.yml b/html/changelogs/AutoChangeLog-pr-25924.yml
new file mode 100644
index 00000000000..8075d0ef268
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-25924.yml
@@ -0,0 +1,4 @@
+author: "coiax"
+delete-after: True
+changes:
+ - bugfix: "Plasmamen no longer burn to death while inside a cloning pod."
diff --git a/html/changelogs/AutoChangeLog-pr-26122.yml b/html/changelogs/AutoChangeLog-pr-26122.yml
new file mode 100644
index 00000000000..9851dcce417
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-26122.yml
@@ -0,0 +1,4 @@
+author: "Davidj361"
+delete-after: True
+changes:
+ - bugfix: "Monkeys won't pickup items or rob you while they are in your stomach, neither walk out of your stomach."
diff --git a/html/changelogs/AutoChangeLog-pr-26165.yml b/html/changelogs/AutoChangeLog-pr-26165.yml
new file mode 100644
index 00000000000..84c8e321ca3
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-26165.yml
@@ -0,0 +1,4 @@
+author: "Davidj361"
+delete-after: True
+changes:
+ - bugfix: "You can't cheat with eyewear/eye-implants when using advanced cameras"
diff --git a/html/changelogs/AutoChangeLog-pr-26173.yml b/html/changelogs/AutoChangeLog-pr-26173.yml
new file mode 100644
index 00000000000..0c7b1f3e2e0
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-26173.yml
@@ -0,0 +1,4 @@
+author: "Davidj361"
+delete-after: True
+changes:
+ - bugfix: "Mutant digitigrade legs re-added to the ashwalker species"
diff --git a/html/changelogs/AutoChangeLog-pr-26190.yml b/html/changelogs/AutoChangeLog-pr-26190.yml
new file mode 100644
index 00000000000..b2de3597430
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-26190.yml
@@ -0,0 +1,4 @@
+author: "Robustin"
+delete-after: True
+changes:
+ - rscadd: "The Prototype Emitter, will function like an ordinary emitter while also charging a secondary power supply that will allow a buckled user to manually fire the emitter. Returning to automatic fire will have the emitter continue to fire at the last target struck by manual fire."
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
diff --git a/icons/obj/turrets.dmi b/icons/obj/turrets.dmi
index 3244dd905e1..f4478fc7370 100644
Binary files a/icons/obj/turrets.dmi and b/icons/obj/turrets.dmi differ
diff --git a/tgstation.dme b/tgstation.dme
index 04a6e47e821..ea9822617af 100644
--- a/tgstation.dme
+++ b/tgstation.dme
@@ -70,6 +70,7 @@
#include "code\__HELPERS\_lists.dm"
#include "code\__HELPERS\_logging.dm"
#include "code\__HELPERS\_string_lists.dm"
+#include "code\__HELPERS\AStar.dm"
#include "code\__HELPERS\bandetect.dm"
#include "code\__HELPERS\cmp.dm"
#include "code\__HELPERS\files.dm"
@@ -82,6 +83,7 @@
#include "code\__HELPERS\matrices.dm"
#include "code\__HELPERS\mobs.dm"
#include "code\__HELPERS\names.dm"
+#include "code\__HELPERS\priority_announce.dm"
#include "code\__HELPERS\pronouns.dm"
#include "code\__HELPERS\radio.dm"
#include "code\__HELPERS\sanitize_values.dm"
@@ -1030,8 +1032,8 @@
#include "code\modules\atmospherics\environmental\LINDA_turf_tile.dm"
#include "code\modules\atmospherics\gasmixtures\gas_mixture.dm"
#include "code\modules\atmospherics\gasmixtures\gas_types.dm"
+#include "code\modules\atmospherics\gasmixtures\immutable_mixtures.dm"
#include "code\modules\atmospherics\gasmixtures\reactions.dm"
-#include "code\modules\atmospherics\gasmixtures\space_mixture.dm"
#include "code\modules\atmospherics\machinery\airalarm.dm"
#include "code\modules\atmospherics\machinery\atmosmachinery.dm"
#include "code\modules\atmospherics\machinery\datum_pipeline.dm"
@@ -2074,9 +2076,7 @@
#include "code\modules\VR\vr_sleeper.dm"
#include "code\modules\zombie\items.dm"
#include "code\modules\zombie\organs.dm"
-#include "code\orphaned_procs\AStar.dm"
#include "code\orphaned_procs\dbcore.dm"
-#include "code\orphaned_procs\priority_announce.dm"
#include "code\orphaned_procs\statistics.dm"
#include "interface\interface.dm"
#include "interface\stylesheet.dm"