diff --git a/.github/CONTRIBUTING.md b/.github/CONTRIBUTING.md
index 1b1a8f07c8..859af746b4 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 f219cfcc99..a6c92c7610 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 b3facda8d2..2c90bf7f22 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 d73b5563b3..ced48fe48b 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/__DATASTRUCTURES/globals.dm b/code/__DATASTRUCTURES/globals.dm
index f9b5281212..bcc860245f 100644
--- a/code/__DATASTRUCTURES/globals.dm
+++ b/code/__DATASTRUCTURES/globals.dm
@@ -16,6 +16,7 @@
#define GLOBAL_PROTECT(X)
#endif
+#define GLOBAL_REAL_VAR(X) var/global/##X
#define GLOBAL_REAL(X, Typepath) var/global##Typepath/##X
#define GLOBAL_RAW(X) /datum/controller/global_vars/var/global##X
diff --git a/code/__DEFINES/mobs.dm b/code/__DEFINES/mobs.dm
index 28e4a262fd..5b0bdbc11e 100644
--- a/code/__DEFINES/mobs.dm
+++ b/code/__DEFINES/mobs.dm
@@ -37,6 +37,9 @@
#define BODYPART_ORGANIC 1
#define BODYPART_ROBOTIC 2
+#define DEFAULT_BODYPART_ICON_ORGANIC 'icons/mob/human_parts_greyscale.dmi'
+#define DEFAULT_BODYPART_ICON_ROBOTIC 'icons/mob/augments.dmi'
+
#define MONKEY_BODYPART "monkey"
#define ALIEN_BODYPART "alien"
#define LARVA_BODYPART "larva"
diff --git a/code/__DEFINES/sound.dm b/code/__DEFINES/sound.dm
index 94ed5dc7b9..77c263cada 100644
--- a/code/__DEFINES/sound.dm
+++ b/code/__DEFINES/sound.dm
@@ -2,7 +2,10 @@
#define CHANNEL_LOBBYMUSIC 1024
#define CHANNEL_ADMIN 1023
#define CHANNEL_VOX 1022
+#define CHANNEL_JUKEBOX 1021
//THIS SHOULD ALWAYS BE THE LOWEST ONE!
//KEEP IT UPDATED
-#define CHANNEL_HIGHEST_AVAILABLE 1021
+
+#define CHANNEL_HIGHEST_AVAILABLE 1020
+
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/__HELPERS/text.dm b/code/__HELPERS/text.dm
index 853ff4fb6a..f78c40fbe1 100644
--- a/code/__HELPERS/text.dm
+++ b/code/__HELPERS/text.dm
@@ -19,7 +19,7 @@
return copytext(sqltext, 2, lentext(sqltext));//Quote() adds quotes around input, we already do that
/proc/format_table_name(table as text)
- return GLOB.sqlfdbktableprefix + table
+ return global.sqlfdbktableprefix + table
/*
* Text sanitization
diff --git a/code/__HELPERS/unsorted.dm b/code/__HELPERS/unsorted.dm
index e1c34dc0c9..73b4c33620 100644
--- a/code/__HELPERS/unsorted.dm
+++ b/code/__HELPERS/unsorted.dm
@@ -1279,6 +1279,9 @@ proc/pick_closest_path(value, list/matches = get_fancy_list_of_atom_types())
#define QDEL_IN(item, time) addtimer(CALLBACK(GLOBAL_PROC, .proc/qdel, item), time, TIMER_STOPPABLE)
#define QDEL_NULL(item) qdel(item); item = null
+#define QDEL_LIST(L) if(L) { for(var/I in L) qdel(I); L.Cut(); }
+#define QDEL_LIST_ASSOC(L) if(L) { for(var/I in L) { qdel(L[I]); qdel(I); } L.Cut(); }
+#define QDEL_LIST_ASSOC_VAL(L) if(L) { for(var/I in L) qel(L[I]); L.Cut(); }
/proc/random_nukecode()
var/val = rand(0, 99999)
diff --git a/code/_globalvars/configuration.dm b/code/_globalvars/configuration.dm
index e8833f77aa..23bfdd3987 100644
--- a/code/_globalvars/configuration.dm
+++ b/code/_globalvars/configuration.dm
@@ -23,20 +23,6 @@ GLOBAL_VAR_INIT(tinted_weldhelh, TRUE)
GLOBAL_VAR_INIT(Debug, FALSE) // global debug switch
GLOBAL_VAR_INIT(Debug2, FALSE)
-//Server API key
-GLOBAL_VAR_INIT(comms_key, "default_pwd")
-GLOBAL_PROTECT(comms_key)
-GLOBAL_VAR_INIT(comms_allowed, FALSE) //By default, the server does not allow messages to be sent to it, unless the key is strong enough (this is to prevent misconfigured servers from becoming vulnerable)
-GLOBAL_PROTECT(comms_allowed)
-
-GLOBAL_VAR(medal_hub)
-GLOBAL_PROTECT(medal_hub)
-GLOBAL_VAR_INIT(medal_pass, " ")
-GLOBAL_PROTECT(medal_pass)
-GLOBAL_VAR_INIT(medals_enabled, TRUE) //will be auto set to false if the game fails contacting the medal hub to prevent unneeded calls.
-GLOBAL_PROTECT(medals_enabled)
-
-
//This was a define, but I changed it to a variable so it can be changed in-game.(kept the all-caps definition because... code...) -Errorage
GLOBAL_VAR_INIT(MAX_EX_DEVESTATION_RANGE, 3)
GLOBAL_VAR_INIT(MAX_EX_HEAVY_RANGE, 7)
diff --git a/code/_globalvars/database.dm b/code/_globalvars/database.dm
deleted file mode 100644
index 8ba72517ce..0000000000
--- a/code/_globalvars/database.dm
+++ /dev/null
@@ -1,19 +0,0 @@
- // MySQL configuration
-
-GLOBAL_VAR_INIT(sqladdress, "localhost")
-GLOBAL_PROTECT(sqladdress)
-GLOBAL_VAR_INIT(sqlport, "3306")
-GLOBAL_PROTECT(sqlport)
-GLOBAL_VAR_INIT(sqlfdbkdb, "test")
-GLOBAL_PROTECT(sqlfdbkdb)
-GLOBAL_VAR_INIT(sqlfdbklogin, "root")
-GLOBAL_PROTECT(sqlfdbklogin)
-GLOBAL_VAR_INIT(sqlfdbkpass, "")
-GLOBAL_PROTECT(sqlfdbkpass)
-GLOBAL_VAR_INIT(sqlfdbktableprefix, "erro_") //backwords compatibility with downstream server hosts
-GLOBAL_PROTECT(sqlfdbktableprefix)
-
-//Database connections
-//A connection is established on world creation. Ideally, the connection dies when the server restarts (After feedback logging.).
-GLOBAL_DATUM_INIT(dbcon, /DBConnection, new) //Feedback database (New database)
-GLOBAL_PROTECT(dbcon)
diff --git a/code/_globalvars/misc.dm b/code/_globalvars/misc.dm
index ea89f3e4e7..a7763236e6 100644
--- a/code/_globalvars/misc.dm
+++ b/code/_globalvars/misc.dm
@@ -6,4 +6,16 @@ GLOBAL_VAR_INIT(timezoneOffset, 0) // The difference betwen midnight (of the hos
// However it'd be ok to use for accessing attack logs and such too, which are even laggier.
GLOBAL_VAR_INIT(fileaccess_timer, 0)
-GLOBAL_VAR_INIT(TAB, " ")
\ No newline at end of file
+GLOBAL_VAR_INIT(TAB, " ")
+
+GLOBAL_DATUM(data_core, /datum/datacore)
+
+GLOBAL_VAR_INIT(CELLRATE, 0.002) // multiplier for watts per tick <> cell storage (eg: .002 means if there is a load of 1000 watts, 20 units will be taken from a cell per second)
+GLOBAL_VAR_INIT(CHARGELEVEL, 0.001) // Cap for how fast cells charge, as a percentage-per-tick (.001 means cellcharge is capped to 1% per second)
+
+GLOBAL_LIST_EMPTY(powernets)
+
+//Database connections
+//A connection is established on world creation. Ideally, the connection dies when the server restarts (After feedback logging.).
+GLOBAL_DATUM_INIT(dbcon, /DBConnection, new) //Feedback database (New database)
+GLOBAL_PROTECT(dbcon)
\ No newline at end of file
diff --git a/code/_globalvars/sensitive.dm b/code/_globalvars/sensitive.dm
new file mode 100644
index 0000000000..786287f96f
--- /dev/null
+++ b/code/_globalvars/sensitive.dm
@@ -0,0 +1,16 @@
+//Server API key
+GLOBAL_REAL_VAR(comms_key) = "default_pwd"
+GLOBAL_REAL_VAR(comms_allowed) = FALSE //By default, the server does not allow messages to be sent to it, unless the key is strong enough (this is to prevent misconfigured servers from becoming vulnerable)
+
+GLOBAL_REAL_VAR(medal_hub)
+GLOBAL_REAL_VAR(medal_pass) = " "
+GLOBAL_REAL_VAR(medals_enabled) = TRUE //will be auto set to false if the game fails contacting the medal hub to prevent unneeded calls.
+
+// MySQL configuration
+
+GLOBAL_REAL_VAR(sqladdress) = "localhost"
+GLOBAL_REAL_VAR(sqlport) = "3306"
+GLOBAL_REAL_VAR(sqlfdbkdb) = "test"
+GLOBAL_REAL_VAR(sqlfdbklogin) = "root"
+GLOBAL_REAL_VAR(sqlfdbkpass) = ""
+GLOBAL_REAL_VAR(sqlfdbktableprefix) = "erro_"
\ No newline at end of file
diff --git a/code/_globalvars/station.dm b/code/_globalvars/station.dm
deleted file mode 100644
index 7af03b7ce3..0000000000
--- a/code/_globalvars/station.dm
+++ /dev/null
@@ -1,6 +0,0 @@
-GLOBAL_DATUM(data_core, /datum/datacore)
-
-GLOBAL_VAR_INIT(CELLRATE, 0.002) // multiplier for watts per tick <> cell storage (eg: .002 means if there is a load of 1000 watts, 20 units will be taken from a cell per second)
-GLOBAL_VAR_INIT(CHARGELEVEL, 0.001) // Cap for how fast cells charge, as a percentage-per-tick (.001 means cellcharge is capped to 1% per second)
-
-GLOBAL_LIST_EMPTY(powernets)
\ No newline at end of file
diff --git a/code/_onclick/cyborg.dm b/code/_onclick/cyborg.dm
index 578e6cd378..c52b3441db 100644
--- a/code/_onclick/cyborg.dm
+++ b/code/_onclick/cyborg.dm
@@ -22,6 +22,9 @@
if(modifiers["shift"] && modifiers["ctrl"])
CtrlShiftClickOn(A)
return
+ if(modifiers["shift"] && modifiers["middle"])
+ ShiftMiddleClickOn(A)
+ return
if(modifiers["middle"])
MiddleClickOn(A)
return
diff --git a/code/_onclick/hud/alert.dm b/code/_onclick/hud/alert.dm
index e83cfadedf..9c8fe9750a 100644
--- a/code/_onclick/hud/alert.dm
+++ b/code/_onclick/hud/alert.dm
@@ -266,8 +266,8 @@ or shoot a gun to move around via Newton's 3rd Law of Motion."
icon_state = "no-servants-caches"
var/static/list/scripture_states = list(SCRIPTURE_DRIVER = TRUE, SCRIPTURE_SCRIPT = FALSE, SCRIPTURE_APPLICATION = FALSE, SCRIPTURE_REVENANT = FALSE, SCRIPTURE_JUDGEMENT = FALSE)
-/obj/screen/alert/clockwork/scripture_reqs/New()
- ..()
+/obj/screen/alert/clockwork/scripture_reqs/Initialize()
+ . = ..()
START_PROCESSING(SSprocessing, src)
process()
diff --git a/code/controllers/configuration.dm b/code/controllers/configuration.dm
index 95fc6aa622..1aa1f3d4fa 100644
--- a/code/controllers/configuration.dm
+++ b/code/controllers/configuration.dm
@@ -276,6 +276,18 @@
qdel(M)
votable_modes += "secret"
+ Reload()
+
+/datum/configuration/proc/Reload()
+ load("config/config.txt")
+ load("config/game_options.txt","game_options")
+ loadsql("config/dbconfig.txt")
+ if (maprotation)
+ loadmaplist("config/maps.txt")
+
+ // apply some settings from config..
+ GLOB.abandon_allowed = respawn
+
/datum/configuration/proc/load(filename, type = "config") //the type can also be game_options, in which case it uses a different switch. not making it separate to not copypaste code - Urist
var/list/Lines = file2list(filename)
@@ -305,109 +317,109 @@
if(type == "config")
switch(name)
if("hub")
- config.hub = 1
+ hub = 1
if("admin_legacy_system")
- config.admin_legacy_system = 1
+ admin_legacy_system = 1
if("ban_legacy_system")
- config.ban_legacy_system = 1
+ ban_legacy_system = 1
if("use_age_restriction_for_jobs")
- config.use_age_restriction_for_jobs = 1
+ use_age_restriction_for_jobs = 1
if("use_account_age_for_jobs")
- config.use_account_age_for_jobs = 1
+ use_account_age_for_jobs = 1
if("lobby_countdown")
- config.lobby_countdown = text2num(value)
+ lobby_countdown = text2num(value)
if("round_end_countdown")
- config.round_end_countdown = text2num(value)
+ round_end_countdown = text2num(value)
if("log_ooc")
- config.log_ooc = 1
+ log_ooc = 1
if("log_access")
- config.log_access = 1
+ log_access = 1
if("log_say")
- config.log_say = 1
+ log_say = 1
if("log_admin")
- config.log_admin = 1
+ log_admin = 1
if("log_prayer")
- config.log_prayer = 1
+ log_prayer = 1
if("log_law")
- config.log_law = 1
+ log_law = 1
if("log_game")
- config.log_game = 1
+ log_game = 1
if("log_vote")
- config.log_vote = 1
+ log_vote = 1
if("log_whisper")
- config.log_whisper = 1
+ log_whisper = 1
if("log_attack")
- config.log_attack = 1
+ log_attack = 1
if("log_emote")
- config.log_emote = 1
+ log_emote = 1
if("log_adminchat")
- config.log_adminchat = 1
+ log_adminchat = 1
if("log_pda")
- config.log_pda = 1
+ log_pda = 1
if("log_hrefs")
- config.log_hrefs = 1
+ log_hrefs = 1
if("log_twitter")
- config.log_twitter = 1
+ log_twitter = 1
if("log_world_topic")
- config.log_world_topic = 1
+ log_world_topic = 1
if("allow_admin_ooccolor")
- config.allow_admin_ooccolor = 1
+ allow_admin_ooccolor = 1
if("allow_vote_restart")
- config.allow_vote_restart = 1
+ allow_vote_restart = 1
if("allow_vote_mode")
- config.allow_vote_mode = 1
+ allow_vote_mode = 1
if("no_dead_vote")
- config.vote_no_dead = 1
+ vote_no_dead = 1
if("default_no_vote")
- config.vote_no_default = 1
+ vote_no_default = 1
if("vote_delay")
- config.vote_delay = text2num(value)
+ vote_delay = text2num(value)
if("vote_period")
- config.vote_period = text2num(value)
+ vote_period = text2num(value)
if("norespawn")
- config.respawn = 0
+ respawn = 0
if("servername")
- config.server_name = value
+ server_name = value
if("serversqlname")
- config.server_sql_name = value
+ server_sql_name = value
if("stationname")
- config.station_name = value
+ station_name = value
if("hostedby")
- config.hostedby = value
+ hostedby = value
if("server")
- config.server = value
+ server = value
if("banappeals")
- config.banappeals = value
+ banappeals = value
if("wikiurl")
- config.wikiurl = value
+ wikiurl = value
if("forumurl")
- config.forumurl = value
+ forumurl = value
if("rulesurl")
- config.rulesurl = value
+ rulesurl = value
if("githuburl")
- config.githuburl = value
+ githuburl = value
if("githubrepoid")
- config.githubrepoid = value
+ githubrepoid = value
if("guest_jobban")
- config.guest_jobban = 1
+ guest_jobban = 1
if("guest_ban")
GLOB.guests_allowed = 0
if("usewhitelist")
- config.usewhitelist = TRUE
+ usewhitelist = TRUE
if("allow_metadata")
- config.allow_Metadata = 1
+ allow_Metadata = 1
if("kick_inactive")
if(value < 1)
value = INACTIVITY_KICK
- config.kick_inactive = value
+ kick_inactive = value
if("load_jobs_from_txt")
load_jobs_from_txt = 1
if("forbid_singulo_possession")
forbid_singulo_possession = 1
if("popup_admin_pm")
- config.popup_admin_pm = 1
+ popup_admin_pm = 1
if("allow_holidays")
- config.allow_holidays = 1
+ allow_holidays = 1
if("useircbot")
useircbot = 1
if("ticklag")
@@ -421,9 +433,9 @@
if("automute_on")
automute_on = 1
if("comms_key")
- GLOB.comms_key = value
+ global.comms_key = value
if(value != "default_pwd" && length(value) > 6) //It's the default value or less than 6 characters long, warn badmins
- GLOB.comms_allowed = 1
+ global.comms_allowed = 1
if("cross_server_address")
cross_address = value
if(value != "byond:\\address:port")
@@ -437,46 +449,46 @@
if(value != "byond:\\address:port")
allow_panic_bunker_bounce = 1
if("medal_hub_address")
- GLOB.medal_hub = value
+ global.medal_hub = value
if("medal_hub_password")
- GLOB.medal_pass = value
+ global.medal_pass = value
if("show_irc_name")
- config.showircname = 1
+ showircname = 1
if("see_own_notes")
- config.see_own_notes = 1
+ see_own_notes = 1
if("soft_popcap")
- config.soft_popcap = text2num(value)
+ soft_popcap = text2num(value)
if("hard_popcap")
- config.hard_popcap = text2num(value)
+ hard_popcap = text2num(value)
if("extreme_popcap")
- config.extreme_popcap = text2num(value)
+ extreme_popcap = text2num(value)
if("soft_popcap_message")
- config.soft_popcap_message = value
+ soft_popcap_message = value
if("hard_popcap_message")
- config.hard_popcap_message = value
+ hard_popcap_message = value
if("extreme_popcap_message")
- config.extreme_popcap_message = value
+ extreme_popcap_message = value
if("panic_bunker")
- config.panic_bunker = 1
+ panic_bunker = 1
if("notify_new_player_age")
- config.notify_new_player_age = text2num(value)
+ notify_new_player_age = text2num(value)
if("irc_first_connection_alert")
- config.irc_first_connection_alert = 1
+ irc_first_connection_alert = 1
if("check_randomizer")
- config.check_randomizer = 1
+ check_randomizer = 1
if("ipintel_email")
if (value != "ch@nge.me")
- config.ipintel_email = value
+ ipintel_email = value
if("ipintel_rating_bad")
- config.ipintel_rating_bad = text2num(value)
+ ipintel_rating_bad = text2num(value)
if("ipintel_domain")
- config.ipintel_domain = value
+ ipintel_domain = value
if("ipintel_save_good")
- config.ipintel_save_good = text2num(value)
+ ipintel_save_good = text2num(value)
if("ipintel_save_bad")
- config.ipintel_save_bad = text2num(value)
+ ipintel_save_bad = text2num(value)
if("aggressive_changelog")
- config.aggressive_changelog = 1
+ aggressive_changelog = 1
if("log_runtimes")
log_runtimes = TRUE
var/newlog = file("data/logs/runtimes/runtime-[time2text(world.realtime, "YYYY-MM-DD")].log")
@@ -484,39 +496,39 @@
world.log << "Now logging runtimes to data/logs/runtimes/runtime-[time2text(world.realtime, "YYYY-MM-DD")].log"
GLOB.runtime_diary = newlog
if("autoconvert_notes")
- config.autoconvert_notes = 1
+ autoconvert_notes = 1
if("allow_webclient")
- config.allowwebclient = 1
+ allowwebclient = 1
if("webclient_only_byond_members")
- config.webclientmembersonly = 1
+ webclientmembersonly = 1
if("announce_admin_logout")
- config.announce_admin_logout = 1
+ announce_admin_logout = 1
if("announce_admin_login")
- config.announce_admin_login = 1
+ announce_admin_login = 1
if("maprotation")
- config.maprotation = 1
+ maprotation = 1
if("allow_map_voting")
- config.allow_map_voting = text2num(value)
+ allow_map_voting = text2num(value)
if("maprotationchancedelta")
- config.maprotatechancedelta = text2num(value)
+ maprotatechancedelta = text2num(value)
if("autoadmin")
- config.autoadmin = 1
+ autoadmin = 1
if(value)
- config.autoadmin_rank = ckeyEx(value)
+ autoadmin_rank = ckeyEx(value)
if("generate_minimaps")
- config.generate_minimaps = 1
+ generate_minimaps = 1
if("client_warn_version")
- config.client_warn_version = text2num(value)
+ client_warn_version = text2num(value)
if("client_warn_message")
- config.client_warn_message = value
+ client_warn_message = value
if("client_error_version")
- config.client_error_version = text2num(value)
+ client_error_version = text2num(value)
if("client_error_message")
- config.client_error_message = value
+ client_error_message = value
if("minute_topic_limit")
- config.minutetopiclimit = text2num(value)
+ minutetopiclimit = text2num(value)
if("second_topic_limit")
- config.secondtopiclimit = text2num(value)
+ secondtopiclimit = text2num(value)
if("error_cooldown")
error_cooldown = text2num(value)
if("error_limit")
@@ -531,75 +543,75 @@
else if(type == "game_options")
switch(name)
if("damage_multiplier")
- config.damage_multiplier = text2num(value)
+ damage_multiplier = text2num(value)
if("revival_pod_plants")
- config.revival_pod_plants = text2num(value)
+ revival_pod_plants = text2num(value)
if("revival_cloning")
- config.revival_cloning = text2num(value)
+ revival_cloning = text2num(value)
if("revival_brain_life")
- config.revival_brain_life = text2num(value)
+ revival_brain_life = text2num(value)
if("rename_cyborg")
- config.rename_cyborg = 1
+ rename_cyborg = 1
if("ooc_during_round")
- config.ooc_during_round = 1
+ ooc_during_round = 1
if("emojis")
- config.emojis = 1
+ emojis = 1
if("run_delay")
- config.run_speed = text2num(value)
+ run_speed = text2num(value)
if("walk_delay")
- config.walk_speed = text2num(value)
+ walk_speed = text2num(value)
if("human_delay")
- config.human_delay = text2num(value)
+ human_delay = text2num(value)
if("robot_delay")
- config.robot_delay = text2num(value)
+ robot_delay = text2num(value)
if("monkey_delay")
- config.monkey_delay = text2num(value)
+ monkey_delay = text2num(value)
if("alien_delay")
- config.alien_delay = text2num(value)
+ alien_delay = text2num(value)
if("slime_delay")
- config.slime_delay = text2num(value)
+ slime_delay = text2num(value)
if("animal_delay")
- config.animal_delay = text2num(value)
+ animal_delay = text2num(value)
if("alert_red_upto")
- config.alert_desc_red_upto = value
+ alert_desc_red_upto = value
if("alert_red_downto")
- config.alert_desc_red_downto = value
+ alert_desc_red_downto = value
if("alert_blue_downto")
- config.alert_desc_blue_downto = value
+ alert_desc_blue_downto = value
if("alert_blue_upto")
- config.alert_desc_blue_upto = value
+ alert_desc_blue_upto = value
if("alert_green")
- config.alert_desc_green = value
+ alert_desc_green = value
if("alert_delta")
- config.alert_desc_delta = value
+ alert_desc_delta = value
if("no_intercept_report")
- config.intercept = 0
+ intercept = 0
if("assistants_have_maint_access")
- config.jobs_have_maint_access |= ASSISTANTS_HAVE_MAINT_ACCESS
+ jobs_have_maint_access |= ASSISTANTS_HAVE_MAINT_ACCESS
if("security_has_maint_access")
- config.jobs_have_maint_access |= SECURITY_HAS_MAINT_ACCESS
+ jobs_have_maint_access |= SECURITY_HAS_MAINT_ACCESS
if("everyone_has_maint_access")
- config.jobs_have_maint_access |= EVERYONE_HAS_MAINT_ACCESS
+ jobs_have_maint_access |= EVERYONE_HAS_MAINT_ACCESS
if("sec_start_brig")
- config.sec_start_brig = 1
+ sec_start_brig = 1
if("gateway_delay")
- config.gateway_delay = text2num(value)
+ gateway_delay = text2num(value)
if("continuous")
var/mode_name = lowertext(value)
- if(mode_name in config.modes)
- config.continuous[mode_name] = 1
+ if(mode_name in modes)
+ continuous[mode_name] = 1
else
GLOB.diary << "Unknown continuous configuration definition: [mode_name]."
if("midround_antag")
var/mode_name = lowertext(value)
- if(mode_name in config.modes)
- config.midround_antag[mode_name] = 1
+ if(mode_name in modes)
+ midround_antag[mode_name] = 1
else
GLOB.diary << "Unknown midround antagonist configuration definition: [mode_name]."
if("midround_antag_time_check")
- config.midround_antag_time_check = text2num(value)
+ midround_antag_time_check = text2num(value)
if("midround_antag_life_check")
- config.midround_antag_life_check = text2num(value)
+ midround_antag_life_check = text2num(value)
if("min_pop")
var/pop_pos = findtext(value, " ")
var/mode_name = null
@@ -608,8 +620,8 @@
if(pop_pos)
mode_name = lowertext(copytext(value, 1, pop_pos))
mode_value = copytext(value, pop_pos + 1)
- if(mode_name in config.modes)
- config.min_pop[mode_name] = text2num(mode_value)
+ if(mode_name in modes)
+ min_pop[mode_name] = text2num(mode_value)
else
GLOB.diary << "Unknown minimum population configuration definition: [mode_name]."
else
@@ -622,28 +634,28 @@
if(pop_pos)
mode_name = lowertext(copytext(value, 1, pop_pos))
mode_value = copytext(value, pop_pos + 1)
- if(mode_name in config.modes)
- config.max_pop[mode_name] = text2num(mode_value)
+ if(mode_name in modes)
+ max_pop[mode_name] = text2num(mode_value)
else
GLOB.diary << "Unknown maximum population configuration definition: [mode_name]."
else
GLOB.diary << "Incorrect maximum population configuration definition: [mode_name] [mode_value]."
if("shuttle_refuel_delay")
- config.shuttle_refuel_delay = text2num(value)
+ shuttle_refuel_delay = text2num(value)
if("show_game_type_odds")
- config.show_game_type_odds = 1
+ show_game_type_odds = 1
if("ghost_interaction")
- config.ghost_interaction = 1
+ ghost_interaction = 1
if("traitor_scaling_coeff")
- config.traitor_scaling_coeff = text2num(value)
+ traitor_scaling_coeff = text2num(value)
if("changeling_scaling_coeff")
- config.changeling_scaling_coeff = text2num(value)
+ changeling_scaling_coeff = text2num(value)
if("security_scaling_coeff")
- config.security_scaling_coeff = text2num(value)
+ security_scaling_coeff = text2num(value)
if("abductor_scaling_coeff")
- config.abductor_scaling_coeff = text2num(value)
+ abductor_scaling_coeff = text2num(value)
if("traitor_objectives_amount")
- config.traitor_objectives_amount = text2num(value)
+ traitor_objectives_amount = text2num(value)
if("probability")
var/prob_pos = findtext(value, " ")
var/prob_name = null
@@ -652,51 +664,51 @@
if(prob_pos)
prob_name = lowertext(copytext(value, 1, prob_pos))
prob_value = copytext(value, prob_pos + 1)
- if(prob_name in config.modes)
- config.probabilities[prob_name] = text2num(prob_value)
+ if(prob_name in modes)
+ probabilities[prob_name] = text2num(prob_value)
else
GLOB.diary << "Unknown game mode probability configuration definition: [prob_name]."
else
GLOB.diary << "Incorrect probability configuration definition: [prob_name] [prob_value]."
if("protect_roles_from_antagonist")
- config.protect_roles_from_antagonist = 1
+ protect_roles_from_antagonist = 1
if("protect_assistant_from_antagonist")
- config.protect_assistant_from_antagonist = 1
+ protect_assistant_from_antagonist = 1
if("enforce_human_authority")
- config.enforce_human_authority = 1
+ enforce_human_authority = 1
if("allow_latejoin_antagonists")
- config.allow_latejoin_antagonists = 1
+ allow_latejoin_antagonists = 1
if("allow_random_events")
- config.allow_random_events = 1
+ allow_random_events = 1
if("events_min_time_mul")
- config.events_min_time_mul = text2num(value)
+ events_min_time_mul = text2num(value)
if("events_min_players_mul")
- config.events_min_players_mul = text2num(value)
+ events_min_players_mul = text2num(value)
if("minimal_access_threshold")
- config.minimal_access_threshold = text2num(value)
+ minimal_access_threshold = text2num(value)
if("jobs_have_minimal_access")
- config.jobs_have_minimal_access = 1
+ jobs_have_minimal_access = 1
if("humans_need_surnames")
humans_need_surnames = 1
if("force_random_names")
- config.force_random_names = 1
+ force_random_names = 1
if("allow_ai")
- config.allow_ai = 1
+ allow_ai = 1
if("disable_secborg")
- config.forbid_secborg = 1
+ forbid_secborg = 1
if("disable_peaceborg")
- config.forbid_peaceborg = 1
+ forbid_peaceborg = 1
if("silent_ai")
- config.silent_ai = 1
+ silent_ai = 1
if("silent_borg")
- config.silent_borg = 1
+ silent_borg = 1
if("sandbox_autoclose")
- config.sandbox_autoclose = 1
+ sandbox_autoclose = 1
if("default_laws")
- config.default_laws = text2num(value)
+ default_laws = text2num(value)
if("random_laws")
var/law_id = lowertext(value)
lawids += law_id
@@ -711,9 +723,9 @@
law_weights[lawid] = weight
if("silicon_max_law_amount")
- config.silicon_max_law_amount = text2num(value)
+ silicon_max_law_amount = text2num(value)
if("join_with_mutant_race")
- config.mutant_races = 1
+ mutant_races = 1
if("roundstart_races")
var/race_id = lowertext(value)
for(var/species_id in GLOB.species_list)
@@ -721,25 +733,25 @@
roundstart_races += GLOB.species_list[species_id]
GLOB.roundstart_species[species_id] = GLOB.species_list[species_id]
if("join_with_mutant_humans")
- config.mutant_humans = 1
+ mutant_humans = 1
if("assistant_cap")
- config.assistant_cap = text2num(value)
+ assistant_cap = text2num(value)
if("starlight")
- config.starlight = 1
+ starlight = 1
if("grey_assistants")
- config.grey_assistants = 1
+ grey_assistants = 1
if("lavaland_budget")
- config.lavaland_budget = text2num(value)
+ lavaland_budget = text2num(value)
if("space_budget")
- config.space_budget = text2num(value)
+ space_budget = text2num(value)
if("no_summon_guns")
- config.no_summon_guns = 1
+ no_summon_guns = 1
if("no_summon_magic")
- config.no_summon_magic = 1
+ no_summon_magic = 1
if("no_summon_events")
- config.no_summon_events = 1
+ no_summon_events = 1
if("reactionary_explosions")
- config.reactionary_explosions = 1
+ reactionary_explosions = 1
if("bombcap")
var/BombCap = text2num(value)
if (!BombCap)
@@ -753,13 +765,13 @@
GLOB.MAX_EX_FLASH_RANGE = BombCap
GLOB.MAX_EX_FLAME_RANGE = BombCap
if("arrivals_shuttle_dock_window")
- config.arrivals_shuttle_dock_window = max(PARALLAX_LOOP_TIME, text2num(value))
+ arrivals_shuttle_dock_window = max(PARALLAX_LOOP_TIME, text2num(value))
if("arrivals_shuttle_require_safe_latejoin")
- config.arrivals_shuttle_require_safe_latejoin = text2num(value)
+ arrivals_shuttle_require_safe_latejoin = text2num(value)
if ("mentor_mobname_only")
- config.mentors_mobname_only = 1
+ mentors_mobname_only = 1
if ("mentor_legacy_system")
- config.mentor_legacy_system = 1
+ mentor_legacy_system = 1
else
GLOB.diary << "Unknown setting in configuration: '[name]'"
@@ -810,9 +822,9 @@
if ("weight","voteweight")
currentmap.voteweight = text2num(data)
if ("default","defaultmap")
- config.defaultmap = currentmap
+ defaultmap = currentmap
if ("endmap")
- config.maplist[currentmap.map_name] = currentmap
+ maplist[currentmap.map_name] = currentmap
currentmap = null
else
GLOB.diary << "Unknown command in map vote config: '[command]'"
@@ -845,19 +857,19 @@
switch(name)
if("sql_enabled")
- config.sql_enabled = 1
+ sql_enabled = 1
if("address")
- GLOB.sqladdress = value
+ global.sqladdress = value
if("port")
- GLOB.sqlport = value
+ global.sqlport = value
if("feedback_database")
- GLOB.sqlfdbkdb = value
+ global.sqlfdbkdb = value
if("feedback_login")
- GLOB.sqlfdbklogin = value
+ global.sqlfdbklogin = value
if("feedback_password")
- GLOB.sqlfdbkpass = value
+ global.sqlfdbkpass = value
if("feedback_tableprefix")
- GLOB.sqlfdbktableprefix = value
+ global.sqlfdbktableprefix = value
else
GLOB.diary << "Unknown setting in configuration: '[name]'"
@@ -915,4 +927,4 @@
if(!statclick)
statclick = new/obj/effect/statclick/debug(null, "Edit", src)
- stat("[name]:", statclick)
\ No newline at end of file
+ stat("[name]:", statclick)
diff --git a/code/controllers/master.dm b/code/controllers/master.dm
index 259524bb0c..b4c5bc7d6d 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)
@@ -65,7 +69,7 @@ GLOBAL_VAR_INIT(CURRENT_TICKLIMIT, TICK_LIMIT_RUNNING)
else
init_subtypes(/datum/controller/subsystem, subsystems)
Master = src
-
+
if(!GLOB)
new /datum/controller/global_vars
diff --git a/code/controllers/subsystem/garbage.dm b/code/controllers/subsystem/garbage.dm
index 1fff5c6430..f0bfb6a76a 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/datums/action.dm b/code/datums/action.dm
index 03b293b13d..63de6b19e3 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/datumvars.dm b/code/datums/datumvars.dm
index 81079c5621..c40f39eb19 100644
--- a/code/datums/datumvars.dm
+++ b/code/datums/datumvars.dm
@@ -340,7 +340,7 @@
target="_parent._top"
onmouseclick="this.focus()"
style="background-color:#ffffff">
-
+
[dropdownoptions_html.Join()]
@@ -1084,7 +1084,7 @@
if("augment")
if(ishuman(C))
if(BP)
- BP.change_bodypart_status(BODYPART_ROBOTIC, 1)
+ BP.change_bodypart_status(BODYPART_ROBOTIC, TRUE, TRUE)
else
to_chat(usr, "[C] doesn't have such bodypart.")
else
diff --git a/code/datums/dna.dm b/code/datums/dna.dm
index ecc3e121f0..5150938258 100644
--- a/code/datums/dna.dm
+++ b/code/datums/dna.dm
@@ -247,13 +247,10 @@
dna.struc_enzymes = se
domutcheck()
- give_genitals(1)
-
if(mrace || newfeatures || ui)
update_body()
update_hair()
update_body_parts()
- update_genitals()
update_mutations_overlay()
diff --git a/code/datums/martial/krav_maga.dm b/code/datums/martial/krav_maga.dm
index 1a193db87b..5bc9b0588b 100644
--- a/code/datums/martial/krav_maga.dm
+++ b/code/datums/martial/krav_maga.dm
@@ -12,9 +12,13 @@
if(owner.incapacitated())
to_chat(owner, "You can't use Krav Maga while you're incapacitated.")
return
- owner.visible_message("[owner] assumes the Neck Chop stance!", "Your next attack will be a Neck Chop.")
var/mob/living/carbon/human/H = owner
- H.martial_art.streak = "neck_chop"
+ if (H.martial_art.streak == "neck_chop")
+ owner.visible_message("[owner] assumes a neutral stance.", "Your next attack is cleared.")
+ H.martial_art.streak = ""
+ else
+ owner.visible_message("[owner] assumes the Neck Chop stance!", "Your next attack will be a Neck Chop.")
+ H.martial_art.streak = "neck_chop"
/datum/action/leg_sweep
name = "Leg Sweep - Trips the victim, knocking them down for a brief moment."
@@ -24,9 +28,13 @@
if(owner.incapacitated())
to_chat(owner, "You can't use Krav Maga while you're incapacitated.")
return
- owner.visible_message("[owner] assumes the Leg Sweep stance!", "Your next attack will be a Leg Sweep.")
var/mob/living/carbon/human/H = owner
- H.martial_art.streak = "leg_sweep"
+ if (H.martial_art.streak == "leg_sweep")
+ owner.visible_message("[owner] assumes a neutral stance.", "Your next attack is cleared.")
+ H.martial_art.streak = ""
+ else
+ owner.visible_message("[owner] assumes the Leg Sweep stance!", "Your next attack will be a Leg Sweep.")
+ H.martial_art.streak = "leg_sweep"
/datum/action/lung_punch//referred to internally as 'quick choke'
name = "Lung Punch - Delivers a strong punch just above the victim's abdomen, constraining the lungs. The victim will be unable to breathe for a short time."
@@ -36,9 +44,13 @@
if(owner.incapacitated())
to_chat(owner, "You can't use Krav Maga while you're incapacitated.")
return
- owner.visible_message("[owner] assumes the Lung Punch stance!", "Your next attack will be a Lung Punch.")
var/mob/living/carbon/human/H = owner
- H.martial_art.streak = "quick_choke"//internal name for lung punch
+ if (H.martial_art.streak == "quick_choke")
+ owner.visible_message("[owner] assumes a neutral stance.", "Your next attack is cleared.")
+ H.martial_art.streak = ""
+ else
+ owner.visible_message("[owner] assumes the Lung Punch stance!", "Your next attack will be a Lung Punch.")
+ H.martial_art.streak = "quick_choke"//internal name for lung punch
/datum/martial_art/krav_maga/teach(var/mob/living/carbon/human/H,var/make_temporary=0)
..()
diff --git a/code/datums/riding.dm b/code/datums/riding.dm
index aa16730703..c069e0cdeb 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/area/Space_Station_13_areas.dm b/code/game/area/Space_Station_13_areas.dm
index ee369d73f7..426ab3220d 100644
--- a/code/game/area/Space_Station_13_areas.dm
+++ b/code/game/area/Space_Station_13_areas.dm
@@ -80,8 +80,8 @@ NOTE: there are two lists of areas in the end of this file: centcom and station
name = "Asteroid - Artifact"
icon_state = "cave"
-/area/asteroid/artifactroom/New()
- ..()
+/area/asteroid/artifactroom/Initialize()
+ . = ..()
set_dynamic_lighting()
/area/planet/clown
diff --git a/code/game/area/areas.dm b/code/game/area/areas.dm
index 4395e5155a..f346da191a 100644
--- a/code/game/area/areas.dm
+++ b/code/game/area/areas.dm
@@ -25,7 +25,7 @@
var/lightswitch = 1
var/requires_power = 1
- var/always_unpowered = 0 // This gets overriden to 1 for space in area/New().
+ var/always_unpowered = 0 // This gets overriden to 1 for space in area/Initialize().
var/outdoors = 0 //For space, the asteroid, lavaland, etc. Used with blueprints to determine if we are adding a new area (vs editing a station room)
diff --git a/code/game/atoms.dm b/code/game/atoms.dm
index c7ee05888c..ed04e8f529 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/antag_spawner.dm b/code/game/gamemodes/antag_spawner.dm
index 61b64337f1..74c16cf132 100644
--- a/code/game/gamemodes/antag_spawner.dm
+++ b/code/game/gamemodes/antag_spawner.dm
@@ -162,9 +162,7 @@
used = 1
var/mob/dead/observer/theghost = pick(nuke_candidates)
spawn_antag(theghost.client, get_turf(src), "syndieborg")
- var/datum/effect_system/spark_spread/S = new /datum/effect_system/spark_spread
- S.set_up(4, 1, src)
- S.start()
+ do_sparks(4, TRUE, src)
qdel(src)
else
to_chat(user, "Unable to connect to Syndicate command. Please wait and try again later or use the teleporter on your uplink to get your points refunded.")
diff --git a/code/game/gamemodes/blob/blobs/core.dm b/code/game/gamemodes/blob/blobs/core.dm
index 9c41d7b99b..7ae47f4c0e 100644
--- a/code/game/gamemodes/blob/blobs/core.dm
+++ b/code/game/gamemodes/blob/blobs/core.dm
@@ -15,7 +15,7 @@
var/point_rate = 2
-/obj/structure/blob/core/New(loc, client/new_overmind = null, new_rate = 2, placed = 0)
+/obj/structure/blob/core/Initialize(mapload, client/new_overmind = null, new_rate = 2, placed = 0)
GLOB.blob_cores += src
START_PROCESSING(SSobj, src)
GLOB.poi_list |= src
@@ -25,7 +25,7 @@
if(overmind)
update_icon()
point_rate = new_rate
- ..()
+ . = ..()
/obj/structure/blob/core/scannerreport()
return "Directs the blob's expansion, gradually expands, and sustains nearby blob spores and blobbernauts."
diff --git a/code/game/gamemodes/blob/blobs/node.dm b/code/game/gamemodes/blob/blobs/node.dm
index fcb2bf9be2..d778323ac2 100644
--- a/code/game/gamemodes/blob/blobs/node.dm
+++ b/code/game/gamemodes/blob/blobs/node.dm
@@ -10,10 +10,10 @@
point_return = 25
-/obj/structure/blob/node/New(loc)
+/obj/structure/blob/node/Initialize()
GLOB.blob_nodes += src
START_PROCESSING(SSobj, src)
- ..()
+ . = ..()
/obj/structure/blob/node/scannerreport()
return "Gradually expands and sustains nearby blob spores and blobbernauts."
diff --git a/code/game/gamemodes/blob/theblob.dm b/code/game/gamemodes/blob/theblob.dm
index 1931629e62..3ae9e3e8d6 100644
--- a/code/game/gamemodes/blob/theblob.dm
+++ b/code/game/gamemodes/blob/theblob.dm
@@ -21,14 +21,14 @@
var/mob/camera/blob/overmind
-/obj/structure/blob/New(loc)
+/obj/structure/blob/Initialize()
var/area/Ablob = get_area(loc)
if(Ablob.blob_allowed) //Is this area allowed for winning as blob?
GLOB.blobs_legit += src
GLOB.blobs += src //Keep track of the blob in the normal list either way
setDir(pick(GLOB.cardinal))
update_icon()
- ..()
+ .= ..()
ConsumeTile()
if(atmosblock)
CanAtmosPass = ATMOS_PASS_NO
@@ -99,7 +99,7 @@
var/list/blobs_to_affect = list()
for(var/obj/structure/blob/B in urange(claim_range, src, 1))
blobs_to_affect += B
- shuffle(blobs_to_affect)
+ shuffle_inplace(blobs_to_affect)
for(var/L in blobs_to_affect)
var/obj/structure/blob/B = L
if(!B.overmind && !istype(B, /obj/structure/blob/core) && prob(30))
diff --git a/code/game/gamemodes/changeling/powers/fleshmend.dm b/code/game/gamemodes/changeling/powers/fleshmend.dm
index 1809e6c8c8..dd9d4a8634 100644
--- a/code/game/gamemodes/changeling/powers/fleshmend.dm
+++ b/code/game/gamemodes/changeling/powers/fleshmend.dm
@@ -11,8 +11,8 @@
// divided by healing_ticks to get heal/tick
var/total_healing = 100
-/obj/effect/proc_holder/changeling/fleshmend/New()
- ..()
+/obj/effect/proc_holder/changeling/fleshmend/Initialize()
+ . = ..()
START_PROCESSING(SSobj, src)
/obj/effect/proc_holder/changeling/fleshmend/Destroy()
diff --git a/code/game/gamemodes/changeling/powers/mutations.dm b/code/game/gamemodes/changeling/powers/mutations.dm
index 57db295d53..54e8ea1e38 100644
--- a/code/game/gamemodes/changeling/powers/mutations.dm
+++ b/code/game/gamemodes/changeling/powers/mutations.dm
@@ -162,8 +162,8 @@
sharpness = IS_SHARP
var/can_drop = FALSE
-/obj/item/weapon/melee/arm_blade/New(location,silent,synthetic)
- ..()
+/obj/item/weapon/melee/arm_blade/Initialize(mapload,silent,synthetic)
+ . = ..()
if(ismob(loc) && !silent)
loc.visible_message("A grotesque blade forms around [loc.name]\'s arm!", "Our arm twists and mutates, transforming it into a deadly blade.", "You hear organic matter ripping and tearing!")
if(synthetic)
@@ -240,8 +240,8 @@
throw_range = 0
throw_speed = 0
-/obj/item/weapon/gun/magic/tentacle/New(location,silent)
- ..()
+/obj/item/weapon/gun/magic/tentacle/Initialize(mapload, silent)
+ . = ..()
if(ismob(loc))
if(!silent)
loc.visible_message("[loc.name]\'s arm starts stretching inhumanly!", "Our arm twists and mutates, transforming it into a tentacle.", "You hear organic matter ripping and tearing!")
@@ -266,9 +266,9 @@
firing_effect_type = null
var/obj/item/weapon/gun/magic/tentacle/gun //the item that shot it
-/obj/item/ammo_casing/magic/tentacle/New(obj/item/weapon/gun/magic/tentacle/tentacle_gun)
- gun = tentacle_gun
- ..()
+/obj/item/ammo_casing/magic/tentacle/Initialize()
+ gun = loc
+ . = ..()
/obj/item/ammo_casing/magic/tentacle/Destroy()
gun = null
@@ -285,9 +285,9 @@
var/chain
var/obj/item/ammo_casing/magic/tentacle/source //the item that shot it
-/obj/item/projectile/tentacle/New(obj/item/ammo_casing/magic/tentacle/tentacle_casing)
- source = tentacle_casing
- ..()
+/obj/item/projectile/tentacle/Initialize()
+ source = loc
+ . = ..()
/obj/item/projectile/tentacle/fire(setAngle)
if(firer)
@@ -407,8 +407,8 @@
var/remaining_uses //Set by the changeling ability.
-/obj/item/weapon/shield/changeling/New()
- ..()
+/obj/item/weapon/shield/changeling/Initialize()
+ . = ..()
if(ismob(loc))
loc.visible_message("The end of [loc.name]\'s hand inflates rapidly, forming a huge shield-like mass!", "We inflate our hand into a strong shield.", "You hear organic matter ripping and tearing!")
@@ -452,8 +452,8 @@
allowed = list(/obj/item/device/flashlight, /obj/item/weapon/tank/internals/emergency_oxygen, /obj/item/weapon/tank/internals/oxygen)
armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 0, rad = 0, fire = 90, acid = 90) //No armor at all.
-/obj/item/clothing/suit/space/changeling/New()
- ..()
+/obj/item/clothing/suit/space/changeling/Initialize()
+ . = ..()
if(ismob(loc))
loc.visible_message("[loc.name]\'s flesh rapidly inflates, forming a bloated mass around their body!", "We inflate our flesh, creating a spaceproof suit!", "You hear organic matter ripping and tearing!")
START_PROCESSING(SSobj, src)
@@ -501,8 +501,8 @@
cold_protection = 0
heat_protection = 0
-/obj/item/clothing/suit/armor/changeling/New()
- ..()
+/obj/item/clothing/suit/armor/changeling/Initialize()
+ . = ..()
if(ismob(loc))
loc.visible_message("[loc.name]\'s flesh turns black, quickly transforming into a hard, chitinous mass!", "We harden our flesh, creating a suit of armor!", "You hear organic matter ripping and tearing!")
diff --git a/code/game/gamemodes/clock_cult/clock_helpers/clock_powerdrain.dm b/code/game/gamemodes/clock_cult/clock_helpers/clock_powerdrain.dm
index 2691036cf1..705273876c 100644
--- a/code/game/gamemodes/clock_cult/clock_helpers/clock_powerdrain.dm
+++ b/code/game/gamemodes/clock_cult/clock_helpers/clock_powerdrain.dm
@@ -21,10 +21,8 @@
if(!charge && !panel_open)
panel_open = TRUE
icon_state = "[initial(icon_state)]-o"
- var/datum/effect_system/spark_spread/spks = new(get_turf(src))
- spks.set_up(10, 0, get_turf(src))
- spks.start()
- visible_message("[src]'s panel flies open with a flurry of spark")
+ do_sparks(10, FALSE, src)
+ visible_message("[src]'s panel flies open with a flurry of sparks!")
update_icon()
/obj/item/weapon/stock_parts/cell/power_drain(clockcult_user)
diff --git a/code/game/gamemodes/cult/runes.dm b/code/game/gamemodes/cult/runes.dm
index e58a7912b2..f471dc3477 100644
--- a/code/game/gamemodes/cult/runes.dm
+++ b/code/game/gamemodes/cult/runes.dm
@@ -124,7 +124,7 @@ structure_check() searches for nearby cultist structures required for the invoca
if(allow_excess_invokers)
chanters += invokers
else
- shuffle(invokers)
+ shuffle_inplace(invokers)
for(var/i in 1 to req_cultists)
var/L = pick_n_take(invokers)
if(L)
diff --git a/code/game/gamemodes/devil/devil_game_mode.dm b/code/game/gamemodes/devil/devil_game_mode.dm
index 70775dfe9d..9a528a1240 100644
--- a/code/game/gamemodes/devil/devil_game_mode.dm
+++ b/code/game/gamemodes/devil/devil_game_mode.dm
@@ -50,12 +50,16 @@
/datum/game_mode/devil/post_setup()
for(var/datum/mind/devil in devils)
- spawn(rand(10,100))
- finalize_devil(devil, TRUE)
- spawn(100)
- add_devil_objectives(devil, objective_count) //This has to be in a separate loop, as we need devil names to be generated before we give objectives in devil agent.
- devil.announceDevilLaws()
- devil.announce_objectives()
+ post_setup_finalize(devil)
modePlayer += devils
..()
return 1
+
+/datum/game_mode/devil/proc/post_setup_finalize(datum/mind/devil)
+ set waitfor = FALSE
+ sleep(rand(10,100))
+ finalize_devil(devil, TRUE)
+ sleep(100)
+ add_devil_objectives(devil, objective_count) //This has to be in a separate loop, as we need devil names to be generated before we give objectives in devil agent.
+ devil.announceDevilLaws()
+ devil.announce_objectives()
\ No newline at end of file
diff --git a/code/game/gamemodes/devil/game_mode.dm b/code/game/gamemodes/devil/game_mode.dm
index f311a289e0..515a6e4c97 100644
--- a/code/game/gamemodes/devil/game_mode.dm
+++ b/code/game/gamemodes/devil/game_mode.dm
@@ -31,7 +31,7 @@
/datum/game_mode/proc/finalize_devil(datum/mind/devil_mind, ascendable = FALSE)
-
+ set waitfor = FALSE
var/trueName= randomDevilName()
devil_mind.devilinfo = devilInfo(trueName, 1)
@@ -39,14 +39,14 @@
devil_mind.store_memory("Your devilic true name is [devil_mind.devilinfo.truename]
[GLOB.lawlorify[LAW][devil_mind.devilinfo.ban]]
You may not use violence to coerce someone into selling their soul.
You may not directly and knowingly physically harm a devil, other than yourself.
[GLOB.lawlorify[LAW][devil_mind.devilinfo.bane]]
[GLOB.lawlorify[LAW][devil_mind.devilinfo.obligation]]
[GLOB.lawlorify[LAW][devil_mind.devilinfo.banish]]
")
devil_mind.devilinfo.owner = devil_mind
devil_mind.devilinfo.give_base_spells(1)
- spawn(10)
- devil_mind.devilinfo.update_hud()
- if(devil_mind.assigned_role == "Clown" && ishuman(devil_mind.current))
- var/mob/living/carbon/human/S = devil_mind.current
- to_chat(S, "Your infernal nature has allowed you to overcome your clownishness.")
- S.dna.remove_mutation(CLOWNMUT)
if(issilicon(devil_mind.current))
add_law_sixsixsix(devil_mind.current)
+ sleep(10)
+ devil_mind.devilinfo.update_hud()
+ if(devil_mind.assigned_role == "Clown" && ishuman(devil_mind.current))
+ var/mob/living/carbon/human/S = devil_mind.current
+ to_chat(S, "Your infernal nature has allowed you to overcome your clownishness.")
+ S.dna.remove_mutation(CLOWNMUT)
/datum/game_mode/proc/add_devil_objectives(datum/mind/devil_mind, quantity)
var/list/validtypes = list(/datum/objective/devil/soulquantity, /datum/objective/devil/soulquality, /datum/objective/devil/sintouch, /datum/objective/devil/buy_target)
diff --git a/code/game/gamemodes/devil/true_devil/_true_devil.dm b/code/game/gamemodes/devil/true_devil/_true_devil.dm
index 7f908756b9..eb2921c966 100644
--- a/code/game/gamemodes/devil/true_devil/_true_devil.dm
+++ b/code/game/gamemodes/devil/true_devil/_true_devil.dm
@@ -60,8 +60,7 @@
stat = DEAD
..(gibbed)
drop_all_held_items()
- spawn (0)
- mind.devilinfo.beginResurrectionCheck(src)
+ INVOKE_ASYNC(mind.devilinfo, /datum/devilinfo/proc/beginResurrectionCheck, src)
/mob/living/carbon/true_devil/examine(mob/user)
diff --git a/code/game/gamemodes/game_mode.dm b/code/game/gamemodes/game_mode.dm
index 7dda5a619e..2564d1b262 100644
--- a/code/game/gamemodes/game_mode.dm
+++ b/code/game/gamemodes/game_mode.dm
@@ -75,11 +75,10 @@
///Everyone should now be on the station and have their normal gear. This is the place to give the special roles extra things
-/datum/game_mode/proc/post_setup(report=0) //Gamemodes can override the intercept report. Passing a 1 as the argument will force a report.
+/datum/game_mode/proc/post_setup(report) //Gamemodes can override the intercept report. Passing TRUE as the argument will force a report.
if(!report)
report = config.intercept
- spawn (ROUNDSTART_LOGOUT_REPORT_TIME)
- display_roundstart_logout_report()
+ addtimer(CALLBACK(GLOBAL_PROC, .proc/display_roundstart_logout_report), ROUNDSTART_LOGOUT_REPORT_TIME)
feedback_set_details("round_start","[time2text(world.realtime)]")
if(SSticker && SSticker.mode)
@@ -88,8 +87,7 @@
feedback_set_details("revision","[GLOB.revdata.commit]")
feedback_set_details("server_ip","[world.internet_address]:[world.port]")
if(report)
- spawn (rand(waittime_l, waittime_h))
- send_intercept(0)
+ addtimer(CALLBACK(src, .proc/send_intercept, 0), rand(waittime_l, waittime_h))
generate_station_goals()
GLOB.start_state = new /datum/station_state()
GLOB.start_state.count(1)
@@ -105,6 +103,7 @@
///Allows rounds to basically be "rerolled" should the initial premise fall through. Also known as mulligan antags.
/datum/game_mode/proc/convert_roundtype()
+ set waitfor = FALSE
var/list/living_crew = list()
for(var/mob/Player in GLOB.mob_list)
@@ -158,15 +157,16 @@
message_admins("The roundtype will be converted. If you have other plans for the station or feel the station is too messed up to inhabit stop the creation of antags or end the round now.")
- spawn(rand(600,1800)) //somewhere between 1 and 3 minutes from now
- if(!config.midround_antag[SSticker.mode.config_tag])
- round_converted = 0
- return 1
- for(var/mob/living/carbon/human/H in antag_candidates)
- replacementmode.make_antag_chance(H)
- round_converted = 2
- message_admins("-- IMPORTANT: The roundtype has been converted to [replacementmode.name], antagonists may have been created! --")
- return 1
+ . = 1
+ sleep(rand(600,1800))
+ //somewhere between 1 and 3 minutes from now
+ if(!config.midround_antag[SSticker.mode.config_tag])
+ round_converted = 0
+ return 1
+ for(var/mob/living/carbon/human/H in antag_candidates)
+ replacementmode.make_antag_chance(H)
+ round_converted = 2
+ message_admins("-- IMPORTANT: The roundtype has been converted to [replacementmode.name], antagonists may have been created! --")
///Called by the gameSSticker
diff --git a/code/game/gamemodes/gang/dominator.dm b/code/game/gamemodes/gang/dominator.dm
index 1e48e69d39..54099070cd 100644
--- a/code/game/gamemodes/gang/dominator.dm
+++ b/code/game/gamemodes/gang/dominator.dm
@@ -24,7 +24,7 @@
set_light(2)
GLOB.poi_list |= src
spark_system = new
- spark_system.set_up(5, 1, src)
+ spark_system.set_up(5, TRUE, src)
countdown = new(src)
/obj/machinery/dominator/examine(mob/user)
@@ -129,9 +129,8 @@
set_broken()
GLOB.poi_list.Remove(src)
gang = null
- qdel(spark_system)
- qdel(countdown)
- countdown = null
+ QDEL_NULL(spark_system)
+ QDEL_NULL(countdown)
STOP_PROCESSING(SSmachines, src)
return ..()
diff --git a/code/game/gamemodes/gang/gang.dm b/code/game/gamemodes/gang/gang.dm
index 51a9d21195..22ca4b2298 100644
--- a/code/game/gamemodes/gang/gang.dm
+++ b/code/game/gamemodes/gang/gang.dm
@@ -73,15 +73,16 @@ GLOBAL_LIST_INIT(gang_colors_pool, list("red","orange","yellow","green","blue","
/datum/game_mode/gang/post_setup()
- spawn(rand(10,100))
- for(var/datum/gang/G in gangs)
- for(var/datum/mind/boss_mind in G.bosses)
- G.add_gang_hud(boss_mind)
- forge_gang_objectives(boss_mind)
- greet_gang(boss_mind)
- equip_gang(boss_mind.current,G)
- modePlayer += boss_mind
+ set waitfor = FALSE
..()
+ sleep(rand(10,100))
+ for(var/datum/gang/G in gangs)
+ for(var/datum/mind/boss_mind in G.bosses)
+ G.add_gang_hud(boss_mind)
+ forge_gang_objectives(boss_mind)
+ greet_gang(boss_mind)
+ equip_gang(boss_mind.current,G)
+ modePlayer += boss_mind
/datum/game_mode/proc/forge_gang_objectives(datum/mind/boss_mind)
diff --git a/code/game/gamemodes/gang/gang_pen.dm b/code/game/gamemodes/gang/gang_pen.dm
index 5045c27485..0e01532190 100644
--- a/code/game/gamemodes/gang/gang_pen.dm
+++ b/code/game/gamemodes/gang/gang_pen.dm
@@ -36,6 +36,7 @@
..()
/obj/item/weapon/pen/gang/proc/cooldown(datum/gang/gang)
+ set waitfor = FALSE
var/cooldown_time = 600+(600*gang.bosses.len) // 1recruiter=2mins, 2recruiters=3mins, 3recruiters=4mins
cooldown = 1
@@ -52,8 +53,8 @@
if(charges)
cooldown_time = 50
- spawn(cooldown_time)
- cooldown = 0
- icon_state = "pen"
- var/mob/M = get(src, /mob)
- to_chat(M, "\icon[src] [src][(src.loc == M)?(""):(" in your [src.loc]")] vibrates softly. It is ready to be used again.")
+ sleep(cooldown_time)
+ cooldown = 0
+ icon_state = "pen"
+ var/mob/M = get(src, /mob)
+ to_chat(M, "\icon[src] [src][(src.loc == M)?(""):(" in your [src.loc]")] vibrates softly. It is ready to be used again.")
diff --git a/code/game/gamemodes/malfunction/Malf_Modules.dm b/code/game/gamemodes/malfunction/Malf_Modules.dm
index d581af11b9..a7c466e746 100644
--- a/code/game/gamemodes/malfunction/Malf_Modules.dm
+++ b/code/game/gamemodes/malfunction/Malf_Modules.dm
@@ -192,19 +192,20 @@
set category = "Malfunction"
set name = "Destroy RCDs"
set desc = "Detonate all RCDs on the station, while sparing onboard cyborg RCDs."
+ set waitfor = FALSE
if(!canUseTopic() || malf_cooldown)
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.")
- malf_cooldown = 1
- spawn(100)
- malf_cooldown = 0
+ malf_cooldown = TRUE
+ sleep(100)
+ malf_cooldown = FALSE
/datum/AI_Module/large/mecha_domination
module_name = "Viral Mech Domination"
diff --git a/code/game/gamemodes/miniantags/borer/borer.dm b/code/game/gamemodes/miniantags/borer/borer.dm
index a8bfab458a..122d2c34ba 100644
--- a/code/game/gamemodes/miniantags/borer/borer.dm
+++ b/code/game/gamemodes/miniantags/borer/borer.dm
@@ -1072,4 +1072,4 @@ GLOBAL_VAR_INIT(total_borer_hosts_needed, 10)
/datum/action/innate/borer/jumpstart_host/Activate()
var/mob/living/simple_animal/borer/B = owner
- B.jumpstart()
+ B.jumpstart()
\ No newline at end of file
diff --git a/code/game/gamemodes/sandbox/h_sandbox.dm b/code/game/gamemodes/sandbox/h_sandbox.dm
index 722fabc81d..6b308357ec 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/gamemodes/traitor/double_agents.dm b/code/game/gamemodes/traitor/double_agents.dm
index 68b92eea70..992e10fa22 100644
--- a/code/game/gamemodes/traitor/double_agents.dm
+++ b/code/game/gamemodes/traitor/double_agents.dm
@@ -65,7 +65,7 @@
// As soon as we get 3 or 4 extra latejoin traitors, make them traitors and kill each other.
if(late_joining_list.len >= rand(3, 4))
// True randomness
- shuffle(late_joining_list)
+ shuffle_inplace(late_joining_list)
// Reset the target_list, it'll be used again in force_traitor_objectives
target_list = list()
diff --git a/code/game/gamemodes/wizard/artefact.dm b/code/game/gamemodes/wizard/artefact.dm
index 2a5eaef299..13084fab64 100644
--- a/code/game/gamemodes/wizard/artefact.dm
+++ b/code/game/gamemodes/wizard/artefact.dm
@@ -329,7 +329,7 @@
if("cyborg")
for(var/X in M.bodyparts)
var/obj/item/bodypart/affecting = X
- affecting.change_bodypart_status(BODYPART_ROBOTIC)
+ affecting.change_bodypart_status(BODYPART_ROBOTIC, FALSE, TRUE)
M.equip_to_slot_or_del(new /obj/item/clothing/glasses/thermal/eyepatch(M), slot_glasses)
M.put_in_hands_or_del(sword)
diff --git a/code/game/gamemodes/wizard/raginmages.dm b/code/game/gamemodes/wizard/raginmages.dm
index c9831d8347..01eb8a52c4 100644
--- a/code/game/gamemodes/wizard/raginmages.dm
+++ b/code/game/gamemodes/wizard/raginmages.dm
@@ -117,7 +117,7 @@
mages_made--
return
else
- shuffle(candidates)
+ shuffle_inplace(candidates)
for(var/mob/i in candidates)
if(!i || !i.client) continue //Dont bother removing them from the list since we only grab one wizard
diff --git a/code/game/machinery/cloning.dm b/code/game/machinery/cloning.dm
index 433470bf1b..78dce54101 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 f0adeac226..39cdb1478c 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/computer/computer.dm b/code/game/machinery/computer/computer.dm
index 2a2c02f72b..74fcf77ce5 100644
--- a/code/game/machinery/computer/computer.dm
+++ b/code/game/machinery/computer/computer.dm
@@ -35,7 +35,7 @@
return ..()
/obj/machinery/computer/Initialize()
- ..()
+ . = ..()
power_change()
/obj/machinery/computer/process()
diff --git a/code/game/machinery/dance_machine.dm b/code/game/machinery/dance_machine.dm
new file mode 100644
index 0000000000..0876e5c1f7
--- /dev/null
+++ b/code/game/machinery/dance_machine.dm
@@ -0,0 +1,514 @@
+// DISCO DANCE MACHINE - For engineering power optimization incentive nurturing test system (POINTS)
+
+/obj/machinery/disco
+ name = "radiant dance machine mark IV"
+ desc = "The first three prototypes were discontinued after mass casualty incidents."
+ icon = 'icons/obj/lighting.dmi'
+ icon_state = "disco0"
+ anchored = FALSE
+ verb_say = "states"
+ density = TRUE
+ req_access = list(GLOB.access_engine)
+ var/active = FALSE
+ var/list/rangers = list()
+ var/list/listeners = list()
+ var/charge = 35
+ var/stop = 0
+ var/list/available = list()
+ var/list/select_name = list()
+ var/list/spotlights = list()
+ var/list/sparkles = list()
+ var/static/list/songs = list(
+ new /datum/track("Engineering's Basic Beat", 'sound/misc/disco.ogg', 600, 5),
+ new /datum/track("Engineering's Domination Dance", 'sound/misc/e1m1.ogg', 950, 6),
+ new /datum/track("Engineering's Superiority Shimmy", 'sound/misc/Paradox.ogg', 2400, 4),
+ new /datum/track("Engineering's Ultimate High-Energy Hustle", 'sound/misc/boogie2.ogg', 1770, 5),
+ )
+ var/datum/track/selection = null
+
+/datum/track
+ var/song_name = "generic"
+ var/song_path = null
+ var/song_length = 0
+ var/song_beat = 0
+
+/datum/track/New(name, path, length, beat)
+ song_name = name
+ song_path = path
+ song_length = length
+ song_beat = beat
+
+/obj/machinery/disco/Initialize()
+ ..()
+ selection = songs[1]
+
+
+/obj/machinery/disco/Destroy()
+ dance_over()
+ return ..()
+
+/obj/machinery/disco/attackby(obj/item/O, mob/user, params)
+ if(!active)
+ if(istype(O, /obj/item/weapon/wrench))
+ if(!anchored && !isinspace())
+ to_chat(user,"You secure the [src] to the floor.")
+ anchored = TRUE
+ else if(anchored)
+ to_chat(user,"You unsecure and disconnect the [src].")
+ anchored = FALSE
+ playsound(src, 'sound/items/Deconstruct.ogg', 50, 1)
+ return
+ return ..()
+
+/obj/machinery/disco/update_icon()
+ if(active)
+ icon_state = "disco1"
+ else
+ icon_state = "disco0"
+ ..()
+
+
+/obj/machinery/disco/interact(mob/user)
+ if (!anchored)
+ to_chat(user,"This device must be anchored by a wrench!")
+ return
+ if(!allowed(user))
+ to_chat(user,"Error: Access Denied - Message: Only the engineering department can be trusted with this kind of power.")
+ playsound(src, 'sound/misc/compiler-failure.ogg', 50, 1)
+ return
+ if(!Adjacent(user) && !isAI(user))
+ return
+ user.set_machine(src)
+ var/list/dat = list()
+ dat +="