diff --git a/_maps/__MAP_DEFINES.dm b/_maps/__MAP_DEFINES.dm
index be9889b91e7..a3a14443cda 100644
--- a/_maps/__MAP_DEFINES.dm
+++ b/_maps/__MAP_DEFINES.dm
@@ -1,6 +1,32 @@
+
+// Linkage flags
#define CROSSLINKED 2
#define SELFLOOPING 1
#define UNAFFECTED 0
+// Attributes (In text for the convenience of those using VV)
+ #define BLOCK_TELEPORT "Blocks Teleport"
+ // Impedes with the casting of some spells
+ #define IMPEDES_MAGIC "Impedes Magic"
+ // A level the station exists on
+ #define STATION_LEVEL "Station Level"
+ // A level affected by Code Red announcements, cargo telepads, or similar
+ #define STATION_CONTACT "Station Contact"
+ // A level dedicated to admin use
+ #define ADMIN_LEVEL "Admin Level"
+ // A level that can be navigated to through space
+ #define REACHABLE "Reachable"
+ // For away missions - used by some consoles
+ #define AWAY_LEVEL "Away"
+ // Allows weather
+ #define HAS_WEATHER "Weather"
+ // Enhances telecomms signals
+ #define BOOSTS_SIGNAL "Boosts signals"
+ // Currently used for determining mining score
+ #define ORE_LEVEL "Mining"
+ // Levels the AI can control bots on
+ #define AI_OK "AI Allowed"
+
+// Level names
#define MAIN_STATION "Main Station"
#define CENTCOMM "CentComm"
#define TELECOMMS "Telecomms Satellite"
@@ -10,4 +36,8 @@
#define EMPTY_AREA "Empty Area"
#define EMPTY_AREA_2 "Empty Area 2"
#define AWAY_MISSION "Away Mission"
- #define AWAY_MISSION_LIST list(AWAY_MISSION = UNAFFECTED)
+
+// Convenience define
+ #define DECLARE_LEVEL(NAME,LINKS,TRAITS) list("name" = NAME, "linkage" = LINKS, "attributes" = TRAITS)
+
+ #define AWAY_MISSION_LIST list(DECLARE_LEVEL(AWAY_MISSION,UNAFFECTED,list(BLOCK_TELEPORT, AWAY_LEVEL)))
diff --git a/_maps/cyberiad.dm b/_maps/cyberiad.dm
index a2f78f9d26c..434cc79eb52 100644
--- a/_maps/cyberiad.dm
+++ b/_maps/cyberiad.dm
@@ -24,7 +24,14 @@ z7 = empty
#define MAP_FILE "cyberiad.dmm"
#define MAP_NAME "NSS Cyberiad"
- #define MAP_TRANSITION_CONFIG list(MAIN_STATION = CROSSLINKED, CENTCOMM = SELFLOOPING, TELECOMMS = CROSSLINKED, CONSTRUCTION = CROSSLINKED, MINING = CROSSLINKED, DERELICT = CROSSLINKED, EMPTY_AREA = CROSSLINKED)
+ #define MAP_TRANSITION_CONFIG list(\
+DECLARE_LEVEL(MAIN_STATION, CROSSLINKED, list(STATION_LEVEL,STATION_CONTACT,REACHABLE,AI_OK)),\
+DECLARE_LEVEL(CENTCOMM, SELFLOOPING, list(ADMIN_LEVEL, BLOCK_TELEPORT, IMPEDES_MAGIC)),\
+DECLARE_LEVEL(TELECOMMS, CROSSLINKED, list(REACHABLE, BOOSTS_SIGNAL, AI_OK)),\
+DECLARE_LEVEL(CONSTRUCTION, CROSSLINKED, list(REACHABLE)),\
+DECLARE_LEVEL(MINING, CROSSLINKED, list(REACHABLE, STATION_CONTACT, HAS_WEATHER, ORE_LEVEL, AI_OK)),\
+DECLARE_LEVEL(DERELICT, CROSSLINKED, list(REACHABLE)),\
+DECLARE_LEVEL(EMPTY_AREA, CROSSLINKED, list(REACHABLE)))
#elif !defined(MAP_OVERRIDE)
diff --git a/_maps/map_files/MetaStation/MetaStation.v41A.II.dmm b/_maps/map_files/MetaStation/MetaStation.v41A.II.dmm
index 28528b8fa64..af126988b77 100644
--- a/_maps/map_files/MetaStation/MetaStation.v41A.II.dmm
+++ b/_maps/map_files/MetaStation/MetaStation.v41A.II.dmm
@@ -1050,7 +1050,7 @@
"auj" = (/obj/structure/stool{pixel_y = 8},/obj/machinery/camera/autoname{dir = 4; network = list("SS13")},/turf/simulated/floor/plating,/area/maintenance/auxsolarstarboard)
"auk" = (/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"; tag = "90Curve"},/obj/machinery/atmospherics/unary/vent_pump{dir = 2; on = 1},/obj/effect/landmark{name = "xeno_spawn"; pixel_x = -1},/turf/simulated/floor/plating,/area/maintenance/auxsolarstarboard)
"aul" = (/obj/structure/cable{d2 = 8; icon_state = "0-8"},/obj/machinery/power/terminal,/obj/machinery/light/small{dir = 4},/obj/item/device/radio/intercom{frequency = 1459; name = "Station Intercom (General)"; pixel_x = 29},/turf/simulated/floor/plating,/area/maintenance/auxsolarstarboard)
-"aum" = (/obj/machinery/door/airlock/maintenance{icon = 'icons/obj/doors/Doorint.dmi'; name = "Brig Emergency Storage"; req_access_txt = "63"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plating,/area/security/brig)
+"aum" = (/obj/machinery/door/airlock/maintenance{icon = 'icons/obj/doors/doorint.dmi'; name = "Brig Emergency Storage"; req_access_txt = "63"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plating,/area/security/brig)
"aun" = (/obj/machinery/space_heater,/turf/simulated/floor/plasteel,/area/security/podbay)
"auo" = (/obj/machinery/light{dir = 1; in_use = 1},/turf/simulated/floor/plasteel{icon_state = "vault"; dir = 5},/area/maintenance/starboard)
"aup" = (/obj/structure/lattice,/obj/structure/grille{density = 0; icon_state = "brokengrille"},/turf/space,/area/space)
@@ -3353,7 +3353,7 @@
"bmy" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 4},/obj/structure/cable/yellow{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/structure/disposalpipe/junction{dir = 2; icon_state = "pipe-j1"},/turf/simulated/floor/plasteel,/area/hallway/primary/port)
"bmz" = (/turf/simulated/floor/plasteel{dir = 2; icon_state = "browncorner"},/area/hallway/primary/port)
"bmA" = (/obj/machinery/door/firedoor,/turf/simulated/floor/plasteel{dir = 2; icon_state = "brown"},/area/hallway/primary/port)
-"bmB" = (/obj/machinery/door/airlock{icon = 'icons/obj/doors/Doorint.dmi'; name = "Starboard Emergency Storage"; req_access_txt = "0"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plating,/area/maintenance/starboard)
+"bmB" = (/obj/machinery/door/airlock{icon = 'icons/obj/doors/doorint.dmi'; name = "Starboard Emergency Storage"; req_access_txt = "0"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plating,/area/maintenance/starboard)
"bmC" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/mob/living/simple_animal/lizard{name = "Wags-His-Tail"; real_name = "Wags-His-Tail"},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/janitor)
"bmD" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/cable/yellow{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/effect/landmark/start{name = "Janitor"},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/janitor)
"bmE" = (/obj/structure/sink{dir = 4; icon_state = "sink"; pixel_x = 11; pixel_y = 0},/obj/item/weapon/reagent_containers/glass/bucket,/obj/item/weapon/mop,/obj/structure/disposalpipe/segment,/obj/machinery/firealarm{dir = 4; pixel_x = 24},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/janitor)
@@ -6131,7 +6131,7 @@
"cnU" = (/obj/structure/reagent_dispensers/watertank,/obj/item/weapon/extinguisher,/obj/machinery/light/small,/obj/structure/extinguisher_cabinet{pixel_x = 0; pixel_y = -31},/turf/simulated/floor/plating,/area/maintenance/incinerator)
"cnV" = (/obj/structure/disposalpipe/segment,/obj/machinery/computer/turbine_computer{id = "incineratorturbine"},/obj/machinery/atmospherics/pipe/simple/insulated,/obj/machinery/computer/security/telescreen{desc = "Used for watching the turbine vent."; dir = 8; name = "turbine vent monitor"; network = list("Turbine"); pixel_x = 29; pixel_y = 0},/obj/machinery/door_control{id = "turbinevent"; name = "Turbine Vent Control"; pixel_x = 24; pixel_y = -24; req_access_txt = "12"},/turf/simulated/floor/plating,/area/maintenance/incinerator)
"cnW" = (/obj/machinery/door/airlock/glass{autoclose = 0; frequency = 1449; heat_proof = 1; icon_state = "door_locked"; id_tag = "incinerator_airlock_exterior"; locked = 1; name = "Incinerator Exterior Airlock"; req_access_txt = "12"},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/turf/simulated/floor/plasteel,/area/maintenance/incinerator)
-"cnX" = (/obj/machinery/atmospherics/pipe/simple/insulated,/turf/simulated/wall/r_wall,/area/maintenance/incinerator)
+"cnX" = (/obj/machinery/atmospherics/pipe/simple/visible{dir = 2},/turf/simulated/wall/r_wall/coated,/area/maintenance/incinerator)
"cnY" = (/obj/machinery/atmospherics/pipe/simple,/obj/machinery/meter,/obj/structure/grille,/turf/simulated/wall/r_wall,/area/atmos)
"cnZ" = (/obj/machinery/atmospherics/pipe/simple,/obj/machinery/meter{frequency = 1443; id = "mair_in_meter"; name = "Mixed Air Tank In"},/obj/structure/grille,/turf/simulated/wall/r_wall,/area/atmos)
"coa" = (/obj/machinery/atmospherics/pipe/simple,/obj/machinery/meter{frequency = 1443; id = "mair_out_meter"; name = "Mixed Air Tank Out"},/obj/structure/grille,/turf/simulated/wall/r_wall,/area/atmos)
@@ -6414,7 +6414,7 @@
"ctr" = (/obj/machinery/chem_heater,/turf/simulated/floor/plating,/area/maintenance/aft{name = "Aft Maintenance"})
"cts" = (/obj/structure/lattice,/obj/structure/disposalpipe/segment{dir = 1; icon_state = "pipe-c"},/turf/space,/area/space)
"ctt" = (/obj/structure/disposaloutlet{dir = 2},/obj/structure/disposalpipe/trunk{dir = 8},/turf/simulated/floor/plating/airless,/area/space)
-"ctu" = (/obj/structure/sign/fire{pixel_x = 0; pixel_y = 0},/turf/simulated/wall/r_wall,/area/maintenance/incinerator)
+"ctu" = (/turf/simulated/wall/r_wall/coated,/area/maintenance/incinerator)
"ctv" = (/obj/machinery/door/poddoor{id_tag = "turbinevent"; name = "Turbine Vent"},/turf/simulated/floor/plating/airless,/area/maintenance/incinerator)
"ctw" = (/obj/item/device/flashlight/lamp,/obj/structure/table/woodentable,/turf/simulated/floor/wood,/area/maintenance/aft{name = "Aft Maintenance"})
"ctx" = (/obj/item/weapon/reagent_containers/food/drinks/cans/beer,/obj/structure/table/woodentable,/turf/simulated/floor/wood,/area/maintenance/aft{name = "Aft Maintenance"})
@@ -7446,7 +7446,7 @@
"cNj" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 9},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plasteel{dir = 8; icon_state = "whitepurplecorner"},/area/medical/research{name = "Research Division"})
"cNk" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/cable/yellow{d1 = 1; d2 = 8; icon_state = "1-8"},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/research{name = "Research Division"})
"cNl" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 8; initialize_directions = 11},/turf/simulated/floor/plasteel{dir = 2; icon_state = "whitebluecorner"},/area/medical/research{name = "Research Division"})
-"cNm" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/sign/securearea{desc = "A warning sign which reads 'SERVER ROOM'."; name = "SERVER ROOM"; pixel_y = 0},/turf/simulated/wall/r_wall,/area/toxins/server{name = "\improper Research Division Server Room"})
+"cNm" = (/obj/machinery/atmospherics/pipe/simple/insulated,/turf/simulated/wall/r_wall/coated,/area/maintenance/incinerator)
"cNn" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/wall/r_wall,/area/toxins/server{name = "\improper Research Division Server Room"})
"cNo" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 2; initialize_directions = 11},/turf/simulated/wall/r_wall,/area/toxins/server{name = "\improper Research Division Server Room"})
"cNp" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/wall/r_wall,/area/toxins/mixing{name = "\improper Toxins Lab"})
@@ -8171,6 +8171,7 @@
"dbg" = (/obj/effect/landmark{name = "xeno_spawn"; pixel_x = -1},/turf/simulated/floor/plating/airless/catwalk,/area/solar/starboard)
"dbh" = (/obj/machinery/status_display,/turf/simulated/shuttle/wall{tag = "icon-swall3"; icon_state = "swall3"; dir = 2},/area/shuttle/escape)
"dbi" = (/obj/machinery/sleeper,/turf/simulated/shuttle/floor,/area/shuttle/escape)
+"dbj" = (/obj/structure/sign/fire{pixel_x = 0; pixel_y = 0},/turf/simulated/wall/r_wall/coated,/area/maintenance/incinerator)
"dbk" = (/obj/machinery/optable,/turf/simulated/shuttle/floor,/area/shuttle/escape)
"dbl" = (/obj/effect/spawner/window/reinforced{useFull = 1; tag = "fullReinWin"},/obj/structure/cable/yellow,/obj/structure/cable/yellow{d2 = 4; icon_state = "0-4"},/obj/machinery/door/poddoor/preopen{id_tag = "xenobio2"; name = "containment blast door"},/turf/simulated/floor/plating,/area/toxins/xenobiology{name = "\improper Secure Lab"})
"dbm" = (/obj/structure/table/reinforced,/obj/machinery/door_control{id = "xenobio2"; name = "Containment Blast Doors"; pixel_x = 0; pixel_y = 4; req_access_txt = "55"},/obj/structure/window/reinforced{dir = 1},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plasteel{dir = 5; icon_state = "warning"},/area/toxins/xenobiology{name = "\improper Secure Lab"})
@@ -8465,6 +8466,10 @@
"dgP" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 9},/turf/simulated/wall/r_wall,/area/engine/break_room)
"dgQ" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/structure/transit_tube{tag = "icon-E-W-Pass"; icon_state = "E-W-Pass"},/turf/simulated/floor/plating/airless,/area/space)
"dgR" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/wall,/area/hallway/secondary/entry{name = "Arrivals"})
+"dgS" = (/turf/simulated/wall/r_wall/coated,/area/toxins/mixing{name = "\improper Toxins Lab"})
+"dgT" = (/obj/machinery/atmospherics/pipe/simple/visible{dir = 4},/turf/simulated/wall/r_wall/coated,/area/toxins/mixing{name = "\improper Toxins Lab"})
+"dgU" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/wall/r_wall/coated,/area/toxins/server{name = "\improper Research Division Server Room"})
+"dgV" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/sign/securearea{desc = "A warning sign which reads 'SERVER ROOM'."; name = "SERVER ROOM"; pixel_y = 0},/turf/simulated/wall/r_wall/coated,/area/toxins/server{name = "\improper Research Division Server Room"})
(1,1,1) = {"
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
@@ -8616,11 +8621,11 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqaaaaaaaaacjcaaaaaaabqaaaabqaaabZUbZUbZUceNbZUcjdcjecjfcjgcjhcjicjjchychychscjkbZUcjlcjmbZUcdNcjncjocjpcdTcjqcjrcjscjtcjucjvcjwcjxcjxcjycjxcjzcjAcjBcjBcjCcjDcjEcjFcjGcjHcjIcjJcibciccicciccjKcjLcjMcjNcjOcjPcjQcjRcjScjTcfxcjUbZubZubZubZubZvbZvcjVbZvbZvbZvbZvbZvbZvbZvbZvbZvbZvbZvbZvbZvcjWcjXaoGcjYcjZcfKckackbckcckdckeckfcqcbCMckhckhckickhckjckhckickkckjckjbRickhcklckmcknbCMbCMbCMckockpcjackqckoaaabFcaaaabqabqabqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqabqabqaaackraaaaaaabqaaacksckscktckubZUckvckwckxbZUbZUbZUckyckzchyckAckBbZUbZUbZUckCckDbZUckEckEckEckEckEckEckEckFcjtckGckHckIcjxckJckKckLckMckNckOckPckQckRckSckTckUcgwckVcgycfsckWckXckYckZclaclbclccldclecfxclfclgclhcfxclicljcljcljclkcljcllclmclncljcljclocljcljcljcljclpclqclrclscdocltcluclvclwbVKcfKclxclyclzclAclBclCclDbCMbCMbCMclEbETclFbETclEbETclFclFclGbETclGbCMbCMbCMabqabqabqclHcjaaWCabqabqabqabqabqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqaaaabeabqclIabqabqabqaaaabqabqbZUcbtclJclKbZUbZUbZUclLbZUbZUbZUbZUbZUbZUbZUclMclNcjlclOclPckEclQclRclSclTclUckEclVclWclXclYclZcjxcmacmbcmccmdcmecmfcmgcmhcmicmjcmicmkcmlckVcmmcmncmocmocmocmocmpcmqcmrcmscmtcfxcmucmvcmwcfxcmxcmycmzcmzcmzcmzcmAcmzcmBcmBcmBcmBcmBcmBcmBcmBcmBcmCbZUcmDasJasJasJaoGasJazocfKcmEcmFcmGclAcqrcqJcqIclAabqabqcmKabqcmLabqcmKabqcmMcmNcmOabqcmOabqabqabqabqaaaaaacmPcjacmQaaaaaaabqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqaaaarBaaacmRaaaabqaaaaaaabqaaabZUcmSbZUchnchocjecmTcjecjecmUcmVcmVcmVcmWcmVcmVcmVcmXcmYcmZcnacnbcnccndcnecnfckEcdTcngcnhcnicdTcjxcrjcnkcjxcnlcnmcmgcnncnocnpcnqcnrcmgcnscntcnucmocnvcnwcnxcnycnxcnzcmocnAcnBcnCcnDcnCcfxcfxcnEbZUcmzcnFcnGcnHcnIcnJcmBcnKcnKcnKcnLcnMcnNcnKcmBcmCbZUcnOasIcnPcnQaoGcnRcnScfKcnTcnUcnVclAclBcnWcnXclAabqbGLcnYbETcnYbGLcnYbETcnYbGLcnZbETcoabGLabqaaaabqabqabqcobcjacocabqabqabeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqabqarBaaacjcaaaabqaaaaaaabqaaabZUbZUbZUbZUbZUbZUbZUbZUbZUcodcoecoecofcogcogcogcogcohcogcogcogcoicojcokcolcomconcoocopcoqcorcoscotcoucovcowcoxcoycozcoAcoBcoCcoDcoEcmgcoFckVcmmcmpcoGcoHcoIcoJcoKcoLcmocoMcoNcoOcoPcmzcdNcjncrFcrvcmzcoRcoScoTcoUcoVcmBcnKcoWcoXcoYcnKcoZcpacmBcpbbZUbZUbZUbZUbZUaoGaoGaoGcfKcfKcfKctkclAcpdcpecpfcpgabqbGLcphcpicpjbGLcpkcplcpmbGLcpncpocppbGLabqaaaabqaaabCMcpqcprcpscptaaabFcaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqaaaabeaaackrabqabqabqabqabqaaabZUcpucpvcpwcpxcpycpzcpAbZUcodcoecpBcpCcpDcpEcpFcoecpGcpHcpIcoecpJcpKcpLcpMcpNcpOcpPcpQcpRcpScpTcpUcpTcpScpTcpVcpWcpXcpYcpZcqacqbcrVcmicnsckVcrWcmocqdcqecqfcqgcqhcqicqjcqkcqlcqmcqncmzcqocqpcqqcsncmzcqscqtcqucqvcqwcmBcnKcnKcqxcnKcnKcqycqzcmBcmCbZUcqAcqBbZUcqCcqDcqEcqFcqGcqHaoGcsoclAclAcsRclAclAabqbGLcqKcqLcqMbGLcqNcqOcqPbGLcqQcqRcqSbGLabqabqabqabqcptcqTcqUcqVcqWabqabeabqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqaaaarBaaackrabqaaaaaaaaaabqaaacqXcqYcqZcracrbcpycrccrdbZUcodcoecrecrfcrgcrhcricCKcrkcrlcrmcoeaovaotcrpcrncrocrscrtcructAcrwcrxcrycrycrycrzcrAcrBcrCcrDcpZcrEctBcrGcmgcrHckVcrIcmocrJcrKcrLcrMcrNcrOcmocrPcrQcrRcrScmzcrTcrUctSctEcmzcrXcrYcrZcsacsbcmBcmBcsccsdcsecsecmBcsfcmBcsgcshcsicsjbZUcskasJasJasJcdKcslbZUcsmcynclAcyqclAcspabqbGLcqKcsqcqKbGLcqNcsrcqNbGLcsscstcssbGLabqaaaabqaaacqWcqUcsucqUcjaaaabFcaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqabqabqabqabqabqabeabqckrabqaaaaaaaaaabqaaacqXcsvcrccqZcswcpycsxbZUbZUcsycoecszcsAcszcsBcszcoecszcsCcszcoeckEcsDcsEcsFckEckEcsGcsHcsIcsJcsJcsKcsLcsMcsJcsJcsNcmgcsOcsPcsQcyCcmgcmgcsSckVcsTcmocmocsUcsVcsWcsXcsYcmocsZcnBcfwcfwcmzctacmzctbcmzcmzcfwctcctdcfwcfwctectfctgcthctictjcrqctlcmBctmbZUctnctobZUctpcdKchschyctqctrbZUctscttctuctvctuarAabqbGLbGLbGLbGLbGLbGLbGLbGLbGLbGLbGLbGLbGLabqabqabqabqcjacqUcqUcqUcqWabqbFcaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqaaaarBaaacmRaaaabqaaaaaaabqaaabZUcmSbZUchnchocjecmTcjecjecmUcmVcmVcmVcmWcmVcmVcmVcmXcmYcmZcnacnbcnccndcnecnfckEcdTcngcnhcnicdTcjxcrjcnkcjxcnlcnmcmgcnncnocnpcnqcnrcmgcnscntcnucmocnvcnwcnxcnycnxcnzcmocnAcnBcnCcnDcnCcfxcfxcnEbZUcmzcnFcnGcnHcnIcnJcmBcnKcnKcnKcnLcnMcnNcnKcmBcmCbZUcnOasIcnPcnQaoGcnRcnScfKcnTcnUcnVctucnXcnWcNmctuabqbGLcnYbETcnYbGLcnYbETcnYbGLcnZbETcoabGLabqaaaabqabqabqcobcjacocabqabqabeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqabqarBaaacjcaaaabqaaaaaaabqaaabZUbZUbZUbZUbZUbZUbZUbZUbZUcodcoecoecofcogcogcogcogcohcogcogcogcoicojcokcolcomconcoocopcoqcorcoscotcoucovcowcoxcoycozcoAcoBcoCcoDcoEcmgcoFckVcmmcmpcoGcoHcoIcoJcoKcoLcmocoMcoNcoOcoPcmzcdNcjncrFcrvcmzcoRcoScoTcoUcoVcmBcnKcoWcoXcoYcnKcoZcpacmBcpbbZUbZUbZUbZUbZUaoGaoGaoGcfKcfKcfKctkctucpdcpecpfcpgabqbGLcphcpicpjbGLcpkcplcpmbGLcpncpocppbGLabqaaaabqaaabCMcpqcprcpscptaaabFcaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqaaaabeaaackrabqabqabqabqabqaaabZUcpucpvcpwcpxcpycpzcpAbZUcodcoecpBcpCcpDcpEcpFcoecpGcpHcpIcoecpJcpKcpLcpMcpNcpOcpPcpQcpRcpScpTcpUcpTcpScpTcpVcpWcpXcpYcpZcqacqbcrVcmicnsckVcrWcmocqdcqecqfcqgcqhcqicqjcqkcqlcqmcqncmzcqocqpcqqcsncmzcqscqtcqucqvcqwcmBcnKcnKcqxcnKcnKcqycqzcmBcmCbZUcqAcqBbZUcqCcqDcqEcqFcqGcqHaoGcsoctuctucsRctuctuabqbGLcqKcqLcqMbGLcqNcqOcqPbGLcqQcqRcqSbGLabqabqabqabqcptcqTcqUcqVcqWabqabeabqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqaaaarBaaackrabqaaaaaaaaaabqaaacqXcqYcqZcracrbcpycrccrdbZUcodcoecrecrfcrgcrhcricCKcrkcrlcrmcoeaovaotcrpcrncrocrscrtcructAcrwcrxcrycrycrycrzcrAcrBcrCcrDcpZcrEctBcrGcmgcrHckVcrIcmocrJcrKcrLcrMcrNcrOcmocrPcrQcrRcrScmzcrTcrUctSctEcmzcrXcrYcrZcsacsbcmBcmBcsccsdcsecsecmBcsfcmBcsgcshcsicsjbZUcskasJasJasJcdKcslbZUcsmcynctucyqctucspabqbGLcqKcsqcqKbGLcqNcsrcqNbGLcsscstcssbGLabqaaaabqaaacqWcqUcsucqUcjaaaabFcaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqabqabqabqabqabqabeabqckrabqaaaaaaaaaabqaaacqXcsvcrccqZcswcpycsxbZUbZUcsycoecszcsAcszcsBcszcoecszcsCcszcoeckEcsDcsEcsFckEckEcsGcsHcsIcsJcsJcsKcsLcsMcsJcsJcsNcmgcsOcsPcsQcyCcmgcmgcsSckVcsTcmocmocsUcsVcsWcsXcsYcmocsZcnBcfwcfwcmzctacmzctbcmzcmzcfwctcctdcfwcfwctectfctgcthctictjcrqctlcmBctmbZUctnctobZUctpcdKchschyctqctrbZUctscttdbjctvdbjarAabqbGLbGLbGLbGLbGLbGLbGLbGLbGLbGLbGLbGLbGLabqabqabqabqcjacqUcqUcqUcqWabqbFcaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqaaaaaaabqaaaaaaarBaaaclIaaaaaaaaaaaaabqaaacqXctwcqZcswctxcpyctyctzcdOcodcoeczqczpctCctDczJcoectFctGctHcoectIctJctKctLctMctNctOcgrctPcsJctQctRcABctTctUcsJccvcmgctVctWctXctYcmictZcuacubcuccudcuecufcugcuhcuicujcukculcumcuncuocupciccuqcurcusciccutcuucuvciccuwctecuxcuycuzcuAcuBcuCcuDcmBcmCbZUbZUcuEbZUcuFcuGchychycuHcuIcqXabqabqabqabqabqabqabqabqabqabqabqabqabqabqabqabqabqabqabqabqabqaaaabqaaacjacqWcptbCMcptaaaabqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqabqabqaaaaaaabqaaaaaaabeaaacmRabqaaaaaaaaaabqaaacqXcqXcqZcpycpycqZcqZcuJcdOcodcoecuKcuLcuMcuNcuOcoecuPcuQcuRcuScuTcuUcuVcuWcuXcuYcuZcgrcgscsKcvacvbcvccvdcvecsJchscmgcvfcvgcvhcvicvjcvkcvlckVcvmcvncvocvpcvqcvrcvscvtcvucvvcvwcvxcvycvzcvAcvBcvCcvDcvEcvDcvFcvGcvHcvIcvJcvKcvLcvMcvNcvOcvPcvQcvRcvSbZUcvTcvUcvVcbvctqchychycvWcvXbZUcvYabqaaaaaaaaaabqaaaaaaaaaaaaaaaabqaaaaaaaaaabqaaaaaaaaaaaaabqaaaabqaaaaaaabqaaaabqaaaaaaabqabqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqaaaaaaaaaabqabqaaaaaaarBaaacjcaaaaaaaaaaaaabqaaacqXcvZcqZcwacqZcqZcsxbZUbZUcwbcwccwdcuLcwecuNcwfcwgcwhcwicwjcwkcwlcwmcwncwocwpcwqcwrcwscjAcwtcwucwvcwwcwxcwwcwycwzcmgcwAcwBcwCcwDcmicvkcvlckVcvmcwEcmpcwFcwGcwHcwIcwJcukcwKcwLcwMcwNcwOcwPcwQcwRcihcihcwScwTcwUcwVcwWcwXcwYcwZcxacxbcxccxdcxecmBcmCbZUcxfcxgcxhcsicxicuHcmDchycxjcqXaaaabqaaaaaaaaaabqabqabebFbbFbbFbbFbbFbbFbabebFbbFcbFbbPGabqbFcabqabqabebRmbRmbRmabeabqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
@@ -8636,11 +8641,11 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaarBabqcCfcCfcCfcCfcCfaaaclIabqcCfcCfcCfcCfcCfaaaarBaaaaaaaaaabqaaaaaaaaaaaabZUbZUbZUcfZbZUcjncFPcFQbZUcPGcNacNbbZUcFTcFUcFVcFWcFXcFYcFZcGacGbcGccGdcGecBvcGfcGgcGhczBcGicGjcGkcGlcGmczBcGncGocGoczCcGpcGqcGrcGscGtcGucGvcGwczMcGxcGycGzcGAcGBcGCcGDcGEcGFcGGcGHcGIcGIcGJcGKcGLcGMcGNcGOcGPcGQcGRcGScGTcGUcGVcGVcGVcGWcGXabqaaaaaaaaaaaaaaaaaaaaaabqaaaaaaaaaaaaaaaaaaaaaaaaabqabqaaaaaaaaaaaaaaaaaaaaaaaaaaaabqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqabqcFOcFNcGYcFNcFOabqabqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaupaaaabqaaaabqaaaabqaaacmRaaaabqaaaabqabqabqabqaupaaaaaaaaaabqaaaaaaaaaaaaabqaaabZUbZUbZUbZUbZUbZUbZUcNOcNPcNQbZUckDcGZcDUcHacHbcHccHdcHecHfcHgcHhcHicBvcBvcHjcBvczBczBczBczBczBczBczBcHkczCczCcHlcHmczGczHcHncHocHocHpcHqczMcHrcHscHtcHucHvcHwcHxcHycHzcHAcHBcHCcHDcHEcHFcHGcHHcHIcHJcHKcHLcHMcHNcHOcHPcHQcHRcHScHTcGXabqabqaaaaaaaaaaaaaaaaaaabqaaaaaaaaaaaaaaaaaaaaaaaaabqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqabqcHUcFOcHVcHWcHXcFOcHUabqabqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaarBaaacAfcAfcAfcAfcAfabqcHYabqcAfcAfcAfcAfcAfabqarBaaaaaaaaaabeabqcHZcHZcHZcIacHZcHZcHZaaaabqaaaaaabZUcOJcOKcOLbZUcIbcEQcDUcIccIdcHbcIecIfcDUcIgcIhcIicDUcIjcIkcIlcImcIncIocIncIpcIncIqcIocIrcImcIscnscgxcItcBJcIucIvcIwcIucIxcIxcIxcIxcIxcIycxPcIzcEycIAcIAcIBcICcIDcIEcIFcIGcIHcIIcIJcEKcIKcILcIMcEycINcGXcGXcFHcGXcFHarAabqaaaaaaabqaaaaaaabqabqabqaaaaaaaaaaaaaaaabqaaaabqaaaaaaaaaaaaaaaaaaaaaaaaabqaaaabqaaaaaaaaaaaaaaaaaaaaaaaaabqaaaaaaaaaaaaaaaaaaaaaaaaaaaabqaaaabqabqcFOcFOcIOcIPcIPcIPcIQcFOcFOabqabqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaarBabqcBdcBecBecBecBecBfckrcBgcBhcBhcBhcBhcBiabqarBaaaabqabqarBaaacHZcIRcIScIRcITcIRcHZcHZcIacHZcIacHZcHZcPDcPEcPFcjicQKcDUcDUcDUcDUcDUcDUcDUcIUcIVcIWcIXcIYcIZcJacImcJbcJccIncIocIncJdcJecJfcImcJgcnscgxcvmcwEcJhcJicJjcJkcJlcJmcJncJocJpcJqcCOczQcEKcEKcEKcEKcEKcEKcJrcJscJtcJucJvcJwcEKbZUcFGbZUcFHcJxcJycJzcJAcJBarAarAabqabqabqabqabqabqabqaaaabqabqabqabqabqabqabqabqabqabqabqabqabqabqabqabqabqabqabqabqabqabqabqabqabqabqabqabqabqabqabqabqabqabqabqabqabqabqabqabqabqabqcJCcJDcJCcIPcJEcIPcJFcJGcFNabqabqabqabqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaarBabqcCfcCfcCfcCfcCfaaaclIaaacCfcCfcCfcCfcCfaaaaupabqabqaaaarBabqcHZcJHcJIcJJcJKcJHcJLcJMcJNcJOcJPcJQcHZbZUbZUbZUbZUcJRcJScJScJTcJScJUcJVcJWcJXcJYcJZcKacKbcKccKdcKecKfcKgcKfcKfcKhcKicKjcKkcKlcKmcKncFkcKocKpcKqcKrcKscKtcKtcKtcKucKvcJpcgCcCOcKwcEKcKxcKycKzcKAcKBcKCcKBcKDcKEcKFcEKcrUcKGccscfYcFHcFHcFHcFHcFHcKHcKIarAabqaaaaaaaaaaaaaaaabqabqabqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqaaaaaaaaaaaaaaaaaaabqabqcFOcFOcKJcIPcIPcIPcKKcFOcFOabqabqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaarBabqcBdcBecBecBecBecBfckrcBgcBhcBhcBhcBhcBiabqarBaaaabqabqarBaaacHZcIRcIScIRcITcIRcHZcHZcIacHZcIacHZcHZcPDcPEcPFcjicQKcDUcDUcDUcDUcDUcDUcDUcIUcIVcIWcIXcIYcIZcJacImcJbcJccIncIocIncJdcJecJfcImcJgcnscgxcvmcwEcJhcJicJjcJkcJlcJmcJncJocJpcJqcCOczQdgSdgSdgSdgSdgSdgScJrcJscJtcJucJvcJwcEKbZUcFGbZUcFHcJxcJycJzcJAcJBarAarAabqabqabqabqabqabqabqaaaabqabqabqabqabqabqabqabqabqabqabqabqabqabqabqabqabqabqabqabqabqabqabqabqabqabqabqabqabqabqabqabqabqabqabqabqabqabqabqabqabqabqcJCcJDcJCcIPcJEcIPcJFcJGcFNabqabqabqabqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaarBabqcCfcCfcCfcCfcCfaaaclIaaacCfcCfcCfcCfcCfaaaaupabqabqaaaarBabqcHZcJHcJIcJJcJKcJHcJLcJMcJNcJOcJPcJQcHZbZUbZUbZUbZUcJRcJScJScJTcJScJUcJVcJWcJXcJYcJZcKacKbcKccKdcKecKfcKgcKfcKfcKhcKicKjcKkcKlcKmcKncFkcKocKpcKqcKrcKscKtcKtcKtcKucKvcJpcgCcCOcKwdgScKxcKycKzcKAdgTcKCcKBcKDcKEcKFcEKcrUcKGccscfYcFHcFHcFHcFHcFHcKHcKIarAabqaaaaaaaaaaaaaaaabqabqabqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqaaaaaaaaaaaaaaaaaaabqabqcFOcFOcKJcIPcIPcIPcKKcFOcFOabqabqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaarBaaaaaaabqabqabqaaaaaacKLabqaaaaaaabqabqaaaaaaarBaaaaaaaaaabeaaacHZcKMcKNcKOcKPcKMcKMcKQcKRcKScKTcKUcHZaaaaaaaaacrUcrUcrUcrUcrUbZUcKVcDUcDUcKWcKXcRocDUcKZcLacLbcImcLccIocIncIocIncLdcLecLfcLgcLhcLicLjcLkcIxcIxcLlcLmcLncLocLpcLqcLrcJpcLscLtcLucGXcKxcKycLvcLvcLwcLxcLycLzcJucLAcEKcdNcLBceNchycLCbZUabqabqabqabqabqabqabqaaaaaaaaaaaaaaaaaaabqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqabqcHUcFOcLDcLEcLFcFOcHUabqabqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaupaaaaaaaaaaaaaaaaaaaaacKLaaaaaaaaaaaaabqaaaaaaaupaaaaaaaaaarBabqcHZcLGcLHcLIcLJcLKcLLcLMcLNcLOcLPcLQcLRcLScLScLScLRcLTcLUcLVcHZcLWcLXcDUcLYcLZcMacSBcRUcRUcRUcRUcImcIncIocIncMccIncMdcMecMfcImcMgcMhcgxcmmcIxcMicMjcMkcLocLocMlcMmcMncJpcMocMpcMqcEKcKxcKycLvcMrcKBcMscKBcMtcMucMvcEKcMwchyceNchycMxbZUabqaaaaaaaaaaaaabqaaaaaaaaaaaaaaaaaaaaaabqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqabqcFOcFNcMycFNcFOabqabqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaarBabearBarBarBaaaaaaaaacKLaaaaaaaaaarBarBarBauparBabqabqaaaarBaaacIacMzcMAcMBcMCcMDcMEcMFcMGcMHcMIcMJcMKcMLcMMcMNcMOcMPcMBcMQcMRcMScMTcMUcMScMVcMWcWGcSCcWIcWHcYocRUcImcImcImcImcImcImcNccImcImbZUcNdcgxcmmcIxcNecMjcLocLpcLocNfcNgcNhcNicNjcNkcNlcNmcNncNncNncNncNncNocNncNpcNqcNrcEKchychycNschybZUbZUbZUabqabqaaaaaaabqaaaaaaaaaaaaaaaaaaaaaabqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqabqcFNcFOcFNabqabqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaupaaaaaaaaaaaaaaaaaaaaacKLaaaaaaaaaaaaabqaaaaaaaupaaaaaaaaaarBabqcHZcLGcLHcLIcLJcLKcLLcLMcLNcLOcLPcLQcLRcLScLScLScLRcLTcLUcLVcHZcLWcLXcDUcLYcLZcMacSBcRUcRUcRUcRUcImcIncIocIncMccIncMdcMecMfcImcMgcMhcgxcmmcIxcMicMjcMkcLocLocMlcMmcMncJpcMocMpcMqdgScKxcKycLvcMrdgTcMscKBcMtcMucMvcEKcMwchyceNchycMxbZUabqaaaaaaaaaaaaabqaaaaaaaaaaaaaaaaaaaaaabqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqabqcFOcFNcMycFNcFOabqabqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaarBabearBarBarBaaaaaaaaacKLaaaaaaaaaarBarBarBauparBabqabqaaaarBaaacIacMzcMAcMBcMCcMDcMEcMFcMGcMHcMIcMJcMKcMLcMMcMNcMOcMPcMBcMQcMRcMScMTcMUcMScMVcMWcWGcSCcWIcWHcYocRUcImcImcImcImcImcImcNccImcImbZUcNdcgxcmmcIxcNecMjcLocLpcLocNfcNgcNhcNicNjcNkcNldgVdgUdgUdgUdgUdgUcNocNncNpcNqcNrcEKchychycNschybZUbZUbZUabqabqaaaaaaabqaaaaaaaaaaaaaaaaaaaaaabqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqabqcFNcFOcFNabqabqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqaaaabqaaaaaaaaaarBabqcNtabqarBaaaaaaabqaaaaaaabqaaaabqabqabqaaacHZcNucNvcNwcNxcNycNzcNAcNBcNCcNDcNEcHZcIacIacIacHZcNFcNGcNHcHZcNIcNJcDUcNKcNLcNMcNNdegdeidehdejcRUcNRcmVcNScmWcmVcNTcNUcDJcmZcNVcNWcNXcBIcIxcNYcNZcOacOacOacObcOccOdcOecOfcOgcOhcOicOjcOkcOlcOmcOncOocOpcOqcOrcOscOtcmYcmYcOucOvcOwcOxbZUbZUbZUcksaaaabqaaaaaaaaaaaaaaaaaaaaaabqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqabqabqabqabqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqaaaaaaaaaarBaaaabqaaaarBaaaaaaabqabqabqabqaaaaaaaaaabqabqcHZcOycOzcKMcOAcOycOBcODcOCcOEcOFcOGcHZcOHaaaaaacrUcrUcrUcrUcrUbZUcOIcDUcDUcDUcDUcDUcRUdeldekdemcRUcOMbZUbZUbZUbZUbZUbZUbZUbZUczIcONcOOcOPcOQcORcOScOTcOUcOVcOWcLpcOXcOYcOZcPacPbcPccPdcPecPfcPgcPhcPicOpclNcPjbZUbZUbZUbZUbZUdencPlcPmclJcPnclJcPoabqabqaaaaaaaaaaaaaaaaaaaaaabqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaarBarBarBarBarBaaaaaaaaaaaaaaaaaaaaaaaaaaaabqaaacHZcPpcPqcKMcPqcPrcPscKMcKMcPtcKMcKMcHZabqabqabqbZUcjncfZcPucPvcPwcPxcmYcPycPzcPAcPBcRUdepdeodeqcRUcOMbZUcPHcPIcPJbZUcPKcPLcPMbZUcPNcPOcPPcIxcPQcPRcPScPTcPUcPVcLpcPWcIxcPXcPYciccPccPZcQacQbcQccQdcQecOpchycQfbZUcQgcQhcQibZUcQjcQkcQlbZUbZUbZUcksaaaabqaaaaaaaaaaaaaaaaaaaaaabqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
diff --git a/_maps/map_files/cyberiad/cyberiad.dmm b/_maps/map_files/cyberiad/cyberiad.dmm
index c216d046216..9d54dbe9b83 100644
--- a/_maps/map_files/cyberiad/cyberiad.dmm
+++ b/_maps/map_files/cyberiad/cyberiad.dmm
@@ -873,7 +873,7 @@
"aqO" = (/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"; tag = ""},/obj/structure/rack{dir = 8; layer = 2.9},/obj/item/weapon/storage/briefcase,/turf/simulated/floor/plasteel{icon_state = "grimy"},/area/security/detectives_office)
"aqP" = (/obj/structure/stool/bed/chair{dir = 4},/turf/simulated/floor/carpet,/area/crew_quarters/courtroom)
"aqQ" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"; tag = ""},/turf/simulated/floor/plasteel{icon_state = "grimy"},/area/security/detectives_office)
-"aqR" = (/turf/simulated/floor/plasteel{icon_state = "wood"},/area/crew_quarters/courtroom)
+"aqR" = (/turf/simulated/floor/wood,/area/crew_quarters/courtroom)
"aqS" = (/obj/structure/reagent_dispensers/fueltank,/turf/simulated/floor/plating,/area/maintenance/fsmaint)
"aqT" = (/obj/structure/reagent_dispensers/watertank,/turf/simulated/floor/plating,/area/maintenance/fsmaint)
"aqU" = (/obj/structure/rack{dir = 1},/obj/effect/spawner/lootdrop/maintenance,/turf/simulated/floor/plating,/area/maintenance/fsmaint)
@@ -889,7 +889,7 @@
"are" = (/turf/simulated/shuttle/floor{icon_state = "floor3"},/turf/simulated/shuttle/wall/interior{tag = "icon-swall_f9"; icon_state = "swall_f9"},/area/shuttle/abandoned)
"arf" = (/obj/machinery/sleeper{dir = 8},/obj/machinery/light{dir = 1},/obj/effect/decal/remains/human,/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/shuttle/abandoned)
"arg" = (/turf/simulated/shuttle/floor{icon_state = "floor3"},/turf/simulated/shuttle/wall/interior{tag = "icon-swall_f5"; icon_state = "swall_f5"},/area/shuttle/abandoned)
-"arh" = (/obj/item/device/radio/intercom{dir = 4; name = "station intercom (General)"; pixel_x = 28},/turf/simulated/floor/plasteel{icon_state = "wood"},/area/crew_quarters/courtroom)
+"arh" = (/obj/item/device/radio/intercom{dir = 4; name = "station intercom (General)"; pixel_x = 28},/turf/simulated/floor/wood,/area/crew_quarters/courtroom)
"ari" = (/turf/simulated/floor/plasteel{icon_state = "redcorner"; dir = 4},/area/security/lobby)
"arj" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 4; external_pressure_bound = 101; on = 1; pressure_checks = 1},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 1},/area/security/lobby)
"ark" = (/obj/machinery/light/small{dir = 8},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 8},/area/security/prison/cell_block/B)
@@ -917,8 +917,8 @@
"arG" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/wall,/area/security/processing)
"arH" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/hologram/holopad,/obj/machinery/firealarm{dir = 4; pixel_x = 24},/turf/simulated/floor/plasteel,/area/security/processing)
"arI" = (/obj/effect/spawner/window/reinforced,/turf/simulated/floor/plating,/area/crew_quarters/courtroom)
-"arJ" = (/obj/machinery/atmospherics/unary/vent_scrubber{on = 1; scrub_Toxins = 1},/turf/simulated/floor/plasteel{icon_state = "wood"},/area/crew_quarters/courtroom)
-"arK" = (/obj/machinery/hologram/holopad,/turf/simulated/floor/plasteel{icon_state = "wood"},/area/crew_quarters/courtroom)
+"arJ" = (/obj/machinery/atmospherics/unary/vent_scrubber{on = 1; scrub_Toxins = 1},/turf/simulated/floor/wood,/area/crew_quarters/courtroom)
+"arK" = (/obj/machinery/hologram/holopad,/turf/simulated/floor/wood,/area/crew_quarters/courtroom)
"arL" = (/obj/machinery/alarm{dir = 8; icon_state = "alarm0"; pixel_x = 24},/obj/structure/stool/bed/chair/office/dark{dir = 8},/obj/machinery/door/window/westright{dir = 1; name = "Judge Committee"; req_access = null; req_access_txt = "63"},/turf/simulated/floor/plasteel{dir = 2; icon_state = "carpet"},/area/crew_quarters/courtroom)
"arM" = (/turf/simulated/floor/carpet,/area/security/detectives_office)
"arN" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/carpet,/area/security/detectives_office)
@@ -953,7 +953,7 @@
"asq" = (/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/processing)
"asr" = (/obj/structure/stool/bed/chair,/turf/simulated/floor/plasteel,/area/security/processing)
"ass" = (/obj/structure/stool/bed/chair{dir = 4},/obj/machinery/light{icon_state = "tube1"; dir = 8},/turf/simulated/floor/carpet,/area/crew_quarters/courtroom)
-"ast" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plasteel{icon_state = "wood"},/area/crew_quarters/courtroom)
+"ast" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/wood,/area/crew_quarters/courtroom)
"asu" = (/obj/machinery/alarm{dir = 8; icon_state = "alarm0"; pixel_x = 24},/obj/machinery/light{icon_state = "tube1"; dir = 4},/obj/structure/stool/bed/chair{dir = 8},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 5},/area/security/lobby)
"asv" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plasteel,/area/security/main)
"asw" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/obj/machinery/camera{c_tag = "Brig Main Hall 1"; dir = 2; network = list("SS13")},/obj/machinery/hologram/holopad,/obj/structure/sign/poster/legit{pixel_x = 0; pixel_y = 32},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 1},/area/security/brig)
@@ -986,7 +986,7 @@
"asX" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/effect/spawner/window/reinforced,/obj/structure/cable{d2 = 4; icon_state = "0-4"},/turf/simulated/floor/plating,/area/security/evidence)
"asY" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_y = 0; tag = ""},/obj/machinery/camera{c_tag = "Labor Shuttle Dock"; dir = 1; network = list("SS13")},/turf/simulated/floor/plasteel{icon_state = "red"},/area/security/prisonershuttle)
"asZ" = (/turf/simulated/wall/r_wall,/area/security/prison/cell_block/A)
-"ata" = (/obj/machinery/light_switch{pixel_y = -24},/obj/item/weapon/twohanded/required/kirbyplants,/turf/simulated/floor/plasteel{icon_state = "wood"},/area/crew_quarters/courtroom)
+"ata" = (/obj/item/device/radio/intercom{name = "station intercom (General)"; pixel_y = -28},/obj/machinery/camera{c_tag = "Courtroom"; dir = 1; network = list("SS13")},/turf/simulated/floor/wood,/area/crew_quarters/courtroom)
"atb" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 4; initialize_directions = 11; level = 1},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/door_timer/cell_5{dir = 8; layer = 4; pixel_x = -32; pixel_y = 0},/turf/simulated/floor/plasteel,/area/security/prison/cell_block/B)
"atc" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 8; initialize_directions = 11; level = 1},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/structure/cable/yellow{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/structure/cable/yellow{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/machinery/door_timer/cell_2{dir = 4; layer = 4; pixel_x = 30; pixel_y = 0},/turf/simulated/floor/plasteel,/area/security/prison/cell_block/A)
"atd" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 4; initialize_directions = 11; level = 1},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/door_timer/cell_4{dir = 8; layer = 4; pixel_x = -30; pixel_y = 0},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/prison/cell_block/A)
@@ -995,10 +995,10 @@
"atg" = (/obj/machinery/door/firedoor,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/door/airlock/glass_security{name = "Equipment Storage"; req_access_txt = "1"},/turf/simulated/floor/plasteel,/area/security/seceqstorage)
"ath" = (/obj/machinery/hologram/holopad,/turf/simulated/floor/plasteel,/area/security/lobby)
"ati" = (/obj/machinery/camera{c_tag = "Brig Lobby"; dir = 8; pixel_x = 0; pixel_y = -22; network = list("SS13")},/obj/machinery/firealarm{dir = 4; pixel_x = 24},/obj/structure/stool/bed/chair{dir = 8},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 4},/area/security/lobby)
-"atj" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 4; external_pressure_bound = 101; on = 1; pressure_checks = 1},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 5},/turf/simulated/floor/plasteel{icon_state = "wood"},/area/crew_quarters/courtroom)
-"atk" = (/obj/machinery/firealarm{dir = 1; pixel_y = -24},/turf/simulated/floor/plasteel{icon_state = "wood"},/area/crew_quarters/courtroom)
-"atl" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4; level = 1},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 10; initialize_directions = 10; level = 1},/obj/structure/window/reinforced{dir = 1; layer = 2.9},/obj/structure/stool/bed/chair{dir = 1},/turf/simulated/floor/plasteel{icon_state = "wood"},/area/crew_quarters/courtroom)
-"atm" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4; level = 1},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4; level = 1},/obj/machinery/door/window/westright{dir = 8; name = "Witness Stand"},/obj/structure/window/reinforced{dir = 1; layer = 2.9},/turf/simulated/floor/plasteel{icon_state = "wood"},/area/crew_quarters/courtroom)
+"atj" = (/obj/machinery/light_switch{pixel_y = -24},/obj/item/weapon/twohanded/required/kirbyplants,/turf/simulated/floor/wood,/area/crew_quarters/courtroom)
+"atk" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 4; external_pressure_bound = 101; on = 1; pressure_checks = 1},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 5},/turf/simulated/floor/wood,/area/crew_quarters/courtroom)
+"atl" = (/obj/machinery/firealarm{dir = 1; pixel_y = -24},/turf/simulated/floor/wood,/area/crew_quarters/courtroom)
+"atm" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4; level = 1},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 10; initialize_directions = 10; level = 1},/obj/structure/window/reinforced{dir = 1; layer = 2.9},/obj/structure/stool/bed/chair{dir = 1},/turf/simulated/floor/wood,/area/crew_quarters/courtroom)
"atn" = (/obj/machinery/newscaster{pixel_x = -28; pixel_y = 1},/obj/structure/table/woodentable,/obj/item/device/flashlight/lamp/green{on = 0; pixel_x = -3; pixel_y = 8},/obj/item/weapon/reagent_containers/food/drinks/flask/detflask,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 5},/turf/simulated/floor/plasteel{icon_state = "grimy"},/area/security/detectives_office)
"ato" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 1; level = 1},/obj/structure/table/woodentable,/turf/simulated/floor/carpet,/area/security/detectives_office)
"atp" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 8; on = 1},/obj/structure/table/woodentable,/obj/machinery/media/receiver/boombox,/turf/simulated/floor/carpet,/area/security/detectives_office)
@@ -5122,7 +5122,7 @@
"bUz" = (/obj/item/weapon/storage/box/beakers,/obj/item/weapon/storage/box/syringes,/obj/item/weapon/reagent_containers/spray/cleaner,/obj/structure/table/glass,/obj/machinery/firealarm{dir = 4; pixel_x = 24},/turf/simulated/floor/plasteel{tag = "icon-whitepurple (EAST)"; icon_state = "whitepurple"; dir = 4},/area/medical/genetics)
"bUA" = (/turf/simulated/wall/r_wall,/area/toxins/mixing)
"bUB" = (/obj/machinery/atmospherics/pipe/simple/insulated,/turf/simulated/wall/r_wall,/area/toxins/mixing)
-"bUC" = (/turf/simulated/wall/r_wall{desc = "A specially coated wall that resists temperatures for Science"; max_temperature = 1e+009; name = "Coated Reinforced Wall"},/area/toxins/mixing)
+"bUC" = (/turf/simulated/wall/r_wall/coated,/area/toxins/mixing)
"bUD" = (/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "Biohazard"; name = "Biohazard Shutter"; opacity = 0},/obj/machinery/door/poddoor{id_tag = "ToxinsVenting"; name = "Toxins Venting Bay Door"; use_power = 0},/turf/simulated/floor/engine/vacuum,/area/toxins/mixing)
"bUE" = (/turf/simulated/shuttle/floor,/area/shuttle/mining)
"bUF" = (/obj/structure/stool/bed/chair{dir = 1},/turf/simulated/shuttle/floor,/area/shuttle/mining)
@@ -5200,7 +5200,7 @@
"bVZ" = (/obj/machinery/door/firedoor{dir = 1; name = "hazard door north"},/turf/simulated/floor/plasteel{dir = 9; icon_state = "whitehall"},/area/medical/research{name = "Research Division"})
"bWa" = (/obj/machinery/atmospherics/pipe/simple/insulated,/obj/machinery/camera{c_tag = "Research Toxins Mixing North"; dir = 2; network = list("Research","SS13"); pixel_x = 0},/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/mixing)
"bWb" = (/obj/machinery/atmospherics/pipe/simple/insulated{dir = 6},/obj/machinery/light{dir = 1; in_use = 1},/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/mixing)
-"bWc" = (/obj/machinery/atmospherics/pipe/simple/heat_exchanging/junction{dir = 4},/turf/simulated/wall/r_wall{desc = "A specially coated wall that resists temperatures for Science"; max_temperature = 1e+009; name = "Coated Reinforced Wall"},/area/toxins/mixing)
+"bWc" = (/obj/machinery/atmospherics/pipe/simple/heat_exchanging/junction{dir = 4},/turf/simulated/wall/r_wall/coated,/area/toxins/mixing)
"bWd" = (/obj/machinery/atmospherics/pipe/simple/heat_exchanging{dir = 4},/turf/simulated/floor/engine/vacuum,/area/toxins/mixing)
"bWe" = (/obj/machinery/atmospherics/pipe/simple/heat_exchanging{dir = 10},/turf/simulated/floor/engine/vacuum,/area/toxins/mixing)
"bWf" = (/obj/effect/spawner/window/reinforced,/turf/simulated/floor/plating/airless,/area/toxins/test_area)
@@ -6053,8 +6053,8 @@
"cmu" = (/obj/structure/sign/securearea{pixel_x = 0; pixel_y = 32},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/light{dir = 1; in_use = 1},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{level = 1},/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/xenobiology)
"cmv" = (/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/turf/simulated/floor/plating,/area/maintenance/asmaint2)
"cmw" = (/obj/structure/disposalpipe/trunk{dir = 4},/obj/structure/disposaloutlet{dir = 8},/turf/simulated/floor/plating/airless,/area/space)
-"cmx" = (/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/wall/r_wall{desc = "A specially coated wall that resists temperatures for Science"; max_temperature = 1e+009; name = "Coated Reinforced Wall"},/area/maintenance/incinerator)
-"cmy" = (/obj/structure/disposalpipe/segment{dir = 8; icon_state = "pipe-c"},/turf/simulated/wall/r_wall{desc = "A specially coated wall that resists temperatures for Science"; max_temperature = 1e+009; name = "Coated Reinforced Wall"},/area/maintenance/incinerator)
+"cmx" = (/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/wall/r_wall/coated,/area/maintenance/incinerator)
+"cmy" = (/obj/structure/disposalpipe/segment{dir = 8; icon_state = "pipe-c"},/turf/simulated/wall/r_wall/coated,/area/maintenance/incinerator)
"cmz" = (/obj/structure/sign/nosmoking_2{pixel_x = -28},/turf/simulated/floor/plating,/area/maintenance/incinerator)
"cmA" = (/obj/machinery/atmospherics/binary/pump{dir = 1; name = "Gas Pump"; on = 1},/turf/simulated/floor/plating,/area/maintenance/incinerator)
"cmB" = (/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/maintenance/incinerator)
@@ -6117,7 +6117,7 @@
"cnG" = (/obj/effect/spawner/lootdrop/maintenance,/turf/simulated/floor/plating,/area/maintenance/asmaint2)
"cnH" = (/obj/machinery/door/poddoor{id_tag = "disvent"; name = "Incinerator Vent"},/turf/simulated/floor/engine/vacuum,/area/maintenance/incinerator)
"cnI" = (/obj/machinery/atmospherics/unary/outlet_injector{dir = 4; frequency = 1443; icon_state = "on"; id = "air_in"; on = 1},/obj/structure/sign/securearea{desc = "A warning sign which reads 'EXTERNAL AIRLOCK'"; icon_state = "space"; layer = 4; name = "EXTERNAL AIRLOCK"; pixel_x = 0; pixel_y = 32},/turf/simulated/floor/engine/vacuum,/area/maintenance/incinerator)
-"cnJ" = (/obj/machinery/atmospherics/pipe/simple/visible{dir = 4},/turf/simulated/wall/r_wall{desc = "A specially coated wall that resists temperatures for Science"; max_temperature = 1e+009; name = "Coated Reinforced Wall"},/area/maintenance/incinerator)
+"cnJ" = (/obj/machinery/atmospherics/pipe/simple/visible{dir = 4},/turf/simulated/wall/r_wall/coated,/area/maintenance/incinerator)
"cnK" = (/obj/machinery/atmospherics/binary/pump{dir = 8; on = 1},/obj/machinery/light/small{dir = 1},/obj/structure/sign/fire{pixel_y = 32},/turf/simulated/floor/plating,/area/maintenance/incinerator)
"cnL" = (/obj/machinery/embedded_controller/radio/airlock/access_controller{frequency = 1449; id_tag = "incinerator_access_control"; name = "Incinerator Access Console"; pixel_x = -26; pixel_y = 6; req_access_txt = "12"; tag_exterior_door = "incinerator_airlock_exterior"; tag_interior_door = "incinerator_airlock_interior"},/obj/machinery/ignition_switch{id = "Incinerator"; pixel_x = -24; pixel_y = -6},/obj/machinery/meter,/obj/machinery/atmospherics/pipe/simple/visible{dir = 4},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/maintenance/incinerator)
"cnM" = (/obj/machinery/atmospherics/pipe/simple/visible,/obj/machinery/atmospherics/pipe/simple/visible{dir = 4},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/maintenance/incinerator)
@@ -6272,6 +6272,7 @@
"cqF" = (/obj/machinery/hologram/holopad,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/construction)
"cqG" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/alarm{dir = 8; icon_state = "alarm0"; pixel_x = 24},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/construction)
"cqH" = (/obj/structure/table,/obj/item/weapon/storage/box/gloves,/obj/item/weapon/storage/box/masks,/obj/item/weapon/reagent_containers/spray/cleaner{desc = "Someone has crossed out the Space from Space Cleaner and written in Surgery. 'Do not remove under punishment of death!!!' is scrawled on the back."; name = "Surgery Cleaner"},/obj/machinery/light_switch{pixel_x = -5; pixel_y = 27},/obj/machinery/holosign_switch{id = "surgery1"; pixel_x = 5; pixel_y = 27},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/surgery)
+"cqI" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4; level = 1},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4; level = 1},/obj/machinery/door/window/westright{dir = 8; icon_state = "left"; name = "Witness Stand"},/obj/structure/window/reinforced{dir = 1; layer = 2.9},/turf/simulated/floor/wood,/area/crew_quarters/courtroom)
"cqJ" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/surgery)
"cqK" = (/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/surgery)
"cqL" = (/obj/machinery/bodyscanner,/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/surgery)
@@ -6299,7 +6300,7 @@
"crh" = (/obj/item/clothing/mask/cigarette,/turf/simulated/floor/plating/airless,/area/toxins/test_area)
"cri" = (/obj/machinery/light/small,/turf/simulated/floor/plating/airless,/area/toxins/test_area)
"crj" = (/turf/simulated/wall/r_wall,/area/engine/mechanic_workshop)
-"crk" = (/turf/simulated/wall/r_wall{desc = "A specially coated wall that resists temperatures for Science"; max_temperature = 1e+009; name = "Coated Reinforced Wall"},/area/engine/mechanic_workshop)
+"crk" = (/obj/machinery/atmospherics/pipe/simple/visible,/turf/simulated/wall/r_wall/coated,/area/maintenance/turbine)
"crl" = (/obj/structure/disposalpipe/segment,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/door/airlock/maintenance{req_access_txt = "12"},/turf/simulated/floor/plating,/area/maintenance/apmaint)
"crm" = (/turf/simulated/wall/r_wall,/area/hallway/primary/aft)
"crn" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/disposalpipe/segment,/obj/item/device/radio/intercom{dir = 8; name = "station intercom (General)"; pixel_x = -28},/turf/simulated/floor/plasteel{dir = 8; icon_state = "cautioncorner"},/area/hallway/primary/aft)
@@ -6316,6 +6317,7 @@
"cry" = (/obj/structure/table,/obj/item/device/multitool,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/construction)
"crz" = (/obj/structure/table,/obj/item/weapon/wirecutters,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/construction)
"crA" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/light{icon_state = "tube1"; dir = 4},/obj/structure/table,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/construction)
+"crB" = (/turf/simulated/wall/r_wall/coated,/area/maintenance/turbine)
"crC" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/camera{c_tag = "Medbay Recovery Ward East"; dir = 8; network = list("SS13"); pixel_y = -22},/obj/structure/closet/wardrobe/pjs,/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/ward)
"crD" = (/obj/effect/spawner/window/reinforced,/obj/machinery/door/poddoor/shutters{density = 0; dir = 2; icon_state = "shutter0"; id_tag = "surgeryobs1"; name = "Privacy Shutters"; opacity = 0},/obj/structure/disposalpipe/segment,/turf/simulated/floor/plating,/area/medical/surgery)
"crE" = (/obj/effect/spawner/window/reinforced,/obj/machinery/door/poddoor/shutters{density = 0; dir = 2; icon_state = "shutter0"; id_tag = "surgeryobs2"; name = "Privacy Shutters"; opacity = 0},/obj/structure/disposalpipe/segment,/turf/simulated/floor/plating,/area/medical/surgery)
@@ -7342,6 +7344,7 @@
"cLl" = (/obj/effect/spawner/window/reinforced,/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "xenobio6"; name = "Containment Blast Doors"; opacity = 0},/obj/structure/disposalpipe/segment,/obj/structure/cable,/turf/simulated/floor/plating,/area/toxins/xenobiology)
"cLm" = (/obj/machinery/door/window/southright{name = "Containment Pen"; req_access_txt = "55"},/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "xenobio5"; name = "Containment Blast Doors"; opacity = 0},/turf/simulated/floor/engine,/area/toxins/xenobiology)
"cLn" = (/obj/effect/spawner/window/reinforced,/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "xenobio6"; name = "Containment Blast Doors"; opacity = 0},/obj/structure/cable,/turf/simulated/floor/plating,/area/toxins/xenobiology)
+"cLo" = (/obj/structure/sign/fire,/turf/simulated/wall/r_wall/coated,/area/maintenance/turbine)
"cLp" = (/obj/machinery/door/window/southright{name = "Containment Pen"; req_access_txt = "55"},/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "xenobio6"; name = "Containment Blast Doors"; opacity = 0},/turf/simulated/floor/engine,/area/toxins/xenobiology)
"cLr" = (/obj/structure/cable,/obj/machinery/power/solar{id = "starboardsolar"; name = "Starboard Solar Array"},/turf/simulated/floor/plasteel/airless{icon_state = "solarpanel"},/area/solar/starboard)
"cLs" = (/turf/simulated/floor/plating,/area/maintenance/engi_shuttle)
@@ -8160,7 +8163,6 @@
"dba" = (/obj/machinery/portable_atmospherics/canister/air,/obj/machinery/atmospherics/unary/portables_connector{dir = 8},/turf/simulated/floor/plating,/area/maintenance/asmaint2)
"dbb" = (/obj/machinery/access_button{command = "cycle_interior"; frequency = 1450; master_tag = "sci_maint"; name = "interior access button"; pixel_x = -28; pixel_y = -5; req_access_txt = "13"},/obj/effect/decal/warning_stripes/west,/obj/machinery/atmospherics/pipe/simple/hidden{dir = 6},/turf/simulated/floor/plating,/area/maintenance/asmaint2)
"dbc" = (/obj/structure/disposalpipe/trunk{dir = 1},/obj/structure/disposaloutlet,/turf/simulated/floor/plating/airless,/area/space)
-"dbd" = (/obj/structure/sign/fire,/turf/simulated/wall/r_wall,/area/maintenance/turbine)
"dbe" = (/obj/machinery/door/poddoor{id_tag = "turbinevent"; name = "Turbine Vent"},/turf/simulated/floor/engine{name = "vacuum floor"; nitrogen = 0.01; oxygen = 0.01},/area/maintenance/turbine)
"dbf" = (/obj/machinery/door/airlock/external{frequency = 1450; icon_state = "door_locked"; id_tag = "sci_inner"; locked = 1; name = "External Access"; req_access = null; req_access_txt = "13"},/obj/machinery/atmospherics/pipe/simple/hidden,/turf/simulated/floor/plating,/area/maintenance/asmaint2)
"dbg" = (/obj/structure/sign/securearea{desc = "A warning sign which reads 'EXTERNAL AIRLOCK'"; icon_state = "space"; layer = 4; name = "EXTERNAL AIRLOCK"; pixel_x = -32},/obj/machinery/light/small{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden,/turf/simulated/floor/plating,/area/maintenance/asmaint2)
@@ -8869,7 +8871,6 @@
"doH" = (/obj/machinery/firealarm{dir = 1; pixel_y = -24},/obj/machinery/vending/security,/turf/simulated/floor/plasteel{icon_state = "red"; dir = 6},/area/security/seceqstorage)
"doI" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/disposalpipe/sortjunction{dir = 1; icon_state = "pipe-j2s"; sortType = 7},/obj/structure/table,/obj/item/weapon/storage/fancy/donut_box,/turf/simulated/floor/plasteel{icon_state = "red"},/area/security/main)
"doJ" = (/turf/simulated/wall,/area/crew_quarters/courtroom)
-"doK" = (/obj/item/device/radio/intercom{name = "station intercom (General)"; pixel_y = -28},/obj/machinery/camera{c_tag = "Courtroom"; dir = 1; network = list("SS13")},/turf/simulated/floor/plasteel{icon_state = "wood"},/area/crew_quarters/courtroom)
"doL" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/wall,/area/crew_quarters/courtroom)
"doM" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/disposalpipe/segment{dir = 1; icon_state = "pipe-c"},/turf/simulated/floor/plating,/area/maintenance/fsmaint)
"doN" = (/obj/machinery/light_switch{pixel_y = -25},/obj/structure/closet/wardrobe/red,/turf/simulated/floor/plasteel{icon_state = "red"; dir = 6},/area/security/main)
@@ -9088,7 +9089,7 @@ bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbi
bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikdmPdmVdmSdmUdmPbikbikbikbikbikbikacGbikalSalTalTalTalTalUalValWalXalXalXalXalYbikacGbikbikbikaqeaqdaqdaqdaqfbikbikaqLaqPaqPaqPaqRaqRaqRaqRarhapBapBatRapBdpfdoYapEapEatSapEasbdpUapEatSapEasZaslasfapyariaroarjaAEasuahEaryarDarCarHarGauiaueaukatqarMatrapXatsattatuatvatwatxatyatzatAatBamKatCarTatDaabaabbikaabbikbikbikbikbikbikbikbikaabaabaabaabaabatEatFatDaabaabaabaabaabbikbikbikbikbikbikbikbikbikaabbikaabasMasMatGatHatIatJatKatLatMatIasMasMbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik
bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikdmPdmVdmSdmUdmPbikbikbikbikbikbikaabatNamLamLamLamLamLbikamMbikamLamLamLamLamLaabacGbikbikbikbikbikbikbikbikbikbikarIaqPaqPaqParJaqRarKarXarLapBatPatUatTatbatVaqsatQauJauEatdatcavEavBatWaqsatfaATapyapyapyathaSWatiahEarYaryasqasrahEatXatOarMarNarMaulapXatsarPattattattaumaovaunauoaupamKbikbikbikbikbikbikbikbikbikbikbikbikbikbikaabaabbikaabaabaabaabauqaabaabbikbikaabaabaabbikbikbikbikbikbikbikbikasMasMasMasMauratJausatJausautatJatJatJauuasMbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik
bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikdmPdmSdmSdmSdmWbikbikbikbikbikbikacGbikbikaabbikaabbikbikauvbikbikaabbikaabbikbikacGbikbikbikbikbikbikaahbikbikbikarIassaqPaqPastaqRaqRasxaxjapBarkavJauzaucauBaudauDdlLauFauGdpVauIdlMauKaujaugauNauNauNauNauNcwXauhahEasyasqaryasTasSasXasVasSauMauXauPapXatsavbavcavcavcavdaveavfavgavhamKbikbikbikbikbikaahbikbikbikbikbikbikbikaabaabbikbikbikaabaabaabaviaabaabbikbikaabbikaabaabbikbikbikbikbikbikbikasMavjavkavlavmavnavoavpatJatJavqavratJavsasMbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik
-bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikdmPdmXdmSdmSdmYbikbikbikbikbikbikacGacGacGaabaabaabaabavtavuavtaabaabaabaabacGacGacGbikbikbikbikbikbikbikbikbikbikaqLatadoKatkatjatmatlatZatYapBdlPdlQavyauZasgashdlRdlSashavvdrfashdlTdlUashavxavwavAavzapyavHapyavCahEauaauxaubasqdoTauCauAaSqavMavOavOavQavPavTavUavUavUavVavWavXavYavYavYbikbikbikbikbikbikbikbikbikbikbikbikaabaabbikbikbikbikaabaabavZawaavZaabaabbikaabbikbikaabaabbikbikbikbikbikbikasMawbawcawdaweawfawgatJatJatJawhawiatJawjasMbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik
+bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikdmPdmXdmSdmSdmYbikbikbikbikbikbikacGacGacGaabaabaabaabavtavuavtaabaabaabaabacGacGacGbikbikbikbikbikbikbikbikbikbikaqLatjataatlatkcqIatmatZatYapBdlPdlQavyauZasgashdlRdlSashavvdrfashdlTdlUashavxavwavAavzapyavHapyavCahEauaauxaubasqdoTauCauAaSqavMavOavOavQavPavTavUavUavUavVavWavXavYavYavYbikbikbikbikbikbikbikbikbikbikbikbikaabaabbikbikbikbikaabaabavZawaavZaabaabbikaabbikbikaabaabbikbikbikbikbikbikasMawbawcawdaweawfawgatJatJatJawhawiatJawjasMbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik
bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikdmPdmZdmSdnadmPbikaahbikbikbikbikaabbikaabbikbikaabbikavtawkawlbikbikaabbikbikaabbikbikbikbikbikbikbikbikbikbikauOauOazIazIazIavSdoJdoGdoLauRasUasUasUawoawvawuawrawrawsawrawyawwawrawtasZasZaUcawzawAawBawCawBawCawAahEahEahEahEahEasSauUauTauVaxbaxeaxdawEaxfavUawGawHawIavVawJawKawLawMavWbikbikbikbikbikbikbikbikbikbikbikaabaabbikbikbikbikbikaabbikavZawNavZbikaabbikaabbikbikbikaabaabbikbikbikbikbikasMawOawPavlawQawRawSawTatJawUawVawWawXasMawYaabbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik
bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikdnbdnddncdnddnebikbikbikbikbikbikaabbikaabbikbikaabavtavtawZaxaavtbikaabbikbikaabbikbikbikbikbikbikbikbikbikbikauOauWavDauYavGavFavIaxvdoQaxxdoZaxhaxhaxzaxlaxlaxlaxlaxlaxmaxnaxoaxlaxlaxlaxlaxpdoUaxlaxlaxqdoVaxqaxraxraxAaxraxBaxuadQavLavKavNaxXaxCaxDaxEapmavUaxGaxHaxIavVaxKaxLaxJaAZavWbikbikbikbikbikbikbikbikbikbikaabaabbikbikbikbikbikbikaabavZavZaxMavZavZaabbikaabbikbikbikbikaabaabbikbikbikbikasMaxNaxOavlasMavlavlaxPaxQasMasMasMasMasMasMaabaabbikbikbikbikbikaahbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik
bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikdnbdnfdnebikbikbikbikbikbikaabaabbikaabbikbikaabaxRaxSaxTaxUaxRaxVaxVbikbikaabbikbikbikbikbikbikbikbikbikbikdoFdoWaxqawnayjawpayjaygayiayhayoayjayjaypayjayjayjayjayjayqayjayjayjayjayjayjayPayuayjayjayjayQayjayRaxqaylaxqaymaynadQdrhdrgadQayraysaytaxEayUavUayvaywayxayyayzayAayBawMavWbikbikbikbikbikbikbikbikbikaabaabbikbikbikbikbikbikbikaabayCayDayEayFayCaabbikaabbikbikaabbikbikaabaabbikbikayGasMavlasMavlayHayIayHayJayHayHayHayKayGbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik
@@ -9160,7 +9161,7 @@ bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbi
bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikcnHcnIcnJcnKcnJcnLcnMcnNcnOcnPcnQcjKdnobUTbUTdnJcjMcjMcjMcjMcjMcjMcjMdnKdntdnCdnCdnCdnCdnLdnCdnCdntcnRcelcjMbikclkcnScnTcnUcnVcjScnWcnXcnYcnZciLcltcgdcbkchqcgfcoccodciPciPciPcoecofclAclAcogcohciWbGycoicklcoocokcolcomcomcoqcojcnhcomcomcopclHcrCcorcrNcfdcupcjpcxVcxUcxVcxVcxNcEickDcowcoxcoyckDcozcuscoicoAcoAcoAcoAcoAcoDcoDcoDcoAcoAbikbikbikbikckPcoEcoFcoGcnCcoHcoIcoJcoKcoLcoMcoNcoOcoPcoQcoRcoScoTcoUcnCcuncoWcvtcoYcoZcoZcoZcoZcoZcoZcoZcoZcoZcoZcoZcoZcoZcoZcoZcoZcoZcoZcpacpbbWhbZubWhbXZbXZbXZbXZbXZbXZbXZbWhbWhaabaabbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik
bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikcnHcpccpdcpecpfcmBcpgcphcpicmBcpjcpkdnMchobUTcqscjMbikbikbikbikbikcjMcqsdnldnAdnOdnCdnCdnCdnCdnPdnNcplcpmcjMbikcpncjOcpocjQcppcjScjScpqcprcpscptcpucpvcwqchqcgfcpycpzcpAcpBcpCciVcpDclAclAclAcpEciWbGybGycpFcpFcpGcpHcpIcpIcrDcyFcrEcpJcpJcpKcpFcpGcpMcqQcfdcrLcEjbjVcEYdbndbmcxNclRckDcoucpNcovckDbGycuscoAcoAaabaabbikbikbikbikbikbikbikbikbikbikbikcpRcpScpTcpUcpVcpWcpXcpXcpYcpXcpXcpXcpXcpXcpZcqacqbcqccqdbwocvvbXSbwobwoaabbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbWhcqhcqicqjbWhbWhbXZbXZcqkbXZbXZbWhbWhaabaabbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik
bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikcnHcqlcnJcqmcnJcqncqocqpcqqcnNcqrcjKdoAcwNbUTcfQcejbikbikbikbikbikcejdnRdntdnSdnSdnAdnUdnTdnCdnVdntcqscelcejbikbikbikbikciEcqtcqucqvcqvciLcqwciLcqxcgdcbkcqycqzcqAcqBcqCcqCcqCcqDcqEclAcqFclAcqGciWbGybGycpFcqHcrFcqJcqKcqLcsPcpFcsUcqMcqKcqNcsVcqPcpMczecyWczgcEjdbpdbodbrdbqdbsctcckDcpOcpPcpQckDbGycuscoAcvyaabaabaabbikbikbikbikbikbikbikbikbikbikcpRcqUcqVcqWcqXcqYcqZcracrbcpXcpXcrccpXcpXcpZcqbcqbcqbcrdbwocvzbxXbwoaabaabaabbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbWfcrhcribZvbWgbWhbWhbXZbYabXZbWhbWhaabaabbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik
-bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikcjKcjKcjKcjKcjKcjKdnWcrjcrjcrjcrjcrjdnQcrjcrjcrjcrjcrjcrjcrjcrjcrkcrkcrkcrkcrkdnYdnYdnYdnYdnYdnYdnYcekcrlcrmcrmcrmcrmcrmciEciLciLciLciLciLciLciLcrncgdcbkcrocrpcrqcrrcrscrtcrucrvcrwcrxcrycrzcrAciWbGybGycpFcuicsYcvocujcujcvpcpFcwicujcujcwjcujcwkcpMbGwbGwbGwcEjdbudbtdbvdbmdbxctcdbydbydbycoAcoAbGycuscoDcwpbikaabaabaabbikbikbikbikbikbikbikbikbikcpRczNczPcoBcrOcrPcrQcrRcrScpXcpXcpXcpXcrTcrUcrVcrWcrXcrYbwocvzbxXbwobikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbWfbWfbWfbWfbWgbWgbWhbWhbWhbWhbWiaabaabbikbikaahbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik
+bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikcjKcjKcjKcjKcjKcjKdnWcrjcrjcrjcrjcrjdnQcrjcrjcrjcrjcrjcrjcrjcrjcrjcrjcrjcrjcrjdnYdnYdnYdnYdnYdnYdnYcekcrlcrmcrmcrmcrmcrmciEciLciLciLciLciLciLciLcrncgdcbkcrocrpcrqcrrcrscrtcrucrvcrwcrxcrycrzcrAciWbGybGycpFcuicsYcvocujcujcvpcpFcwicujcujcwjcujcwkcpMbGwbGwbGwcEjdbudbtdbvdbmdbxctcdbydbydbycoAcoAbGycuscoDcwpbikaabaabaabbikbikbikbikbikbikbikbikbikcpRczNczPcoBcrOcrPcrQcrRcrScpXcpXcpXcpXcrTcrUcrVcrWcrXcrYbwocvzbxXbwobikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbWfbWfbWfbWfbWgbWgbWhbWhbWhbWhbWiaabaabbikbikaahbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik
bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaabbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaahbikbikbikbikbikbikbikaSecsdctvdnZctvdoBcsdcsecsfcsgcsgcshcsicspcskcslcsmcsncsocsrcsqcsqcsscsqcstctzctzctAcsvcswcsxcsycsxcsxcsxcswcsxcsxcszcsAcsBcsCcgdcbkcsDcsEcsFcsGcgfcsHcmQcsIcsJcsKcsLcsMcsNcsObGybGycpFcwlcsQcsRcsScsTcwmcpFdehcsTcsWcsXdlFdqVcwrbikbikbikcEjdbAdbzdbAdbAdbCdbBdbEdbDdbycwFbVibGycuscoDcwpbikbikaabaabaabbikbikbikbikbikbikbikbikctdckPcxGckSctdctfctgcthctictjctkctlcpXcpXctmctnctoctpctqbwocvzbxXcxHbikbikbikbikbikbikbikbikbikbikbikaahbikbikbikbikbikbikbikaabaabaabaabbikbikbikbikaabaabaabaabbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik
bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaSecsdctvctvctvdoBcsdctuctvctwctvctxctyctDctCdmedcYdmedmfcxnctEctFctEctEctGcblcblctEctHctEctEctEctEctEctEctEctEctEctEctIctJctKctLctMctNctOctPctQctRctSctTctUctVctWctXciFctZcuacnqcubcuccudcuecufcugcuhdqWcpFdqXcqKcugcukcqKculcwrbikbikbikdbFcmkdbGdbJdbIdbCdbKdbMdbLdbOdbNceFceJdbPcoDcwpbikbikbikaabaabaabbikbikbikbikbikbikbikckPcurczQcutckPcnCcnCcnCcnCcnCcnCcuuctlcuvcuwcuxcuycnCcnCbwocvzbxXcxHbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik
bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaSedobctvdocctvdoBcuBdodcuCcuDcuEcuFcuGcuHcuIcuJcuKcuLcuMcuNcuOcuPcuQdoeceAcuSceAcuNcuTcuNcuNcuNcuNcuNcuNcuNcuNcuNcuNcuUctEcuVcuWcuXcuYcuZcvacvbcvccvdcvecvfcvgcvhcvicvjcvkcsLceJcvlcvmcvncqKcqJcqKcqKdqYcpFdqZcqKcqKcqNcqKcyGcwrbikbikbikdbFdbRdbQdbTdbSdbVdbUdbXdbWdbybGychCcyHcuscoAbikbikbikbikbikaabckPckPckPckPckPckPckPckPckPcvucxScvwckPcxOcxOcyIckPaabcnCcnCcvAcnCcvBcvCcvDcnCcyKcyJcvzbxXcxHbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik
@@ -9196,11 +9197,11 @@ bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbi
bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaaccMucMucMucMucMucMucMucECcSDcSEbikddcaaccSQaabaabdlqdlpdlraabcTzbikaacddcbikcSEcSDcECcECcMHcECcCKcTAcTBcTAcCKcTCcTDcTCcCKcTEcTFcTEcCKaabcUkbikacGbikbikcYhcZRcZTcZScZucZUcZWcZVcYicZXcZZcZYdaacAhbGycGvcGvdabdaddacbGydaeazybikaabbikcxHcxHcxHbwobwobwobwobwobwodafcyKcyJdagbxXbxXcyJbxXbxXbxXbxXcYqbxXcPAcqecrZcsacsbcqeaabbikbikbikbikaabbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik
bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaabaacaabaacaacaabaabaabacGacGcECcECcTGcSEbikddfddgbikbikaabdlscTHdltaabbikbikdlodlnbikcSEcTJcECcECcMHcECcCKcTAcTKcTAcCKcTCcTLcTCcCKcTEcTMcTEcCKaabcUkbikacGbikbikcYhcYhcYhdahcYhdaidajdaicYicZXdakbGycGzdalcFicHrcGvdamcoAcoDcoDcoDdanaabaabbikcxHdaodapcyJbxXdaqdarcNRcyJdasbxXcyJdatbxXbxXdaubxXbwobwobwocxHcxHbwocqectrctscttcqeaabbikaabbikbikaabbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik
bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaabbikaabaabbikbikaabaabacGcECcECcSDcSEbikddcaacbikcTNaabdlvdludlwaabaabcSQaacddcbikcSEcSDcECcECcMHcECcCKcCKcCKcCKcCKcCKcCKcCKcCKcCKcCKcCKcCKaabcUkbikaqZbikbikbikbikbikdavcYhdawdaydaxcYibGydazbGybGydaAdaBcGqdaDdaCcoAbikbikbikbikbikaabbikcxHdaEdaFdaubxXcQobxXbxXdaucZobxXcyJcyJcyJcyJcyJbxXbwoaabbikbikbikaabcuzcuzcuAcuzcuzaabaabczraabaabcZEaabbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik
-bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaabaabcECcTncTocSEbikddcaacbikbikaabaabaabaabaabbikbikaacddcbikcSEcTlcTmcECcUscECcECcECcECcUvcTScTScTScTScTScTScTScTScTScTScUwbikacGaabaabaabaabaabdaGcYhdaidaHdaicYhcoAdaIcFicFidaJdaLdaKcoAcoAcoAbikbikbikbikbikaabbikcxHdaodaMcyJcNRbxXbxXdaNcyJdaObxXbxXbxXbxXbxXbxXbxXbwoaabbikbikbikaabbikcuzcvEcuzbikaabbikaabbikbikaabbikbikbikbikaahbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik
-bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaahbikbikbikbikaabcECcTdcSEcTPbikddfddgbikbikbikaabbikbikbikbikbikdlodlnbikcSEcSEcTdcECddhddjddicMHddkcUwbikbikbikbikbikbikbikbikbikbikbikbikacGaabaabaabaabaabdaGcYhdaPdaRdaQdaSaabcoAcoAcoDdaTcoDcoAcoAbikaabbikbikbikbikbikaabaabcxHcxHcxHbwobwobwobxXcyJbwodaUbwobwocNRbFeczfbzNczMbwoaabbikbikbikaabbikcuzcwMcuzbikaabbikaabbikbikaabbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik
-bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaabcECcTXcTYdddaabddcaaccSQbikbikcSQbikbikbikbikcSQaacddcbikddecUacUbcECddlcECcECcECcECcECcECacGacGacGaqZacGacGacGacGacGacGacGacGaahbikbikbikbikdaGcYhcYhdaVcYhcYhbikaabbikbikdaWbikbikbikbikbikbikbikbikbikbikbikaabaabbikbikbikbikbwodaFdaXbwocGxaabbwobwocxHcxHczMbwobikaabbikbikbikaabbikbikcxZbikbikaabbikaabbikbikaabbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik
-bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaahbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikcECcUfcUgcUhbikddcaacaacdlxaacaacdlxaacaacdlxaacaacddcbikcUicUgcUjcECddmcTRddnddocTTcTUcRebikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikdcdazycYhdaYcYhdaZaabaabbikbikdctbikbikbikbikbikbikbikbikbikbikbikaabaabbikaahbikbikbwodbbdbabwodbcaabbikaabbikbikaabbikbikaabbikbikbikaabbikbikcznbikbikaabbikaabbikbikaabbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik
-bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikcNycECcECdlybikdlzcTIcTIdlAcTIcTIdlAcTIcTIdlAcTIcTIdlBbikdlycECcECcECddmcUcddpcUlddqcUecRebikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikazydbddbedbdazyaabbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaabaabaabbikbikbikcxHdbfcxHcxHaabczrbikaabbikbikaabbikagQagQacGaqZaabaabaabaabcGEaabaabaabaabczragiagQagQbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik
+bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaabaabcECcTncTocSEbikddcaacbikbikaabaabaabaabaabbikbikaacddcbikcSEcTlcTmcECcUscECcECcECcECcUvcTScTScTScTScTScTScTScTScTScTScUwbikacGaabaabaabaabaabdaGcrBcrkdaHcrkcrBcoAdaIcFicFidaJdaLdaKcoAcoAcoAbikbikbikbikbikaabbikcxHdaodaMcyJcNRbxXbxXdaNcyJdaObxXbxXbxXbxXbxXbxXbxXbwoaabbikbikbikaabbikcuzcvEcuzbikaabbikaabbikbikaabbikbikbikbikaahbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik
+bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaahbikbikbikbikaabcECcTdcSEcTPbikddfddgbikbikbikaabbikbikbikbikbikdlodlnbikcSEcSEcTdcECddhddjddicMHddkcUwbikbikbikbikbikbikbikbikbikbikbikbikacGaabaabaabaabaabdaGcrBdaPdaRdaQdaSaabcoAcoAcoDdaTcoDcoAcoAbikaabbikbikbikbikbikaabaabcxHcxHcxHbwobwobwobxXcyJbwodaUbwobwocNRbFeczfbzNczMbwoaabbikbikbikaabbikcuzcwMcuzbikaabbikaabbikbikaabbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik
+bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaabcECcTXcTYdddaabddcaaccSQbikbikcSQbikbikbikbikcSQaacddcbikddecUacUbcECddlcECcECcECcECcECcECacGacGacGaqZacGacGacGacGacGacGacGacGaahbikbikbikbikdaGcrBcrBdaVcrBcrBbikaabbikbikdaWbikbikbikbikbikbikbikbikbikbikbikaabaabbikbikbikbikbwodaFdaXbwocGxaabbwobwocxHcxHczMbwobikaabbikbikbikaabbikbikcxZbikbikaabbikaabbikbikaabbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik
+bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaahbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikcECcUfcUgcUhbikddcaacaacdlxaacaacdlxaacaacdlxaacaacddcbikcUicUgcUjcECddmcTRddnddocTTcTUcRebikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikdcdazycrBdaYcrBdaZaabaabbikbikdctbikbikbikbikbikbikbikbikbikbikbikaabaabbikaahbikbikbwodbbdbabwodbcaabbikaabbikbikaabbikbikaabbikbikbikaabbikbikcznbikbikaabbikaabbikbikaabbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik
+bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikcNycECcECdlybikdlzcTIcTIdlAcTIcTIdlAcTIcTIdlAcTIcTIdlBbikdlycECcECcECddmcUcddpcUlddqcUecRebikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikazycLodbecLoazyaabbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaabaabaabbikbikbikcxHdbfcxHcxHaabczrbikaabbikbikaabbikagQagQacGaqZaabaabaabaabcGEaabaabaabaabczragiagQagQbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik
bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaabcECcKDcSkcUhaabaabaabaabbikbikbikbikbikaabaabaabaabcUicSjcKDcECcECddrcECcECcECcECcUncECaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabazybikbikbikazyaabbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaabaabbikbikbikcxHdbgcxHbikbikbikbikaabbikbikaabbikagQbikbikaabbikaabbikbikcHNbikbikaabbikaabbikbikagQbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik
bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaabbikcECcECcSkcRScRScRScRScRScRScRScRScRScRScRScRScRScSjcECcECcECddtaHmcECbikbikbikcUocUxbikbikbikaabbikbikbikaabbikbikbikaabbikbikbikaabbikaabazyazyazyazyazybikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaabaabbikbikcxHdbhcxHbikbikbikbikaabbikbikaabbikagQbikcIYcIYcIYcIYcIYaabcIZaabcIYcIYcIYcIYcIYbikagQbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik
bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikcECcECcECcECcECcECcECcECcECcECcECcECcECcECcECcECcECbikcECcECaIpcECcECcECcECcUrdducUuddxcUucUtcUuddxcUucUucUuddxcUucUtcUuddxcUuddvcUpaabbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaabaabbikcxHdbicxHbikbikbikbikbikbikbikaabbikagQaabcKccKdcKdcKdcKdcKecKfcKgcKhcKhcKhcKhcKiaabagQbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik
diff --git a/_maps/metastation.dm b/_maps/metastation.dm
index 2010b25d501..9240a5e928f 100644
--- a/_maps/metastation.dm
+++ b/_maps/metastation.dm
@@ -25,7 +25,14 @@ z7 = empty space
#define MAP_FILE "MetaStation.v41A.II.dmm"
#define MAP_NAME "MetaStation"
- #define MAP_TRANSITION_CONFIG list(MAIN_STATION = CROSSLINKED, CENTCOMM = SELFLOOPING, TELECOMMS = CROSSLINKED, DERELICT = CROSSLINKED, MINING = CROSSLINKED, EMPTY_AREA = CROSSLINKED, EMPTY_AREA_2 = CROSSLINKED)
+ #define MAP_TRANSITION_CONFIG list(\
+DECLARE_LEVEL(MAIN_STATION, CROSSLINKED, list(STATION_LEVEL, STATION_CONTACT, REACHABLE, AI_OK)),\
+DECLARE_LEVEL(CENTCOMM, SELFLOOPING, list(ADMIN_LEVEL, BLOCK_TELEPORT, IMPEDES_MAGIC)),\
+DECLARE_LEVEL(TELECOMMS, CROSSLINKED, list(REACHABLE, BOOSTS_SIGNAL, AI_OK)),\
+DECLARE_LEVEL(DERELICT, CROSSLINKED, list(REACHABLE)),\
+DECLARE_LEVEL(MINING, CROSSLINKED, list(REACHABLE, STATION_CONTACT, AI_OK, ORE_LEVEL, HAS_WEATHER)),\
+DECLARE_LEVEL(EMPTY_AREA, CROSSLINKED, list(REACHABLE)),\
+DECLARE_LEVEL(EMPTY_AREA_2, CROSSLINKED, list(REACHABLE)))
#elif !defined(MAP_OVERRIDE)
diff --git a/code/LINDA/LINDA_fire.dm b/code/LINDA/LINDA_fire.dm
index 14f8ab20998..d5ab43d4ab3 100644
--- a/code/LINDA/LINDA_fire.dm
+++ b/code/LINDA/LINDA_fire.dm
@@ -126,6 +126,9 @@
var/radiated_temperature = location.air.temperature*FIRE_SPREAD_RADIOSITY_SCALE
for(var/direction in cardinal)
if(!(location.atmos_adjacent_turfs & direction))
+ var/turf/simulated/wall/W = get_step(src, direction)
+ if(istype(W))
+ W.adjacent_fire_act(W, radiated_temperature)
continue
var/turf/simulated/T = get_step(src, direction)
if(istype(T) && T.active_hotspot)
diff --git a/code/__DEFINES/gamemode.dm b/code/__DEFINES/gamemode.dm
index 5a097e9026a..76a879f3868 100644
--- a/code/__DEFINES/gamemode.dm
+++ b/code/__DEFINES/gamemode.dm
@@ -13,6 +13,7 @@
#define GAMEMODE_IS_REVOLUTION (ticker && istype(ticker.mode, /datum/game_mode/revolution))
//special roles
+// Distinct from the ROLE_X defines because some antags have multiple special roles but only one ban type
#define SPECIAL_ROLE_ABDUCTOR_AGENT "Abductor Agent"
#define SPECIAL_ROLE_ABDUCTOR_SCIENTIST "Abductor Scientist"
#define SPECIAL_ROLE_BLOB "Blob"
diff --git a/code/__DEFINES/misc.dm b/code/__DEFINES/misc.dm
index cbd39a49a21..37c45ba954d 100644
--- a/code/__DEFINES/misc.dm
+++ b/code/__DEFINES/misc.dm
@@ -1,20 +1,5 @@
-
-
-
-//zlevel defines, can be overriden for different maps in the appropriate _maps file.
-#define ZLEVEL_STATION 1
-#define ZLEVEL_CENTCOMM 2
-#define ZLEVEL_TELECOMMS 3
-#define ZLEVEL_ENGI 4
-#define ZLEVEL_ASTEROID 5
-#define ZLEVEL_DERELICT 6
-#define ZLEVEL_EMPTY 7
-#define MAX_Z 7 // Used in space.dm to defince which Z-levels cannot be exited via space.
#define TRANSITIONEDGE 7 //Distance from edge to move to another z-level
-///
-#define ENGINE_EJECT_Z 3
-
//Object specific defines
#define CANDLE_LUM 3 //For how bright candles are
diff --git a/code/_globalvars/mapping.dm b/code/_globalvars/mapping.dm
index 2324bf85077..abc81f9d52a 100644
--- a/code/_globalvars/mapping.dm
+++ b/code/_globalvars/mapping.dm
@@ -7,14 +7,6 @@ var/list/cardinal = list( NORTH, SOUTH, EAST, WEST )
var/list/alldirs = list(NORTH, SOUTH, EAST, WEST, NORTHEAST, NORTHWEST, SOUTHEAST, SOUTHWEST)
var/list/diagonals = list(NORTHEAST, NORTHWEST, SOUTHEAST, SOUTHWEST)
-//This list contains the z-level numbers which can be accessed via space travel and the percentile chances to get there.
-//(Exceptions: extended, sandbox and nuke) -Errorage
-//Was list("3" = 30, "4" = 70).
-//Spacing should be a reliable method of getting rid of a body -- Urist.
-//Go away Urist, I'm restoring this to the longer list. ~Errorage
-// TODO: Tie into space manager
-var/list/accessable_z_levels = list(ZLEVEL_STATION,ZLEVEL_TELECOMMS,ZLEVEL_ENGI,ZLEVEL_ASTEROID,ZLEVEL_DERELICT,ZLEVEL_EMPTY) //Keep this to six maps, repeating z-levels is okay if needed
-
var/global/list/global_map = null
//list/global_map = list(list(1,5),list(4,3))//an array of map Z levels.
//Resulting sector map looks like
@@ -26,9 +18,6 @@ var/global/list/global_map = null
//3 - AI satellite
//5 - empty space
-// TODO: Tie into space manager
-var/shuttle_z = ZLEVEL_CENTCOMM //default
-
var/list/monkeystart = list()
var/list/wizardstart = list()
var/list/newplayer_start = list()
diff --git a/code/controllers/Processes/shuttles.dm b/code/controllers/Processes/shuttles.dm
index 9c20d612247..8108fdea027 100644
--- a/code/controllers/Processes/shuttles.dm
+++ b/code/controllers/Processes/shuttles.dm
@@ -164,8 +164,7 @@ var/const/CALL_SHUTTLE_REASON_LENGTH = 12
continue
var/turf/T = get_turf(thing)
- // TODO: Tie into space manager
- if(T && T.z == ZLEVEL_STATION)
+ if(T && is_station_level(T.z))
callShuttle = 0
break
@@ -210,8 +209,7 @@ var/const/CALL_SHUTTLE_REASON_LENGTH = 12
if(!M.roundstart_move)
continue
for(var/obj/docking_port/stationary/S in stationary)
- // TODO: Tie into space manager
- if(S.z != ZLEVEL_STATION && findtext(S.id, M.id))
+ if(!is_station_level(S.z) && findtext(S.id, M.id))
S.width = M.width
S.height = M.height
S.dwidth = M.dwidth
diff --git a/code/controllers/Processes/weather.dm b/code/controllers/Processes/weather.dm
index df9ee95369b..6cdcce750b6 100644
--- a/code/controllers/Processes/weather.dm
+++ b/code/controllers/Processes/weather.dm
@@ -1,5 +1,5 @@
-// TODO: Tie into space manager
//Used for all kinds of weather, ex. lavaland ash storms.
+// TODO: This could probably be better-integrated with the space manager
var/global/datum/controller/process/weather/weather_master
/datum/controller/process/weather
@@ -33,7 +33,7 @@ var/global/datum/controller/process/weather/weather_master
var/list/possible_weather_for_this_z = list()
for(var/V in existing_weather)
var/datum/weather/WE = V
- if(WE.target_z == Z && WE.probability) //Another check so that it doesn't run extra weather
+ if(WE.target_level == Z && WE.probability) //Another check so that it doesn't run extra weather
possible_weather_for_this_z[WE] = WE.probability
var/datum/weather/W = pickweight(possible_weather_for_this_z)
run_weather(W.name)
diff --git a/code/controllers/configuration.dm b/code/controllers/configuration.dm
index 09596d4445c..6b1d1d8e19f 100644
--- a/code/controllers/configuration.dm
+++ b/code/controllers/configuration.dm
@@ -496,18 +496,6 @@
if("max_maint_drones")
config.max_maint_drones = text2num(value)
- if("station_levels")
- config.station_levels = text2numlist(value, ";")
-
- if("admin_levels")
- config.admin_levels = text2numlist(value, ";")
-
- if("contact_levels")
- config.contact_levels = text2numlist(value, ";")
-
- if("player_levels")
- config.player_levels = text2numlist(value, ";")
-
if("expected_round_length")
config.expected_round_length = MinutesToTicks(text2num(value))
diff --git a/code/controllers/master_controller.dm b/code/controllers/master_controller.dm
index ed618d7d72f..f013e4e817c 100644
--- a/code/controllers/master_controller.dm
+++ b/code/controllers/master_controller.dm
@@ -52,7 +52,7 @@ var/global/pipe_processing_killed = 0
if(!config.disable_space_ruins)
var/timer = start_watch()
log_startup_progress("Creating random space levels...")
- seedRuins(ZLEVEL_EMPTY, rand(0, 3), /area/space, space_ruins_templates)
+ seedRuins(level_name_to_num(EMPTY_AREA), rand(0, 3), /area/space, space_ruins_templates)
log_startup_progress("Loaded random space levels in [stop_watch(timer)]s.")
// We'll keep this around for the time when we finally expunge all
diff --git a/code/datums/cache/air_alarm.dm b/code/datums/cache/air_alarm.dm
index 67de7f95f21..b507c096081 100644
--- a/code/datums/cache/air_alarm.dm
+++ b/code/datums/cache/air_alarm.dm
@@ -15,8 +15,7 @@ var/global/datum/repository/air_alarm/air_alarm_repository = new()
alarms[++alarms.len] = passed_alarm.get_nano_data_console()
else
for(var/obj/machinery/alarm/alarm in (monitored_alarms ? monitored_alarms : air_alarms))
- // TODO: Tie into space manager
- if(!monitored_alarms && alarm.z != ZLEVEL_STATION && alarm.z != ZLEVEL_ASTEROID)
+ if(!monitored_alarms && !is_station_contact(alarm.z))
continue
alarms[++alarms.len] = alarm.get_nano_data_console()
diff --git a/code/datums/diseases/advance/advance.dm b/code/datums/diseases/advance/advance.dm
index b97ce1f5c7f..5492a9f9ced 100644
--- a/code/datums/diseases/advance/advance.dm
+++ b/code/datums/diseases/advance/advance.dm
@@ -406,8 +406,7 @@ var/list/advance_cures = list(
AD.Refresh()
for(var/mob/living/carbon/human/H in shuffle(living_mob_list))
- // TODO: Tie into space manager
- if(H.z != ZLEVEL_STATION)
+ if(!is_station_level(H.z))
continue
if(!H.HasDisease(D))
H.ForceContractDisease(D)
diff --git a/code/datums/spell.dm b/code/datums/spell.dm
index 63b9405f73e..f16e1f6b263 100644
--- a/code/datums/spell.dm
+++ b/code/datums/spell.dm
@@ -67,10 +67,7 @@ var/list/spells = typesof(/obj/effect/proc_holder/spell) //needed for the badmin
caster.reset_view(0)
return 0
- // TODO: Tie into space manager
- if(user.z == ZLEVEL_CENTCOMM && !centcom_cancast) //Certain spells are not allowed on the centcom zlevel
- return 0
- if(user.z == ZLEVEL_CENTCOMM && ticker.mode.name == "ragin' mages")
+ if(is_admin_level(user.z) && (!centcom_cancast || ticker.mode.name == "ragin' mages")) //Certain spells are not allowed on the centcom zlevel
return 0
if(!skipcharge)
@@ -364,10 +361,7 @@ var/list/spells = typesof(/obj/effect/proc_holder/spell) //needed for the badmin
if(((!user.mind) || !(src in user.mind.spell_list)) && !(src in user.mob_spell_list))
return 0
- // TODO: Tie into space manager
- if(user.z == ZLEVEL_CENTCOMM && !centcom_cancast) //Certain spells are not allowed on the centcom zlevel
- return 0
- if(user.z == ZLEVEL_CENTCOMM && ticker.mode.name == "ragin' mages")
+ if(is_admin_level(user.z) && (!centcom_cancast || ticker.mode.name == "ragin' mages")) //Certain spells are not allowed on the centcom zlevel
return 0
switch(charge_type)
@@ -388,9 +382,9 @@ var/list/spells = typesof(/obj/effect/proc_holder/spell) //needed for the badmin
if((invocation_type == "whisper" || invocation_type == "shout") && H.is_muzzled())
return 0
- var/obj/effect/proc_holder/spell/noclothes/clothcheck = locate() in user.mob_spell_list
- var/obj/effect/proc_holder/spell/noclothes/clothcheck2 = locate() in user.mind.spell_list
- if(clothes_req && !(clothcheck && istype(clothcheck)) && !(clothcheck2 && istype(clothcheck2)))//clothes check
+ var/clothcheck = locate(/obj/effect/proc_holder/spell/noclothes) in user.mob_spell_list
+ var/clothcheck2 = user.mind && (locate(/obj/effect/proc_holder/spell/noclothes) in user.mind.spell_list)
+ if(clothes_req && !clothcheck && !clothcheck2) //clothes check
if(!istype(H.wear_suit, /obj/item/clothing/suit/wizrobe) && !istype(H.wear_suit, /obj/item/clothing/suit/space/rig/wizard))
return 0
if(!istype(H.shoes, /obj/item/clothing/shoes/sandal))
diff --git a/code/datums/weather/weather.dm b/code/datums/weather/weather.dm
index 7a073edc902..7002f92061b 100644
--- a/code/datums/weather/weather.dm
+++ b/code/datums/weather/weather.dm
@@ -28,7 +28,7 @@
var/area_type = /area/space //Types of area to affect
var/list/impacted_areas = list() //Areas to be affected by the weather, calculated when the weather begins
- var/target_z = ZLEVEL_STATION //The z-level to affect
+ var/target_level = MAIN_STATION //The z-level to affect
var/overlay_layer = 10 //Since it's above everything else, this is the layer used by default. 2 is below mobs and walls if you need to use that.
var/aesthetic = FALSE //If the weather has no purpose other than looks
@@ -52,13 +52,13 @@
stage = STARTUP_STAGE
for(var/V in get_areas(area_type))
var/area/A = V
- if(A.z == target_z)
+ if(is_on_level_name(A,target_level))
impacted_areas |= A
weather_duration = rand(weather_duration_lower, weather_duration_upper)
update_areas()
for(var/V in player_list)
var/mob/M = V
- if(M.z == target_z)
+ if(is_on_level_name(M,target_level))
if(telegraph_message)
to_chat(M, telegraph_message)
if(telegraph_sound)
@@ -72,7 +72,7 @@
update_areas()
for(var/V in player_list)
var/mob/M = V
- if(M.z == target_z)
+ if(is_on_level_name(M,target_level))
if(weather_message)
to_chat(M, weather_message)
if(weather_sound)
@@ -87,7 +87,7 @@
update_areas()
for(var/V in player_list)
var/mob/M = V
- if(M.z == target_z)
+ if(is_on_level_name(M,target_level))
if(end_message)
to_chat(M, end_message)
if(end_sound)
@@ -102,7 +102,7 @@
update_areas()
/datum/weather/proc/can_impact(mob/living/L) //Can this weather impact a mob?
- if(L.z != target_z)
+ if(!is_on_level_name(L,target_level))
return
if(immunity_type in L.weather_immunities)
return
diff --git a/code/datums/weather/weather_types.dm b/code/datums/weather/weather_types.dm
index bf942b7ceba..0295d8f36fb 100644
--- a/code/datums/weather/weather_types.dm
+++ b/code/datums/weather/weather_types.dm
@@ -1,5 +1,4 @@
//Different types of weather.
-// TODO: Tie into space manager
/datum/weather/floor_is_lava //The Floor is Lava: Makes all turfs damage anyone on them unless they're standing on a solid object.
name = "the floor is lava"
@@ -17,7 +16,7 @@
end_duration = 0
area_type = /area
- target_z = ZLEVEL_STATION
+ target_level = MAIN_STATION
overlay_layer = 2 //Covers floors only
immunity_type = "lava"
@@ -51,7 +50,7 @@
end_duration = 0
area_type = /area
- target_z = ZLEVEL_STATION
+ target_level = MAIN_STATION
/datum/weather/advanced_darkness/update_areas()
for(var/V in impacted_areas)
@@ -88,7 +87,7 @@
end_overlay = "light_ash"
area_type = /area/mine
- target_z = ZLEVEL_ASTEROID
+ target_level = MINING
immunity_type = "ash"
diff --git a/code/game/area/Space Station 13 areas.dm b/code/game/area/Space Station 13 areas.dm
index 07ad5956002..27eaf0490ff 100644
--- a/code/game/area/Space Station 13 areas.dm
+++ b/code/game/area/Space Station 13 areas.dm
@@ -67,8 +67,7 @@ var/list/teleportlocs = list()
if(AR.no_teleportlocs) continue
if(teleportlocs.Find(AR.name)) continue
var/turf/picked = safepick(get_area_turfs(AR.type))
- // TODO: Tie into space manager
- if(picked && (picked.z == ZLEVEL_STATION))
+ if(picked && is_station_level(picked.z))
teleportlocs += AR.name
teleportlocs[AR.name] = AR
diff --git a/code/game/atoms.dm b/code/game/atoms.dm
index 0435ead41b2..bc58c346b01 100644
--- a/code/game/atoms.dm
+++ b/code/game/atoms.dm
@@ -42,8 +42,7 @@
if(!T)
return 0
- // TODO: Tie into space manager
- if(T.z != ZLEVEL_CENTCOMM)//if not, don't bother
+ if(!is_admin_level(T.z))//if not, don't bother
return 0
//check for centcomm shuttles
@@ -60,8 +59,7 @@
if(!T)
return 0
- // TODO: Tie into space manager
- if(T.z != ZLEVEL_CENTCOMM)//if not, don't bother
+ if(!is_admin_level(T.z))//if not, don't bother
return 0
if(istype(T.loc, /area/shuttle/syndicate_elite) || istype(T.loc, /area/syndicate_mothership))
diff --git a/code/game/gamemodes/antag_spawner.dm b/code/game/gamemodes/antag_spawner.dm
index 298f0707d5d..e0187e940e4 100644
--- a/code/game/gamemodes/antag_spawner.dm
+++ b/code/game/gamemodes/antag_spawner.dm
@@ -80,8 +80,7 @@
var/mob/living/demon_type = /mob/living/simple_animal/slaughter
/obj/item/weapon/antag_spawner/slaughter_demon/attack_self(mob/user as mob)
- // TODO: Tie into space manager
- if(user.z == ZLEVEL_CENTCOMM)//this is to make sure the wizard does NOT summon a demon from the Den..
+ if(level_blocks_magic(user.z))//this is to make sure the wizard does NOT summon a demon from the Den..
to_chat(user, "You should probably wait until you reach the station.")
return
diff --git a/code/game/gamemodes/blob/blob.dm b/code/game/gamemodes/blob/blob.dm
index 83b75c6c725..d8f4a7a3850 100644
--- a/code/game/gamemodes/blob/blob.dm
+++ b/code/game/gamemodes/blob/blob.dm
@@ -118,8 +118,7 @@ var/list/blob_nodes = list()
if(directory[ckey(blob.key)])
blob_client = directory[ckey(blob.key)]
location = get_turf(C)
- // TODO: Tie into space manager
- if(location.z != ZLEVEL_STATION || istype(location, /turf/space))
+ if(!is_station_level(location.z) || istype(location, /turf/space))
if(!warned)
to_chat(C, "You feel ready to burst, but this isn't an appropriate place! You must return to the station!")
message_admins("[key_name_admin(C)] was in space when the blobs burst, and will die if he doesn't return to the station.")
diff --git a/code/game/gamemodes/blob/blob_report.dm b/code/game/gamemodes/blob/blob_report.dm
index e74a0677942..198c0264dd1 100644
--- a/code/game/gamemodes/blob/blob_report.dm
+++ b/code/game/gamemodes/blob/blob_report.dm
@@ -23,8 +23,7 @@
var/nukecode = rand(10000, 99999)
for(var/obj/machinery/nuclearbomb/bomb in world)
if(bomb && bomb.r_code)
- // TODO: Tie into space manager
- if(bomb.z == ZLEVEL_STATION)
+ if(is_station_level(bomb.z))
bomb.r_code = nukecode
intercepttext += "Nanotrasen Update: Biohazard Alert.
"
diff --git a/code/game/gamemodes/borer/borer.dm b/code/game/gamemodes/borer/borer.dm
index 0f03bc1430f..bdcc5880df3 100644
--- a/code/game/gamemodes/borer/borer.dm
+++ b/code/game/gamemodes/borer/borer.dm
@@ -35,7 +35,7 @@
return 0 // not enough candidates for borer
for(var/obj/machinery/atmospherics/unary/vent_pump/v in world)
- if(!v.welded && (v.z in config.station_levels))
+ if(!v.welded && is_station_level(v.z))
found_vents.Add(v)
// for each 2 possible borers, add one borer and one host
@@ -156,4 +156,4 @@
greet_borer(borer)
- return
\ No newline at end of file
+ return
diff --git a/code/game/gamemodes/changeling/changeling.dm b/code/game/gamemodes/changeling/changeling.dm
index 29e38febe5a..0e3926149ed 100644
--- a/code/game/gamemodes/changeling/changeling.dm
+++ b/code/game/gamemodes/changeling/changeling.dm
@@ -169,29 +169,6 @@ var/list/possible_changeling_IDs = list("Alpha","Beta","Gamma","Delta","Epsilon"
linghud.leave_hud(changeling.current)
set_antag_hud(changeling.current, null)
-
-/*/datum/game_mode/changeling/check_finished()
- var/changelings_alive = 0
- for(var/datum/mind/changeling in changelings)
- if(!istype(changeling.current,/mob/living/carbon))
- continue
- if(changeling.current.stat==2)
- continue
- changelings_alive++
-
- if(changelings_alive)
- changelingdeath = 0
- return ..()
- else
- if(!changelingdeath)
- changelingdeathtime = world.time
- changelingdeath = 1
- if(world.time-changelingdeathtime > TIME_TO_GET_REVIVED)
- return 1
- else
- return ..()
- return 0*/
-
/datum/game_mode/proc/grant_changeling_powers(mob/living/carbon/changeling_mob)
if(!istype(changeling_mob)) return
changeling_mob.make_changeling()
diff --git a/code/game/gamemodes/cult/runes.dm b/code/game/gamemodes/cult/runes.dm
index e1c0f6e6a93..acb599d1595 100644
--- a/code/game/gamemodes/cult/runes.dm
+++ b/code/game/gamemodes/cult/runes.dm
@@ -14,8 +14,7 @@ var/list/sacrificed = list()
for(var/obj/effect/rune/R in world)
if(R == src)
continue
- // TODO: Tie into space manager
- if(R.word1 == cultwords["travel"] && R.word2 == cultwords["self"] && R.word3 == key && R.z != ZLEVEL_CENTCOMM)
+ if(R.word1 == cultwords["travel"] && R.word2 == cultwords["self"] && R.word3 == key && is_teleport_allowed(R.z))
index++
allrunesloc.len = index
allrunesloc[index] = R.loc
diff --git a/code/game/gamemodes/events.dm b/code/game/gamemodes/events.dm
index 54db8374d29..d1fd034e312 100644
--- a/code/game/gamemodes/events.dm
+++ b/code/game/gamemodes/events.dm
@@ -2,8 +2,7 @@
//command_announcement.Announce("Unidentified lifesigns detected coming aboard [station_name()]. Secure any exterior access, including ducting and ventilation.", "Lifesign Alert", new_sound = 'sound/AI/aliens.ogg')
var/list/vents = list()
for(var/obj/machinery/atmospherics/unary/vent_pump/temp_vent in machines)
- // TODO: Tie into space manager
- if((temp_vent.loc.z in config.station_levels) && !temp_vent.welded)
+ if(is_station_level(temp_vent.loc.z) && !temp_vent.welded)
if(temp_vent.parent.other_atmosmch.len > 50) // Stops Aliens getting stuck in small networks. See: Security, Virology
vents += temp_vent
diff --git a/code/game/gamemodes/game_mode.dm b/code/game/gamemodes/game_mode.dm
index 77f503a1db2..63fb22bc694 100644
--- a/code/game/gamemodes/game_mode.dm
+++ b/code/game/gamemodes/game_mode.dm
@@ -427,8 +427,7 @@ proc/get_nt_opposed()
/proc/get_nuke_code()
var/nukecode = "ERROR"
for(var/obj/machinery/nuclearbomb/bomb in world)
- // TODO: Tie into space manager
- if(bomb && bomb.r_code && bomb.z == ZLEVEL_STATION)
+ if(bomb && bomb.r_code && is_station_level(bomb.z))
nukecode = bomb.r_code
return nukecode
@@ -452,8 +451,7 @@ proc/get_nt_opposed()
text += " died"
else
text += " survived"
- if(fleecheck && ply.current.z > ZLEVEL_STATION)
- // TODO: Tie into space manager
+ if(fleecheck && !is_station_level(ply.current.z))
text += " while fleeing the station"
if(ply.current.real_name != ply.name)
text += " as [ply.current.real_name]"
diff --git a/code/game/gamemodes/gameticker.dm b/code/game/gamemodes/gameticker.dm
index e60d12bdaa1..3da0f5fe7fa 100644
--- a/code/game/gamemodes/gameticker.dm
+++ b/code/game/gamemodes/gameticker.dm
@@ -266,8 +266,7 @@ var/round_start_time = 0
M.client.screen += cinematic
if(M.stat != DEAD)
var/turf/T = get_turf(M)
- // TODO: Tie into space manager
- if(T && T.z == ZLEVEL_STATION)
+ if(T && is_station_level(T.z))
M.death(0) //no mercy
//Now animate the cinematic
diff --git a/code/game/gamemodes/malfunction/Malf_Modules.dm b/code/game/gamemodes/malfunction/Malf_Modules.dm
index 5bda0d9db4c..ba331791650 100644
--- a/code/game/gamemodes/malfunction/Malf_Modules.dm
+++ b/code/game/gamemodes/malfunction/Malf_Modules.dm
@@ -1,19 +1,3 @@
-// TO DO:
-/*
-epilepsy flash on lights
-delay round message
-microwave makes robots
-dampen radios
-reactivate cameras - done
-eject engine
-core sheild
-cable stun
-rcd light flash thingy on matter drain
-
-
-
-*/
-
/datum/AI_Module
var/uses = 0
var/module_name
@@ -25,7 +9,6 @@ rcd light flash thingy on matter drain
var/power_type
-
/datum/AI_Module/large/
uses = 1
@@ -33,28 +16,11 @@ rcd light flash thingy on matter drain
uses = 5
-/datum/AI_Module/large/fireproof_core
- module_name = "Core Upgrade"
- mod_pick_name = "coreup"
- description = "An upgrade to improve core resistance, making it immune to fire and heat. This effect is permanent."
- cost = 50
- one_time = 1
-
- power_type = /mob/living/silicon/ai/proc/fireproof_core
-
-/mob/living/silicon/ai/proc/fireproof_core()
- set category = "Malfunction"
- set name = "Fireproof Core"
- for(var/mob/living/silicon/ai/ai in player_list)
- ai.fire_res_on_core = 1
- src.verbs -= /mob/living/silicon/ai/proc/fireproof_core
- to_chat(src, "Core fireproofed.")
-
/datum/AI_Module/large/upgrade_turrets
module_name = "AI Turret Upgrade"
mod_pick_name = "turret"
- description = "Improves the firing power and health of all AI turrets. This effect is permanent."
- cost = 50
+ description = "Improves the power and health of all AI turrets. This effect is permanent."
+ cost = 30
one_time = 1
power_type = /mob/living/silicon/ai/proc/upgrade_turrets
@@ -69,13 +35,47 @@ rcd light flash thingy on matter drain
src.verbs -= /mob/living/silicon/ai/proc/upgrade_turrets
for(var/obj/machinery/porta_turret/turret in machines)
var/turf/T = get_turf(turret)
- // TODO: Tie into space manager
- if(T.z in config.station_levels)
- // Increase health by 37.5% of original max, decrease delays between shots to 66%
- turret.health += initial(turret.health) * 3 / 8
+ if(is_station_level(T.z))
+ turret.health += 30
turret.eprojectile = /obj/item/projectile/beam/laser/heavylaser //Once you see it, you will know what it means to FEAR.
turret.eshot_sound = 'sound/weapons/lasercannonfire.ogg'
to_chat(src, "Turrets upgraded.")
+
+
+/datum/AI_Module/large/lockdown
+ module_name = "Hostile Station Lockdown"
+ mod_pick_name = "lockdown"
+ description = "Overload the airlock, blast door and fire control networks, locking them down. Caution! This command also electrifies all airlocks. The networks will automatically reset after 90 seconds."
+ cost = 30
+ one_time = 1
+
+ power_type = /mob/living/silicon/ai/proc/lockdown
+
+/mob/living/silicon/ai/proc/lockdown()
+ set category = "Malfunction"
+ set name = "Initiate Hostile Lockdown"
+
+ if(stat)
+ return
+
+ for(var/obj/machinery/door/D in airlocks)
+ if(!is_station_level(D.z))
+ continue
+ spawn(0)
+ D.hostile_lockdown(src)
+ addtimer(D, "disable_lockdown", 900)
+
+ var/obj/machinery/computer/communications/C = locate() in machines
+ if(C)
+ C.post_status("alert", "lockdown")
+
+ verbs -= /mob/living/silicon/ai/proc/lockdown
+ minor_announcement.Announce("Hostile runtime detected in door controllers. Isolation lockdown protocols are now in effect. Please remain calm.", "Network Alert")
+ to_chat(src, "Lockdown Initiated. Network reset in 90 seconds.")
+ spawn(900)
+ minor_announcement.Announce("Automatic system reboot complete. Have a secure day.","Network reset:")
+
+
/datum/AI_Module/large/destroy_rcd
module_name = "Destroy RCDs"
mod_pick_name = "rcd"
@@ -93,19 +93,16 @@ rcd light flash thingy on matter drain
if(stat || malf_cooldown)
return
- for(var/obj/item/RCD in rcd_list)
+ for(var/obj/item/weapon/rcd/RCD in rcd_list)
if(!istype(RCD, /obj/item/weapon/rcd/borg)) //Ensures that cyborg RCDs are spared.
- RCD.audible_message("[RCD] begins to vibrate and buzz loudly!","[RCD] begins vibrating violently!")
- spawn(50) //5 seconds to get rid of it!
- if(RCD) //Make sure it still exists (In case of chain-reaction)
- explosion(RCD, 0, 0, 3, 1, flame_range = 1)
- qdel(RCD)
+ RCD.detonate_pulse()
to_chat(src, "RCD detonation pulse emitted.")
malf_cooldown = 1
spawn(100)
malf_cooldown = 0
+
/datum/AI_Module/large/mecha_domination
module_name = "Viral Mech Domination"
mod_pick_name = "mechjack"
@@ -125,21 +122,71 @@ rcd light flash thingy on matter drain
return
can_dominate_mechs = 1 //Yep. This is all it does. Honk!
- to_chat(src, "Virus package compiled. Select a target mech at any time. \
- You must remain on the station at all times. Loss of signal will result in total system lockout.")
+ to_chat(src, "Virus package compiled. Select a target mech at any time. You must remain on the station at all times. Loss of signal will result in total system lockout.")
verbs -= /mob/living/silicon/ai/proc/mech_takeover
+
+/datum/AI_Module/large/break_fire_alarms
+ module_name = "Thermal Sensor Override"
+ mod_pick_name = "burnpigs"
+ description = "Gives you the ability to override the thermal sensors on all fire alarms. This will remove their ability to scan for fire and thus their ability to alert. \
+ Anyone can check the fire alarm's interface and may be tipped off by its status."
+ one_time = 1
+ cost = 25
+
+ power_type = /mob/living/silicon/ai/proc/break_fire_alarms
+
+/mob/living/silicon/ai/proc/break_fire_alarms()
+ set name = "Override Thermal Sensors"
+ set category = "Malfunction"
+
+ if(stat)
+ return
+
+ for(var/obj/machinery/firealarm/F in machines)
+ if(!is_station_level(F.z))
+ continue
+ F.emagged = 1
+ to_chat(src, "All thermal sensors on the station have been disabled. Fire alerts will no longer be recognized.")
+ verbs -= /mob/living/silicon/ai/proc/break_fire_alarms
+
+
+/datum/AI_Module/large/break_air_alarms
+ module_name = "Air Alarm Safety Override"
+ mod_pick_name = "allow_flooding"
+ description = "Gives you the ability to disable safeties on all air alarms. This will allow you to use the environmental mode Flood, which disables scrubbers as well as pressure checks on vents. \
+ Anyone can check the air alarm's interface and may be tipped off by their nonfunctionality."
+ one_time = 1
+ cost = 50
+
+ power_type = /mob/living/silicon/ai/proc/break_air_alarms
+
+/mob/living/silicon/ai/proc/break_air_alarms()
+ set name = "Disable Air Alarm Safeties"
+ set category = "Malfunction"
+
+ if(stat)
+ return
+
+ for(var/obj/machinery/alarm/AA in machines)
+ if(!is_station_level(AA.z))
+ continue
+ AA.emagged = 1
+ to_chat(src, "All air alarm safeties on the station have been overriden. Air alarms may now use the Flood environmental mode.")
+ verbs -= /mob/living/silicon/ai/proc/break_air_alarms
+
+
/datum/AI_Module/small/overload_machine
module_name = "Machine Overload"
mod_pick_name = "overload"
description = "Overloads an electrical machine, causing a small explosion. 2 uses."
uses = 2
- cost = 15
+ cost = 20
power_type = /mob/living/silicon/ai/proc/overload_machine
-/mob/living/silicon/ai/proc/overload_machine(obj/machinery/M as obj in world)
+/mob/living/silicon/ai/proc/overload_machine(obj/machinery/M in machines)
set name = "Overload Machine"
set category = "Malfunction"
@@ -147,56 +194,55 @@ rcd light flash thingy on matter drain
return
if(istype(M, /obj/machinery))
- if(istype(M,/obj/machinery/field/generator))
- to_chat(src, "This machine can not be overloaded due to a firewall.")
- return
for(var/datum/AI_Module/small/overload_machine/overload in current_modules)
if(overload.uses > 0)
overload.uses --
- for(var/mob/V in hearers(M, null))
- V.show_message("You hear a loud electrical buzzing sound!", 2)
+ audible_message("You hear a loud electrical buzzing sound!")
+ to_chat(src, "Overloading machine circuitry...")
spawn(50)
- explosion(get_turf(M), 0,1,1,0)
- qdel(M)
+ if(M)
+ explosion(get_turf(M), 0,1,1,0)
+ qdel(M)
else
- to_chat(src, "Out of uses.")
+ to_chat(src, "Out of uses.")
else
to_chat(src, "That's not a machine.")
+
/datum/AI_Module/small/override_machine
module_name = "Machine Override"
mod_pick_name = "override"
description = "Overrides a machine's programming, causing it to rise up and attack everyone except other machines. 4 uses."
uses = 4
- cost = 15
+ cost = 30
power_type = /mob/living/silicon/ai/proc/override_machine
-/mob/living/silicon/ai/proc/override_machine(obj/machinery/M as obj in world)
+
+/mob/living/silicon/ai/proc/override_machine(obj/machinery/M in machines)
set name = "Override Machine"
set category = "Malfunction"
if(stat)
return
- if(istype(M, /obj/machinery))
- if(istype(M,/obj/machinery/field/generator))
- to_chat(src, "This machine can not be overloaded due to a firewall.")
- return
+ if (istype(M, /obj/machinery))
+ if(!M.can_be_overridden())
+ to_chat(src, "Can't override this device.")
for(var/datum/AI_Module/small/override_machine/override in current_modules)
if(override.uses > 0)
override.uses --
- for(var/mob/V in hearers(M, null))
- V.show_message("You hear a loud electrical buzzing sound!", 2)
+ audible_message("You hear a loud electrical buzzing sound!")
to_chat(src, "Reprogramming machine behaviour...")
spawn(50)
- if(M)
+ if(M && !qdeleted(M))
new /mob/living/simple_animal/hostile/mimic/copy/machine(get_turf(M), M, src, 1)
else
- to_chat(src, "Out of uses.")
+ to_chat(src, "Out of uses.")
else
to_chat(src, "That's not a machine.")
+
/datum/AI_Module/large/place_cyborg_transformer
module_name = "Robotic Factory (Removes Shunting)"
mod_pick_name = "cyborgtransformer"
@@ -268,7 +314,7 @@ rcd light flash thingy on matter drain
if(success)
return 1
alert(src, alert_msg)
- return
+
/datum/AI_Module/small/blackout
module_name = "Blackout"
@@ -298,6 +344,7 @@ rcd light flash thingy on matter drain
else
to_chat(src, "Out of uses.")
+
/datum/AI_Module/small/reactivate_cameras
module_name = "Reactivate Camera Network"
mod_pick_name = "recam"
@@ -339,7 +386,8 @@ rcd light flash thingy on matter drain
spawn(30) //Lag protection
malf_cooldown = 0
-/datum/AI_Module/small/upgrade_cameras
+
+/datum/AI_Module/large/upgrade_cameras
module_name = "Upgrade Camera Network"
mod_pick_name = "upgradecam"
description = "Install broad-spectrum scanning and electrical redundancy firmware to the camera network, enabling EMP-Proofing and light-amplified X-ray vision." //I <3 pointless technobabble
@@ -358,6 +406,7 @@ rcd light flash thingy on matter drain
var/upgradedcams = 0
see_override = SEE_INVISIBLE_MINIMUM //Night-vision, without which X-ray would be very limited in power.
+ update_sight()
for(var/obj/machinery/camera/C in cameranet.cameras)
if(C.assembly)
@@ -379,6 +428,26 @@ rcd light flash thingy on matter drain
to_chat(src, "OTA firmware distribution complete! Cameras upgraded: [upgradedcams]. Light amplification system online.")
verbs -= /mob/living/silicon/ai/proc/upgrade_cameras
+
+/datum/AI_Module/large/eavesdrop
+ module_name = "Enhanced Surveillance"
+ mod_pick_name = "eavesdrop"
+ description = "Via a combination of hidden microphones and lip reading software, you are able to use your cameras to listen in on conversations."
+ cost = 30
+ one_time = 1
+
+ power_type = /mob/living/silicon/ai/proc/surveillance
+
+/mob/living/silicon/ai/proc/surveillance()
+ set category = "Malfunction"
+ set name = "Enhanced Surveillance"
+
+ if(eyeobj)
+ eyeobj.relay_speech = TRUE
+ to_chat(src, "OTA firmware distribution complete! Cameras upgraded: Enhanced surveillance package online.")
+ verbs -= /mob/living/silicon/ai/proc/surveillance
+
+
/datum/module_picker
var/temp = null
var/processing_time = 100
@@ -421,6 +490,10 @@ rcd light flash thingy on matter drain
return
var/mob/living/silicon/ai/A = usr
+ if(A.stat == DEAD)
+ to_chat(A, "You are already dead!") //Omae Wa Mou Shindeiru
+ return
+
for(var/datum/AI_Module/AM in possible_modules)
if(href_list[AM.mod_pick_name])
@@ -442,6 +515,7 @@ rcd light flash thingy on matter drain
break
// Give the power and take away the money.
+ A.view_core() //A BYOND bug requires you to be viewing your core before your verbs update
A.verbs += AM.power_type
A.current_modules += new AM.type
temp = AM.description
@@ -450,6 +524,4 @@ rcd light flash thingy on matter drain
if(href_list["showdesc"])
if(AM.mod_pick_name == href_list["showdesc"])
temp = AM.description
-
- src.use(usr)
- return
+ use(usr)
diff --git a/code/game/gamemodes/malfunction/malfunction.dm b/code/game/gamemodes/malfunction/malfunction.dm
index 0993881bd9d..ce1baabb05b 100644
--- a/code/game/gamemodes/malfunction/malfunction.dm
+++ b/code/game/gamemodes/malfunction/malfunction.dm
@@ -141,8 +141,7 @@
/datum/game_mode/proc/check_ai_loc()
for(var/datum/mind/AI_mind in malf_ai)
var/turf/ai_location = get_turf(AI_mind.current)
- // TODO: Tie into space manager
- if(ai_location && (ai_location.z == ZLEVEL_STATION))
+ if(ai_location && is_station_level(ai_location.z))
return 1
return 0
diff --git a/code/game/gamemodes/meteor/meteors.dm b/code/game/gamemodes/meteor/meteors.dm
index a2ff0f4e1d8..890cc4e151c 100644
--- a/code/game/gamemodes/meteor/meteors.dm
+++ b/code/game/gamemodes/meteor/meteors.dm
@@ -36,8 +36,7 @@
var/Me = pickweight(meteortypes)
var/obj/effect/meteor/M = new Me(pickedstart)
M.dest = pickedgoal
- // TODO: Tie into space manager
- M.z_original = ZLEVEL_STATION
+ M.z_original = level_name_to_num(MAIN_STATION)
spawn(0)
walk_towards(M, M.dest, 1)
return
@@ -103,7 +102,6 @@
var/dropamt = 2
/obj/effect/meteor/Move()
- // TODO: Tie into space manager
if(z != z_original || loc == dest)
qdel(src)
return
diff --git a/code/game/gamemodes/miniantags/borer/borer_event.dm b/code/game/gamemodes/miniantags/borer/borer_event.dm
index 28a0282487d..b0df1749403 100644
--- a/code/game/gamemodes/miniantags/borer/borer_event.dm
+++ b/code/game/gamemodes/miniantags/borer/borer_event.dm
@@ -17,8 +17,7 @@
/datum/event/borer_infestation/start()
var/list/vents = list()
for(var/obj/machinery/atmospherics/unary/vent_pump/temp_vent in world)
- // TODO: Tie into space manager
- if((temp_vent.loc.z in config.station_levels) && !temp_vent.welded)
+ if(is_station_level(temp_vent.loc.z) && !temp_vent.welded)
//Stops cortical borers getting stuck in small networks. See: Security, Virology
if(temp_vent.parent.other_atmosmch.len > 50)
vents += temp_vent
diff --git a/code/game/gamemodes/miniantags/bot_swarm/swarmer.dm b/code/game/gamemodes/miniantags/bot_swarm/swarmer.dm
index ed84f211e53..1f9f5ff115a 100644
--- a/code/game/gamemodes/miniantags/bot_swarm/swarmer.dm
+++ b/code/game/gamemodes/miniantags/bot_swarm/swarmer.dm
@@ -290,14 +290,13 @@
/mob/living/simple_animal/hostile/swarmer/proc/DisperseTarget(var/mob/living/target)
if(target != src)
to_chat(src, "Attempting to remove this being from our presence.")
- // TODO: Tie into space manager
- if(src.z != ZLEVEL_STATION)
+ if(!is_station_level(src.z))
to_chat(src, "Our bluespace transceiver cannot locate a viable bluespace link, our teleportation abilities are useless in this area.")
return
if(do_mob(src, target, 30))
var/cycle
for(cycle=0,cycle<100,cycle++)
- var/random_location = locate(rand(37,202),rand(75,192),ZLEVEL_STATION)//Drunk dial a turf in the general ballpark of the station
+ var/random_location = locate(rand(37,202),rand(75,192),level_name_to_num(MAIN_STATION))//Drunk dial a turf in the general ballpark of the station
if(istype(random_location, /turf/simulated/floor))
var/turf/simulated/floor/F = random_location
if(F.air)
diff --git a/code/game/gamemodes/nations/nations.dm b/code/game/gamemodes/nations/nations.dm
index 587107cc524..74038879fd7 100644
--- a/code/game/gamemodes/nations/nations.dm
+++ b/code/game/gamemodes/nations/nations.dm
@@ -142,8 +142,7 @@ datum/game_mode/nations
/datum/game_mode/nations/proc/remove_access()
for(var/obj/machinery/door/airlock/W in airlocks)
- // TODO: Tie into space manager
- if(W.z in config.station_levels)
+ if(is_station_level(W.z))
W.req_access = list()
diff --git a/code/game/gamemodes/nuclear/nuclear_challenge.dm b/code/game/gamemodes/nuclear/nuclear_challenge.dm
index 15a4c8ec246..790c6a18e34 100644
--- a/code/game/gamemodes/nuclear/nuclear_challenge.dm
+++ b/code/game/gamemodes/nuclear/nuclear_challenge.dm
@@ -19,8 +19,7 @@
if(player_list.len < MIN_CHALLENGE_PLAYERS)
to_chat(user, "The enemy crew is too small to be worth declaring war on.")
return
- // TODO: Tie into space manager
- if(user.z != ZLEVEL_CENTCOMM)
+ if(!is_admin_level(user.z))
to_chat(user, "You have to be at your base to use this.")
return
diff --git a/code/game/gamemodes/nuclear/nuclearbomb.dm b/code/game/gamemodes/nuclear/nuclearbomb.dm
index ae22e0ec458..833cb6d99ae 100644
--- a/code/game/gamemodes/nuclear/nuclearbomb.dm
+++ b/code/game/gamemodes/nuclear/nuclearbomb.dm
@@ -353,8 +353,7 @@ var/bomb_set
var/off_station = 0
var/turf/bomb_location = get_turf(src)
- // TODO: Tie into space manager
- if( bomb_location && (bomb_location.z in config.station_levels) )
+ if( bomb_location && is_station_level(bomb_location.z) )
if( (bomb_location.x < (128-NUKERANGE)) || (bomb_location.x > (128+NUKERANGE)) || (bomb_location.y < (128-NUKERANGE)) || (bomb_location.y > (128+NUKERANGE)) )
off_station = 1
else
@@ -364,8 +363,7 @@ var/bomb_set
if(ticker.mode && ticker.mode.name == "nuclear emergency")
var/obj/docking_port/mobile/syndie_shuttle = shuttle_master.getShuttle("syndicate")
if(syndie_shuttle)
- // TODO: Tie into space manager
- ticker.mode:syndies_didnt_escape = (syndie_shuttle.z > ZLEVEL_STATION ? 0 : 1) //muskets will make me change this, but it will do for now
+ ticker.mode:syndies_didnt_escape = is_station_level(syndie_shuttle.z)
ticker.mode:nuke_off_station = off_station
ticker.station_explosion_cinematic(off_station,null)
if(ticker.mode)
@@ -403,8 +401,7 @@ var/bomb_set
/obj/item/weapon/disk/nuclear/process()
var/turf/disk_loc = get_turf(src)
- // TODO: Tie into space manager
- if(disk_loc.z != ZLEVEL_STATION && disk_loc.z != ZLEVEL_CENTCOMM)
+ if(!is_secure_level(disk_loc.z))
var/holder = get(src, /mob)
if(holder)
to_chat(holder, "You can't help but feel that you just lost something back there...")
diff --git a/code/game/gamemodes/objective.dm b/code/game/gamemodes/objective.dm
index c2cf8e352dd..14c77b2060a 100644
--- a/code/game/gamemodes/objective.dm
+++ b/code/game/gamemodes/objective.dm
@@ -60,7 +60,6 @@ var/list/potential_theft_objectives = subtypesof(/datum/theft_objective) \
/datum/objective/assassinate/check_completion()
if(target && target.current)
- // TODO: Tie into space manager
if(target.current.stat == DEAD)
return 1
if(issilicon(target.current) || isbrain(target.current)) //Borgs/brains/AIs count as dead for traitor objectives. --NeoFite
@@ -87,8 +86,7 @@ var/list/potential_theft_objectives = subtypesof(/datum/theft_objective) \
if(target.current.stat == DEAD || !ishuman(target.current) || !target.current.ckey || !target.current.client)
return 1
var/turf/T = get_turf(target.current)
- // TODO: Tie into space manager
- if(T && !(T.z in config.station_levels)) //If they leave the station they count as dead for this
+ if(T && !is_station_level(T.z)) //If they leave the station they count as dead for this
return 1
return 0
return 1
@@ -117,9 +115,8 @@ var/list/potential_theft_objectives = subtypesof(/datum/theft_objective) \
if(target in ticker.mode.head_revolutionaries)
return 1
- // TODO: Tie into space manager
var/turf/T = get_turf(target.current)
- if(T && !(T.z in config.station_levels))
+ if(T && !is_station_level(T.z))
return 1
return 0
@@ -148,8 +145,7 @@ var/list/potential_theft_objectives = subtypesof(/datum/theft_objective) \
if(isbrain(target.current))
return 1
var/turf/T = get_turf(target.current)
- // TODO: Tie into space manager
- if(T.z in config.admin_levels)
+ if(is_admin_level(T.z))
return 0
return 0
return 1
@@ -522,8 +518,7 @@ var/list/potential_theft_objectives = subtypesof(/datum/theft_objective) \
/datum/objective/destroy/check_completion()
if(target && target.current)
- // TODO: Tie into space manager
- if(target.current.stat == DEAD || target.current.z > ZLEVEL_DERELICT || !target.current.ckey)
+ if(target.current.stat == DEAD || is_away_level(target.current.z) || !target.current.ckey)
return 1
return 0
return 1
diff --git a/code/game/gamemodes/revolution/revolution.dm b/code/game/gamemodes/revolution/revolution.dm
index ce59b316499..83846818091 100644
--- a/code/game/gamemodes/revolution/revolution.dm
+++ b/code/game/gamemodes/revolution/revolution.dm
@@ -314,8 +314,7 @@
/datum/game_mode/revolution/proc/check_heads_victory()
for(var/datum/mind/rev_mind in head_revolutionaries)
var/turf/T = get_turf(rev_mind.current)
- // TODO: Tie into space manager
- if((rev_mind) && (rev_mind.current) && (rev_mind.current.stat != 2) && rev_mind.current.client && T && (T.z == ZLEVEL_STATION))
+ if((rev_mind) && (rev_mind.current) && (rev_mind.current.stat != DEAD) && rev_mind.current.client && T && is_station_level(T.z))
if(ishuman(rev_mind.current))
return 0
return 1
diff --git a/code/game/gamemodes/scoreboard.dm b/code/game/gamemodes/scoreboard.dm
index a8091d04727..c4957b3b937 100644
--- a/code/game/gamemodes/scoreboard.dm
+++ b/code/game/gamemodes/scoreboard.dm
@@ -21,14 +21,12 @@
// Who is alive/dead, who escaped
for(var/mob/living/silicon/ai/I in mob_list)
- // TODO: Tie into space manager
- if(I.stat == DEAD && (I.z in config.station_levels))
+ if(I.stat == DEAD && is_station_level(I.z))
score_deadaipenalty++
score_deadcrew++
for(var/mob/living/carbon/human/I in mob_list)
- // TODO: Tie into space manager
- if(I.stat == DEAD && (I.z in config.station_levels))
+ if(I.stat == DEAD && is_station_level(I.z))
score_deadcrew++
if(I && I.mind)
@@ -81,9 +79,7 @@
// Check station's power levels
for(var/obj/machinery/power/apc/A in apcs)
- // TODO: Tie into space manager
- if(!(A.z in config.station_levels)) continue
-
+ if(!is_station_level(A.z)) continue
for(var/obj/item/weapon/stock_parts/cell/C in A.contents)
if(C.charge < 2300)
score_powerloss++ //200 charge leeway
@@ -91,8 +87,7 @@
// Check how much uncleaned mess is on the station
for(var/obj/effect/decal/cleanable/M in world)
- // TODO: Tie into space manager
- if(!(M.z in config.station_levels)) continue
+ if(!is_station_level(M.z)) continue
if(istype(M, /obj/effect/decal/cleanable/blood/gibs))
score_mess += 3
diff --git a/code/game/gamemodes/xenos/xenos.dm b/code/game/gamemodes/xenos/xenos.dm
index 844aad1fe71..c4659993e45 100644
--- a/code/game/gamemodes/xenos/xenos.dm
+++ b/code/game/gamemodes/xenos/xenos.dm
@@ -122,8 +122,7 @@
command_announcement.Announce("The aliens have nearly succeeded in capturing the station and exterminating the crew. Activate the nuclear failsafe to stop the alien threat once and for all. The Nuclear Authentication Code is [get_nuke_code()] ", "Alien Lifeform Alert")
set_security_level("gamma")
var/obj/machinery/door/airlock/vault/V = locate(/obj/machinery/door/airlock/vault) in world
- // TODO: Tie into space manager
- if(V && (V.z in config.station_levels))
+ if(V && is_station_level(V.z))
V.locked = 0
V.update_icon()
return ..()
@@ -143,8 +142,7 @@
var/list/livingplayers = list()
for(var/mob/M in player_list)
var/turf/T = get_turf(M)
- // TODO: Tie into space manager
- if((M) && (M.stat != 2) && M.client && T && ((T.z in config.station_levels) || shuttle_master.emergency.mode >= SHUTTLE_ESCAPE && ((T.z in config.station_levels) || (T.z in config.admin_levels))))
+ if((M) && (M.stat != DEAD) && M.client && T && (is_station_level(T.z) || shuttle_master.emergency.mode >= SHUTTLE_ESCAPE && is_secure_level(T.z)))
if(ishuman(M))
livingplayers += 1
return livingplayers.len
diff --git a/code/game/jobs/whitelist.dm b/code/game/jobs/whitelist.dm
index 345b65c1d6b..2a99414cb0b 100644
--- a/code/game/jobs/whitelist.dm
+++ b/code/game/jobs/whitelist.dm
@@ -21,7 +21,7 @@ var/list/whitelist = list()
if(guest_jobbans(rank))
if(!config.usewhitelist)
return 1
- if(check_rights(R_ADMIN, 0))
+ if(check_rights(R_ADMIN, 0, M))
return 1
if(!dbcon.IsConnected())
to_chat(usr, "\red Unable to connect to whitelist database. Please try again later.
")
diff --git a/code/game/machinery/alarm.dm b/code/game/machinery/alarm.dm
index ac95e1b2a05..5515eb7ab3a 100644
--- a/code/game/machinery/alarm.dm
+++ b/code/game/machinery/alarm.dm
@@ -710,7 +710,7 @@
data["rcon"] = rcon_setting
data["target_temp"] = target_temperature - T0C
data["atmos_alarm"] = alarm_area.atmosalm
- data["emagged"] = emagged || isAI(user)
+ data["emagged"] = emagged
data["modes"] = list(
AALARM_MODE_SCRUBBING = list("name"="Filtering", "desc"="Scrubs out contaminants"),\
AALARM_MODE_VENTING = list("name"="Draught", "desc"="Siphons out air while replacing"),\
@@ -769,7 +769,6 @@
var/turf/pos = get_turf(src)
data["x"] = pos.x
data["y"] = pos.y
- // TODO: Tie into space manager
data["z"] = pos.z
return data
diff --git a/code/game/machinery/atmoalter/area_atmos_computer.dm b/code/game/machinery/atmoalter/area_atmos_computer.dm
index a75c3afac88..36b680f1ebc 100644
--- a/code/game/machinery/atmoalter/area_atmos_computer.dm
+++ b/code/game/machinery/atmoalter/area_atmos_computer.dm
@@ -113,7 +113,6 @@
scrubber.update_icon()
proc/validscrubber( var/obj/machinery/portable_atmospherics/scrubber/huge/scrubber as obj )
- // TODO: Tie into space manager
if(!isobj(scrubber) || get_dist(scrubber.loc, src.loc) > src.range || scrubber.loc.z != src.loc.z)
return 0
diff --git a/code/game/machinery/camera/camera.dm b/code/game/machinery/camera/camera.dm
index bcf8ee75b00..0935f8443f6 100644
--- a/code/game/machinery/camera/camera.dm
+++ b/code/game/machinery/camera/camera.dm
@@ -43,7 +43,7 @@
/obj/machinery/camera/initialize()
..()
- if(z == ZLEVEL_STATION && prob(3) && !start_active)
+ if(is_station_level(z) && prob(3) && !start_active)
toggle_cam()
/obj/machinery/camera/Destroy()
diff --git a/code/game/machinery/camera/tracking.dm b/code/game/machinery/camera/tracking.dm
index cccc7e52f91..909d53be265 100644
--- a/code/game/machinery/camera/tracking.dm
+++ b/code/game/machinery/camera/tracking.dm
@@ -1,10 +1,7 @@
/mob/living/silicon/ai/proc/InvalidTurf(turf/T as turf)
if(!T)
return 1
- // TODO: Tie into space manager
- if((T.z in config.admin_levels))
- return 1
- if(T.z > MAX_Z)
+ if(!is_level_reachable(T.z))
return 1
return 0
diff --git a/code/game/machinery/computer/camera.dm b/code/game/machinery/computer/camera.dm
index a9b1e3ff31c..fd5dc873739 100644
--- a/code/game/machinery/computer/camera.dm
+++ b/code/game/machinery/computer/camera.dm
@@ -75,8 +75,7 @@
var/list/cameras = list()
for(var/obj/machinery/camera/C in cameranet.cameras)
- // TODO: Tie into space manager
- if((z > MAX_Z || C.z > MAX_Z) && (C.z != z)) //can only recieve away mission cameras on away missions
+ if((is_away_level(src.z) || is_away_level(C.z)) && !atoms_share_level(C, src)) //can only recieve away mission cameras on away missions
continue
if(!can_access_camera(C))
continue
diff --git a/code/game/machinery/computer/communications.dm b/code/game/machinery/computer/communications.dm
index 790c516fc95..5ea7456fd08 100644
--- a/code/game/machinery/computer/communications.dm
+++ b/code/game/machinery/computer/communications.dm
@@ -54,8 +54,7 @@
if(..(href, href_list))
return 1
- // TODO: Tie into space manager
- if((!(src.z in config.station_levels) && !(src.z in config.admin_levels)))
+ if(!is_secure_level(src.z))
to_chat(usr, "Unable to establish a connection: You're too far away from the station!")
return 1
@@ -304,8 +303,7 @@
if(stat & (NOPOWER|BROKEN))
return
- // TODO: Tie into space manager
- if(!(src.z in list(ZLEVEL_STATION, ZLEVEL_CENTCOMM)))
+ if(!is_secure_level(src.z))
to_chat(user, "Unable to establish a connection: You're too far away from the station!")
return
diff --git a/code/game/machinery/computer/honkputer.dm b/code/game/machinery/computer/honkputer.dm
index 75880d41975..b20821d24c2 100644
--- a/code/game/machinery/computer/honkputer.dm
+++ b/code/game/machinery/computer/honkputer.dm
@@ -20,8 +20,7 @@
/obj/machinery/computer/HONKputer/Topic(href, href_list)
if(..())
return 1
- // TODO: Tie into space manager
- if(!(src.z in config.station_levels))
+ if(is_away_level(src.z))
to_chat(usr, "Unable to establish a connection: You're too far away from the station!")
return
usr.set_machine(src)
@@ -69,8 +68,7 @@
/obj/machinery/computer/HONKputer/attack_hand(var/mob/user as mob)
if(..())
return
- // TODO: Tie into space manager
- if(src.z > ZLEVEL_DERELICT)
+ if(is_away_level(src.z))
to_chat(user, "Unable to establish a connection: You're too far away from the station!")
return
diff --git a/code/game/machinery/computer/law.dm b/code/game/machinery/computer/law.dm
index a6f1a0e6c26..125a5fc06ad 100644
--- a/code/game/machinery/computer/law.dm
+++ b/code/game/machinery/computer/law.dm
@@ -29,8 +29,7 @@
attackby(obj/item/weapon/O as obj, mob/user as mob, params)
- // TODO: Tie into space manager
- if(user.z > ZLEVEL_DERELICT)
+ if(is_away_level(user.z))
to_chat(user, "Unable to establish a connection: You're too far away from the station!")
return
if(istype(O, /obj/item/weapon/aiModule))
diff --git a/code/game/machinery/computer/pod.dm b/code/game/machinery/computer/pod.dm
index 84b467d2072..ee278bd5f7e 100644
--- a/code/game/machinery/computer/pod.dm
+++ b/code/game/machinery/computer/pod.dm
@@ -208,7 +208,9 @@
id_tags -= ident_tag
if(href_list["dstele"])
var/choices = list(0)
- choices += accessable_z_levels
+ var/list/reachable_levels = levels_by_trait(REACHABLE)
+ for(var/datum/space_level/S in reachable_levels)
+ choices += S.zpos
var/obj/machinery/computer/pod/deathsquad/D = src
var/input = input("Enter the destination Z-Level. The mechs will arrive from the East. Leave 0 if you don't want to set a specific ZLevel", "Mass Driver Controls", 0) in choices
D.teleporter_dest = input
@@ -362,4 +364,4 @@
AM.dir = 8
var/atom/target = get_edge_target_turf(AM, AM.dir)
AM.throw_at(target, 50, 1)
- return
\ No newline at end of file
+ return
diff --git a/code/game/machinery/computer/prisoner.dm b/code/game/machinery/computer/prisoner.dm
index e3683361ef2..fa1ba551728 100644
--- a/code/game/machinery/computer/prisoner.dm
+++ b/code/game/machinery/computer/prisoner.dm
@@ -65,8 +65,7 @@
health_display = "DEAD"
else if(total_loss)
health_display = "HURT ([total_loss])"
- // TODO: Tie into space manager
- if((M.z in config.station_levels) && !istype(M.loc, /turf/space))
+ if(is_station_level(M.z) && !istype(M.loc, /turf/space))
loc_display = "[get_area(M)]"
dat += "ID: [T.id]
Subject: [M]
Location: [loc_display]
Health: [health_display]
"
dat += "(Message Holder) |
"
diff --git a/code/game/machinery/computer/security.dm b/code/game/machinery/computer/security.dm
index c7c23dbc724..c03ce8ee440 100644
--- a/code/game/machinery/computer/security.dm
+++ b/code/game/machinery/computer/security.dm
@@ -41,8 +41,7 @@
/obj/machinery/computer/secure_data/attack_hand(mob/user as mob)
if(..())
return
- // TODO: Tie into space manager
- if(src.z > ZLEVEL_DERELICT)
+ if(is_away_level(src.z))
to_chat(user, "Unable to establish a connection: You're too far away from the station!")
return
var/dat
diff --git a/code/game/machinery/computer/skills.dm b/code/game/machinery/computer/skills.dm
index 7c0680f26d3..81aa33109f0 100644
--- a/code/game/machinery/computer/skills.dm
+++ b/code/game/machinery/computer/skills.dm
@@ -41,8 +41,7 @@
if(..())
return
- // TODO: Tie into space manager
- if(src.z > ZLEVEL_DERELICT)
+ if(is_away_level(src.z))
to_chat(user, "Unable to establish a connection: You're too far away from the station!")
return
var/dat
diff --git a/code/game/machinery/doors/airlock.dm b/code/game/machinery/doors/airlock.dm
index ec49d252616..7248a5e1022 100644
--- a/code/game/machinery/doors/airlock.dm
+++ b/code/game/machinery/doors/airlock.dm
@@ -1069,4 +1069,23 @@ About the new airlock wires panel:
src.unlock()
src.open()
src.lock()
- return
+
+/obj/machinery/door/airlock/hostile_lockdown(mob/origin)
+ // Must be powered and have working AI wire.
+ if(canAIControl(src) && !stat)
+ locked = FALSE //For airlocks that were bolted open.
+ safe = FALSE //DOOR CRUSH
+ close()
+ lock() //Bolt it!
+ electrified_until = -1 //Shock it!
+ if(origin)
+ shockedby += "\[[time_stamp()]\][origin](ckey:[origin.ckey])"
+
+
+/obj/machinery/door/airlock/disable_lockdown()
+ // Must be powered and have working AI wire.
+ if(canAIControl(src) && !stat)
+ unlock()
+ electrified_until = 0
+ open()
+ safe = TRUE
\ No newline at end of file
diff --git a/code/game/machinery/doors/airlock_control.dm b/code/game/machinery/doors/airlock_control.dm
index 9c4d881f378..e33d3e4d9c4 100644
--- a/code/game/machinery/doors/airlock_control.dm
+++ b/code/game/machinery/doors/airlock_control.dm
@@ -10,8 +10,7 @@ obj/machinery/door/airlock
obj/machinery/door/airlock/process()
if(arePowerSystemsOn() && cur_command)
- spawn()
- execute_current_command()
+ execute_current_command()
else
return PROCESS_KILL
diff --git a/code/game/machinery/doors/door.dm b/code/game/machinery/doors/door.dm
index 6c9537667fb..8c5a1fd85fc 100644
--- a/code/game/machinery/doors/door.dm
+++ b/code/game/machinery/doors/door.dm
@@ -301,3 +301,11 @@
/obj/machinery/door/morgue
icon = 'icons/obj/doors/doormorgue.dmi'
+
+/obj/machinery/door/proc/hostile_lockdown(mob/origin)
+ if(!stat) //So that only powered doors are closed.
+ close() //Close ALL the doors!
+
+/obj/machinery/door/proc/disable_lockdown()
+ if(!stat) //Opens only powered doors.
+ open() //Open everything!
\ No newline at end of file
diff --git a/code/game/machinery/firealarm.dm b/code/game/machinery/firealarm.dm
index 9b2e0bdf957..3dffa7dda24 100644
--- a/code/game/machinery/firealarm.dm
+++ b/code/game/machinery/firealarm.dm
@@ -49,10 +49,17 @@ FIRE ALARM
else
icon_state = "fire0"
+/obj/machinery/firealarm/emag_act(mob/user)
+ if(!emagged)
+ emagged = 1
+ if(user)
+ user.visible_message("Sparks fly out of the [src]!",
+ "You emag [src], disabling its thermal sensors.")
+ playsound(loc, 'sound/effects/sparks4.ogg', 50, 1)
+
/obj/machinery/firealarm/temperature_expose(datum/gas_mixture/air, temperature, volume)
- if(detecting)
- if(temperature > T0C+200)
- alarm() // added check of detector status here
+ if(!emagged && detecting && temperature > T0C + 200)
+ alarm() // added check of detector status here
/obj/machinery/firealarm/attack_ai(mob/user as mob)
src.add_hiddenprint(user)
@@ -148,11 +155,6 @@ FIRE ALARM
updateDialog()
last_process = world.timeofday
- if(locate(/obj/effect/hotspot) in loc)
- alarm()
-
- return
-
/obj/machinery/firealarm/power_change()
if(powered(ENVIRON))
stat &= ~NOPOWER
@@ -293,9 +295,7 @@ FIRE ALARM
pixel_x = (dir & 3)? 0 : (dir == 4 ? -24 : 24)
pixel_y = (dir & 3)? (dir ==1 ? -24 : 24) : 0
- // TODO: Tie into space manager
- // also hwat
- if(z == ZLEVEL_STATION || ZLEVEL_ASTEROID == 5)
+ if(is_station_contact(src.z))
if(security_level)
src.overlays += image('icons/obj/monitors.dmi', "overlay_[get_security_level()]")
else
diff --git a/code/game/machinery/hologram.dm b/code/game/machinery/hologram.dm
index abe99777410..53e85ba72c4 100644
--- a/code/game/machinery/hologram.dm
+++ b/code/game/machinery/hologram.dm
@@ -108,21 +108,8 @@ var/const/HOLOPAD_MODE = 0
/*This is the proc for special two-way communication between AI and holopad/people talking near holopad.
For the other part of the code, check silicon say.dm. Particularly robot talk.*/
/obj/machinery/hologram/holopad/hear_talk(mob/living/M, text, verb, datum/language/speaking)
- if(M&&hologram&&master)//Master is mostly a safety in case lag hits or something.
- if(!master.say_understands(M, speaking))//The AI will be able to understand most mobs talking through the holopad.
- if(speaking)
- text = speaking.scramble(text)
- else
- text = stars(text)
- var/name_used = M.GetVoice()
- //This communication is imperfect because the holopad "filters" voices and is only designed to connect to the master only.
- var/rendered
- if(speaking)
- rendered = "Holopad received, [name_used] [speaking.format_message(text, verb)]"
- else
- rendered = "Holopad received, [name_used] [verb], \"[text]\""
- master.show_message(rendered, 2)
- return
+ if(M && hologram && master)//Master is mostly a safety in case lag hits or something.
+ master.relay_speech(M, text, verb, speaking)
/obj/machinery/hologram/holopad/hear_message(mob/living/M, text)
if(M&&hologram&&master)//Master is mostly a safety in case lag hits or something.
diff --git a/code/game/machinery/machinery.dm b/code/game/machinery/machinery.dm
index 16164f19c82..17552c3fe1c 100644
--- a/code/game/machinery/machinery.dm
+++ b/code/game/machinery/machinery.dm
@@ -548,6 +548,9 @@ Class Procs:
/obj/machinery/proc/construction()
return
+/obj/machinery/proc/can_be_overridden()
+ . = 1
+
/obj/machinery/tesla_act(var/power)
..()
if(prob(85))
diff --git a/code/game/machinery/supply_display.dm b/code/game/machinery/supply_display.dm
index caf0c9c67d9..9c945fff989 100644
--- a/code/game/machinery/supply_display.dm
+++ b/code/game/machinery/supply_display.dm
@@ -5,8 +5,7 @@
/obj/machinery/status_display/supply_display/update()
if(!..() && mode == STATUS_DISPLAY_CUSTOM)
if(shuttle_master.supply.mode == SHUTTLE_IDLE)
- // TODO: Tie into space manager
- if(shuttle_master.supply.z == ZLEVEL_STATION)
+ if(is_station_level(shuttle_master.supply.z))
message1 = "CARGO"
message2 = "Docked"
else
diff --git a/code/game/machinery/telecomms/broadcaster.dm b/code/game/machinery/telecomms/broadcaster.dm
index 7ddb0f4b963..34be5ed1c67 100644
--- a/code/game/machinery/telecomms/broadcaster.dm
+++ b/code/game/machinery/telecomms/broadcaster.dm
@@ -423,8 +423,9 @@ var/message_delay = 0 // To make sure restarting the recentmessages list is kept
/* ###### Prepare the radio connection ###### */
+ var/mob/living/carbon/human/H
if(!M)
- var/mob/living/carbon/human/H = new
+ H = new
M = H
var/datum/radio_frequency/connection = radio_controller.return_frequency(frequency)
@@ -439,7 +440,7 @@ var/message_delay = 0 // To make sure restarting the recentmessages list is kept
if(data == 1)
for(var/obj/item/device/radio/intercom/R in connection.devices["[RADIO_CHAT]"])
var/turf/position = get_turf(R)
- // TODO: Tie into space manager
+ // TODO: Make the radio system cooperate with the space manager
if(position && position.z == level)
receive |= R.send_hear(display_freq, level)
@@ -452,7 +453,7 @@ var/message_delay = 0 // To make sure restarting the recentmessages list is kept
if(istype(R, /obj/item/device/radio/headset))
continue
var/turf/position = get_turf(R)
- // TODO: Tie into space manager
+ // TODO: Make the radio system cooperate with the space manager
if(position && position.z == level)
receive |= R.send_hear(display_freq)
@@ -464,7 +465,7 @@ var/message_delay = 0 // To make sure restarting the recentmessages list is kept
var/datum/radio_frequency/antag_connection = radio_controller.return_frequency(freq)
for(var/obj/item/device/radio/R in antag_connection.devices["[RADIO_CHAT]"])
var/turf/position = get_turf(R)
- // TODO: Tie into space manager
+ // TODO: Make the radio system cooperate with the space manager
if(position && position.z == level)
receive |= R.send_hear(freq)
@@ -474,7 +475,7 @@ var/message_delay = 0 // To make sure restarting the recentmessages list is kept
else
for(var/obj/item/device/radio/R in connection.devices["[RADIO_CHAT]"])
var/turf/position = get_turf(R)
- // TODO: Tie into space manager
+ // TODO: Make the radio system cooperate with the space manager
if(position && position.z == level)
receive |= R.send_hear(display_freq)
@@ -596,12 +597,15 @@ var/message_delay = 0 // To make sure restarting the recentmessages list is kept
for(var/mob/R in heard_gibberish)
R.show_message(rendered, 2)
+ if(H)
+ qdel(H)
+
//Use this to test if an obj can communicate with a Telecommunications Network
/atom/proc/test_telecomms()
var/datum/signal/signal = src.telecomms_process()
var/turf/position = get_turf(src)
- // TODO: Tie into space manager
+ // TODO: Make the radio system cooperate with the space manager
return (position.z in signal.data["level"]) && signal.data["done"]
/atom/proc/telecomms_process(var/do_sleep = 1)
@@ -620,7 +624,7 @@ var/message_delay = 0 // To make sure restarting the recentmessages list is kept
"type" = 4, // determines what type of radio input it is: test broadcast
"reject" = 0,
"done" = 0,
- // TODO: Tie into space manager
+ // TODO: Make the radio system cooperate with the space manager
"level" = pos.z // The level it is being broadcasted at.
)
signal.frequency = PUB_FREQ// Common channel
diff --git a/code/game/machinery/telecomms/machine_interactions.dm b/code/game/machinery/telecomms/machine_interactions.dm
index 0c0dfd178fe..347f4ebc685 100644
--- a/code/game/machinery/telecomms/machine_interactions.dm
+++ b/code/game/machinery/telecomms/machine_interactions.dm
@@ -180,12 +180,12 @@
var/turf/position = get_turf(src)
// Toggle on/off getting signals from the station or the current Z level
- // TODO: Tie into space manager
- if(src.listening_level == ZLEVEL_STATION) // equals the station
+ // TODO: Could work with the space manager better
+ if(is_station_level(src.listening_level)) // equals the station
src.listening_level = position.z
return 1
- else if(position.z == ZLEVEL_TELECOMMS)
- src.listening_level = ZLEVEL_STATION
+ else if(level_boosts_signal(position.z))
+ src.listening_level = level_name_to_num(MAIN_STATION)
return 1
return 0
@@ -234,8 +234,8 @@
/obj/machinery/telecomms/relay/Options_Menu()
var/dat = ""
- if(src.z == ZLEVEL_TELECOMMS)
- dat += "
Signal Locked to Station: [listening_level == ZLEVEL_STATION ? "TRUE" : "FALSE"]"
+ if(level_boosts_signal(src.z))
+ dat += "
Signal Locked to Station: [is_station_level(listening_level) ? "TRUE" : "FALSE"]"
dat += "
Broadcasting: [broadcasting ? "YES" : "NO"]"
dat += "
Receiving: [receiving ? "YES" : "NO"]"
return dat
diff --git a/code/game/machinery/telecomms/telecomunications.dm b/code/game/machinery/telecomms/telecomunications.dm
index 22c7863a3bb..a4e481f430b 100644
--- a/code/game/machinery/telecomms/telecomunications.dm
+++ b/code/game/machinery/telecomms/telecomunications.dm
@@ -56,7 +56,7 @@ var/global/list/obj/machinery/telecomms/telecomms_list = list()
continue
if(amount && send_count >= amount)
break
- // TODO: Tie into space manager
+ // TODO: Make the radio system cooperate with the space manager
if(machine.loc.z != listening_level)
if(long_range_link == 0 && machine.long_range_link == 0)
continue
@@ -115,7 +115,7 @@ var/global/list/obj/machinery/telecomms/telecomms_list = list()
if(!listening_level)
//Defaults to our Z level!
var/turf/position = get_turf(src)
- // TODO: Tie into space manager
+ // TODO: Make the radio system cooperate with the space manager
listening_level = position.z
/obj/machinery/telecomms/initialize()
@@ -141,7 +141,7 @@ var/global/list/obj/machinery/telecomms/telecomms_list = list()
/obj/machinery/telecomms/proc/add_link(var/obj/machinery/telecomms/T)
var/turf/position = get_turf(src)
var/turf/T_position = get_turf(T)
- // TODO: Tie into space manager
+ // TODO: Make the radio system cooperate with the space manager
if((position.z == T_position.z) || (src.long_range_link && T.long_range_link))
for(var/x in autolinkers)
if(T.autolinkers.Find(x))
diff --git a/code/game/machinery/teleporter.dm b/code/game/machinery/teleporter.dm
index 6ecc675fdef..369cb0fc708 100644
--- a/code/game/machinery/teleporter.dm
+++ b/code/game/machinery/teleporter.dm
@@ -182,8 +182,7 @@
var/turf/T = get_turf(R)
if(!T)
continue
- // TODO: Tie into space manager
- if((T.z in config.admin_levels) || T.z > ZLEVEL_EMPTY)
+ if(!is_teleport_allowed(T.z))
continue
if(R.syndicate == 1 && emagged == 0)
continue
@@ -199,13 +198,12 @@
continue
else
var/mob/M = I.loc
- if(M.stat == 2)
+ if(M.stat == DEAD)
if(M.timeofdeath + 6000 < world.time)
continue
var/turf/T = get_turf(M)
if(!T) continue
- // TODO: Tie into space manager
- if((T.z in config.admin_levels)) continue
+ if(!is_teleport_allowed(T.z)) continue
var/tmpname = M.real_name
if(areaindex[tmpname])
tmpname = "[tmpname] ([++areaindex[tmpname]])"
@@ -227,8 +225,7 @@
var/turf/T = get_turf(R)
if(!T || !R.teleporter_hub || !R.teleporter_console)
continue
- // TODO: Tie into space manager
- if((T.z in config.admin_levels) || T.z > ZLEVEL_EMPTY)
+ if(!is_teleport_allowed(T.z))
continue
var/tmpname = T.loc.name
if(areaindex[tmpname])
@@ -323,7 +320,7 @@
return power_station
/obj/machinery/teleport/hub/Bumped(M as mob|obj)
- if(z == ZLEVEL_CENTCOMM && !admin_usage)
+ if(!is_teleport_allowed(z) && !admin_usage)
to_chat(M, "You can't use this here.")
return
if(power_station && power_station.engaged && !panel_open)
@@ -401,7 +398,7 @@
/obj/machinery/teleport/perma/Bumped(M as mob|obj)
if(stat & (BROKEN|NOPOWER))
return
- if(z == ZLEVEL_CENTCOMM)
+ if(!is_teleport_allowed(z))
to_chat(M, "You can't use this here.")
return
if(target && !recalibrating && !panel_open)
diff --git a/code/game/mecha/equipment/tools/tools.dm b/code/game/mecha/equipment/tools/tools.dm
index cb55c783005..d945e1cbb7f 100644
--- a/code/game/mecha/equipment/tools/tools.dm
+++ b/code/game/mecha/equipment/tools/tools.dm
@@ -382,8 +382,7 @@
range = RANGED
action(atom/target)
- // TODO: Tie into space manager
- if(!action_checks(target) || (src.loc.z in config.admin_levels)) return
+ if(!action_checks(target) || !is_teleport_allowed(src.loc.z)) return
var/turf/T = get_turf(target)
if(T)
set_ready_state(0)
@@ -404,8 +403,7 @@
action(atom/target)
- // TODO: Tie into space manager
- if(!action_checks(target) || (src.loc.z in config.admin_levels)) return
+ if(!action_checks(target) || !is_teleport_allowed(src.loc.z)) return
var/list/theareas = list()
for(var/area/AR in orange(100, chassis))
if(AR in theareas) continue
diff --git a/code/game/objects/effects/landmarks.dm b/code/game/objects/effects/landmarks.dm
index 7f109425205..3a567518e42 100644
--- a/code/game/objects/effects/landmarks.dm
+++ b/code/game/objects/effects/landmarks.dm
@@ -13,7 +13,7 @@
switch(name) //some of these are probably obsolete
if("shuttle")
- shuttle_z = z
+ log_debug("Obsolete landmark '[name]' at ([x],[y],[z])")
qdel(src)
if("airtunnel_stop")
diff --git a/code/game/objects/effects/portals.dm b/code/game/objects/effects/portals.dm
index 0d6de688dcd..df058f1bd1a 100644
--- a/code/game/objects/effects/portals.dm
+++ b/code/game/objects/effects/portals.dm
@@ -8,21 +8,21 @@
var/failchance = 5
var/obj/item/target = null
var/creator = null
- anchored = 1.0
+ anchored = 1
var/precision = 1 // how close to the portal you will teleport. 0 = on the portal, 1 = adjacent
var/can_multitool_to_remove = 0
/obj/effect/portal/Bumped(mob/M as mob|obj)
- src.teleport(M)
+ teleport(M)
-/obj/effect/portal/New(loc, turf/target, creator)
+/obj/effect/portal/New(loc, turf/target, creator=null, lifespan=300)
portals += src
src.loc = loc
src.target = target
src.creator = creator
- spawn(300)
- qdel(src)
- return
+ if(lifespan > 0)
+ spawn(lifespan)
+ qdel(src)
/obj/effect/portal/Destroy()
portals -= src
@@ -33,6 +33,7 @@
var/obj/item/weapon/gun/energy/wormhole_projector/P = creator
P.portal_destroyed(src)
creator = null
+ target = null
return ..()
/obj/effect/portal/proc/teleport(atom/movable/M as mob|obj)
diff --git a/code/game/objects/items/devices/camera_bug.dm b/code/game/objects/items/devices/camera_bug.dm
index dec4f4c75fb..e50f26bcf4f 100644
--- a/code/game/objects/items/devices/camera_bug.dm
+++ b/code/game/objects/items/devices/camera_bug.dm
@@ -61,7 +61,6 @@
return null
var/turf/T = get_turf(user.loc)
- // TODO: Tie into space manager
if(T.z != current.z || !current.can_use())
to_chat(user, "[src] has lost the signal.")
current = null
@@ -226,7 +225,6 @@
to_chat(usr, "Something's wrong with that camera. You can't get a feed.")
return
var/turf/T = get_turf(loc)
- // TODO: Tie into space manager
if(!T || C.z != T.z)
to_chat(usr, "You can't get a signal.")
return
diff --git a/code/game/objects/items/devices/radio/intercom.dm b/code/game/objects/items/devices/radio/intercom.dm
index a8623b17f56..502a5da02b3 100644
--- a/code/game/objects/items/devices/radio/intercom.dm
+++ b/code/game/objects/items/devices/radio/intercom.dm
@@ -124,7 +124,7 @@
return -1
if(!(0 in level))
var/turf/position = get_turf(src)
- // TODO: Tie into space manager
+ // TODO: Integrate radio with the space manager
if(isnull(position) || !(position.z in level))
return -1
if(!src.listening)
diff --git a/code/game/objects/items/weapons/RCD.dm b/code/game/objects/items/weapons/RCD.dm
index 44ef04ab401..a0dcdaec042 100644
--- a/code/game/objects/items/weapons/RCD.dm
+++ b/code/game/objects/items/weapons/RCD.dm
@@ -91,13 +91,13 @@ RCD
data["max_matter"] = max_matter
data["one_access"] = one_access
data["locked"] = locked
-
+
if(menu == 2)
var/list/door_types_list = list()
for(var/type in allowed_door_types)
door_types_list[++door_types_list.len] = list("name" = allowed_door_types[type], "type" = type)
data["allowed_door_types"] = door_types_list
-
+
data["door_accesses"] = door_accesses_list
ui = nanomanager.try_update_ui(user, src, ui_key, ui, data, force_open)
@@ -110,14 +110,14 @@ RCD
/obj/item/weapon/rcd/Topic(href, href_list, nowindow, state)
if(..())
return 1
-
+
if(prob(20))
spark_system.start()
-
+
if(href_list["mode"])
mode = text2num(href_list["mode"])
. = 1
-
+
if(href_list["door_type"])
var/new_door_type = text2path(href_list["door_type"])
if(!(new_door_type in allowed_door_types))
@@ -125,11 +125,11 @@ RCD
return
door_type = new_door_type
. = 1
-
+
if(href_list["menu"])
menu = text2num(href_list["menu"])
. = 1
-
+
if(href_list["login"])
if(istype(usr,/mob/living/silicon))
locked = 0
@@ -142,15 +142,15 @@ RCD
if(istype(ID) && ID && check_access(ID))
locked = 0
. = 1
-
+
if(href_list["logout"])
locked = 1
. = 1
-
+
if(href_list["toggle_one_access"] && !locked)
one_access = !one_access
. = 1
-
+
if(href_list["toggle_access"] && !locked)
var/href_access = text2num(href_list["toggle_access"])
if(href_access in door_accesses)
@@ -251,10 +251,10 @@ RCD
qdel(A)
return 1
return 0
-
+
if(istype(A, /obj/structure/window)) // You mean the grille of course, do you?
A = locate(/obj/structure/grille) in A.loc
-
+
if(istype(A, /obj/structure/grille))
if(!checkResource(2, user))
return 0
@@ -326,7 +326,7 @@ RCD
else
to_chat(user, "ERROR: RCD in MODE: [mode] attempted use by [user]. Send this text #coderbus or an admin.")
return 0
-
+
nanomanager.update_uis(src)
/obj/item/weapon/rcd/proc/useResource(var/amount, var/mob/user)
@@ -354,6 +354,18 @@ RCD
desc = "A device used to rapidly build and deconstruct walls and floors."
canRwall = 1
+
+/obj/item/weapon/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(src, "detonate_pulse_explode", 50)
+
+/obj/item/weapon/rcd/proc/detonate_pulse_explode()
+ explosion(src, 0, 0, 3, 1, flame_range = 1)
+ qdel(src)
+
/obj/item/weapon/rcd/combat
name = "combat RCD"
max_matter = 500
diff --git a/code/game/objects/items/weapons/bee_briefcase.dm b/code/game/objects/items/weapons/bee_briefcase.dm
index 98f3fc1709b..8a15bc7f517 100644
--- a/code/game/objects/items/weapons/bee_briefcase.dm
+++ b/code/game/objects/items/weapons/bee_briefcase.dm
@@ -64,8 +64,7 @@
//Play sound through the station intercomms, so everyone knows the doom you have wrought.
for(var/O in global_intercoms)
var/obj/item/device/radio/intercom/I = O
- // TODO: Tie into space manager
- if(I.z != ZLEVEL_STATION) //Only broadcast to the station intercoms
+ if(!is_station_level(I.z)) //Only broadcast to the station intercoms
continue
if(!I.on) //Only broadcast to active intercoms (powered, switched on)
continue
diff --git a/code/game/objects/items/weapons/teleportation.dm b/code/game/objects/items/weapons/teleportation.dm
index decfa424872..15650f188d9 100644
--- a/code/game/objects/items/weapons/teleportation.dm
+++ b/code/game/objects/items/weapons/teleportation.dm
@@ -48,8 +48,7 @@ Frequency:
return 1
var/turf/current_location = get_turf(usr)//What turf is the user on?
- // TODO: Tie into space manager
- if(!current_location ||( current_location.z in config.admin_levels))//If turf was not found or they're on z level 2.
+ if(!current_location || is_admin_level(current_location.z))//If turf was not found or they're in the admin zone
to_chat(usr, "\The [src] is malfunctioning.")
return 1
@@ -62,7 +61,6 @@ Frequency:
for(var/obj/item/device/radio/beacon/W in beacons)
if(W.frequency == frequency && !W.syndicate)
- // TODO: Tie into space manager
if(W && W.z == z)
var/turf/TB = get_turf(W)
temp += "[W.code]: [TB.x], [TB.y], [TB.z]
"
@@ -109,8 +107,7 @@ Frequency:
/obj/item/weapon/hand_tele/attack_self(mob/user as mob)
var/turf/current_location = get_turf(user)//What turf is the user on?
- // TODO: Tie into space manager
- if(!current_location||(current_location.z in config.admin_levels)||current_location.z>=ZLEVEL_EMPTY)//If turf was not found or they're on z level 2 or >7 which does not currently exist.
+ if(!current_location||!is_teleport_allowed(current_location.z))//If turf was not found or they're somewhere teleproof
to_chat(user, "\The [src] is malfunctioning.")
return
var/list/L = list( )
diff --git a/code/game/objects/items/weapons/twohanded.dm b/code/game/objects/items/weapons/twohanded.dm
index 908e140dca8..da21397529d 100644
--- a/code/game/objects/items/weapons/twohanded.dm
+++ b/code/game/objects/items/weapons/twohanded.dm
@@ -365,6 +365,7 @@
if(!L.stat && prob(50))
var/mob/living/simple_animal/hostile/illusion/M = new(user.loc)
M.faction = user.faction.Copy()
+ M.attack_sound = hitsound
M.Copy_Parent(user, 100, user.health/2.5, 12, 30)
M.GiveTarget(L)
diff --git a/code/game/objects/structures/crates_lockers/closets.dm b/code/game/objects/structures/crates_lockers/closets.dm
index 4fe639160d4..1831b983f2c 100644
--- a/code/game/objects/structures/crates_lockers/closets.dm
+++ b/code/game/objects/structures/crates_lockers/closets.dm
@@ -192,8 +192,7 @@
return
var/obj/item/weapon/rcs/E = W
if(E.rcell && (E.rcell.charge >= E.chargecost))
- // TODO: Tie into space manager
- if(!(src.z in config.contact_levels))
+ if(!is_level_reachable(src.z))
to_chat(user, "The rapid-crate-sender can't locate any telepads!")
return
if(E.mode == 0)
diff --git a/code/game/objects/structures/crates_lockers/crates.dm b/code/game/objects/structures/crates_lockers/crates.dm
index f9b32b071f7..bf74c11ee84 100644
--- a/code/game/objects/structures/crates_lockers/crates.dm
+++ b/code/game/objects/structures/crates_lockers/crates.dm
@@ -84,8 +84,7 @@
if(istype(W, /obj/item/weapon/rcs) && !src.opened)
var/obj/item/weapon/rcs/E = W
if(E.rcell && (E.rcell.charge >= E.chargecost))
- // TODO: Tie into space manager
- if(!(src.z in config.player_levels))
+ if(!is_level_reachable(src.z)) // This is inconsistent with the closet sending code
to_chat(user, "The rapid-crate-sender can't locate any telepads!")
return
if(E.mode == 0)
diff --git a/code/game/response_team.dm b/code/game/response_team.dm
index 47a903196ee..25530ca3017 100644
--- a/code/game/response_team.dm
+++ b/code/game/response_team.dm
@@ -426,7 +426,7 @@ var/ert_request_answered = 0
switch(officer_type)
if("Engineer")
M.equip_to_slot_or_del(new /obj/item/clothing/shoes/magboots(M), slot_shoes)
- M.equip_to_slot_or_del(new /obj/item/clothing/gloves/combat(M), slot_gloves)
+ M.equip_to_slot_or_del(new /obj/item/clothing/gloves/color/yellow(M), slot_gloves)
M.equip_to_slot_or_del(new /obj/item/clothing/suit/space/rig/ert/engineer(M), slot_wear_suit)
M.equip_to_slot_or_del(new /obj/item/weapon/tank/emergency_oxygen/engi(M), slot_s_store)
M.equip_to_slot_or_del(new /obj/item/clothing/glasses/meson(M), slot_glasses)
@@ -446,7 +446,7 @@ var/ert_request_answered = 0
if("Security")
M.equip_to_slot_or_del(new /obj/item/clothing/shoes/combat(M), slot_shoes)
- M.equip_to_slot_or_del(new /obj/item/clothing/gloves/combat(M), slot_gloves)
+ M.equip_to_slot_or_del(new /obj/item/clothing/gloves/color/black(M), slot_gloves)
M.equip_to_slot_or_del(new /obj/item/clothing/suit/space/rig/ert/security(M), slot_wear_suit)
M.equip_to_slot_or_del(new /obj/item/weapon/gun/energy/gun/advtaser(M), slot_s_store)
M.equip_to_slot_or_del(new /obj/item/clothing/glasses/hud/security/sunglasses(M), slot_glasses)
@@ -464,7 +464,7 @@ var/ert_request_answered = 0
if("Medic")
M.equip_to_slot_or_del(new /obj/item/clothing/shoes/white(M), slot_shoes)
- M.equip_to_slot_or_del(new /obj/item/clothing/gloves/combat(M), slot_gloves)
+ M.equip_to_slot_or_del(new /obj/item/clothing/gloves/color/latex/nitrile(M), slot_gloves)
M.equip_to_slot_or_del(new /obj/item/clothing/suit/space/rig/ert/medical(M), slot_wear_suit)
M.equip_to_slot_or_del(new /obj/item/clothing/glasses/hud/health/health_advanced(M), slot_glasses)
@@ -511,7 +511,7 @@ var/ert_request_answered = 0
switch(officer_type)
if("Engineer")
M.equip_to_slot_or_del(new /obj/item/clothing/shoes/magboots/advance(M), slot_shoes)
- M.equip_to_slot_or_del(new /obj/item/clothing/gloves/combat(M), slot_gloves)
+ M.equip_to_slot_or_del(new /obj/item/clothing/gloves/color/yellow(M), slot_gloves)
M.equip_to_slot_or_del(new /obj/item/clothing/suit/space/rig/ert/engineer(M), slot_wear_suit)
M.equip_to_slot_or_del(new /obj/item/weapon/tank/emergency_oxygen/double/full(M), slot_s_store)
M.equip_to_slot_or_del(new /obj/item/clothing/glasses/meson/night(M), slot_glasses)
diff --git a/code/game/turfs/simulated/walls.dm b/code/game/turfs/simulated/walls.dm
index f38f21dbac4..547efaed2a6 100644
--- a/code/game/turfs/simulated/walls.dm
+++ b/code/game/turfs/simulated/walls.dm
@@ -32,7 +32,8 @@
/obj/structure/falsewall,
/obj/structure/falsewall/reinforced,
/turf/simulated/wall/rust,
- /turf/simulated/wall/r_wall/rust)
+ /turf/simulated/wall/r_wall/rust,
+ /turf/simulated/wall/r_wall/coated)
smooth = SMOOTH_TRUE
/turf/simulated/wall/ChangeTurf(var/newtype)
@@ -111,6 +112,10 @@
return
+/turf/simulated/wall/proc/adjacent_fire_act(turf/simulated/wall, radiated_temperature)
+ if(radiated_temperature > max_temperature)
+ take_damage(rand(10, 20) * (radiated_temperature / max_temperature))
+
/turf/simulated/wall/proc/dismantle_wall(devastated=0, explode=0)
if(istype(src,/turf/simulated/wall/r_wall))
if(!devastated)
diff --git a/code/game/turfs/simulated/walls_misc.dm b/code/game/turfs/simulated/walls_misc.dm
index 3d65d97c95b..6d59513e761 100644
--- a/code/game/turfs/simulated/walls_misc.dm
+++ b/code/game/turfs/simulated/walls_misc.dm
@@ -21,4 +21,9 @@
desc = "A huge chunk of rusted reinforced metal."
icon = 'icons/turf/walls/rusty_reinforced_wall.dmi'
icon_state = "rrust"
- walltype = "rrust"
\ No newline at end of file
+ walltype = "rrust"
+
+/turf/simulated/wall/r_wall/coated //Coated for heat resistance
+ name = "coated reinforced wall"
+ desc = "A huge chunk of reinforced metal used to seperate rooms. It seems to have additional plating to protect against heat."
+ max_temperature = INFINITY
\ No newline at end of file
diff --git a/code/game/turfs/simulated/walls_reinforced.dm b/code/game/turfs/simulated/walls_reinforced.dm
index 27154fd00fb..7c6c750c70e 100644
--- a/code/game/turfs/simulated/walls_reinforced.dm
+++ b/code/game/turfs/simulated/walls_reinforced.dm
@@ -12,6 +12,7 @@
walltype = "rwall"
var/d_state = 0
+ var/can_be_reinforced = 1
/turf/simulated/wall/r_wall/attackby(obj/item/W as obj, mob/user as mob, params)
user.changeNext_move(CLICK_CD_MELEE)
@@ -229,6 +230,24 @@
smooth_icon_neighbors(src)
to_chat(user, "You repair the last of the damage.")
+ //UPGRADING TO COATED
+ else if(istype(W, /obj/item/stack/sheet/plasteel) && !d_state)
+ var/obj/item/stack/sheet/plasteel/MS = W
+ if(!can_be_reinforced)
+ to_chat(user, "The wall is already coated!")
+ return
+ to_chat(user, "You begin adding an additional layer of coating to the wall with \a [MS].")
+
+ if(do_after(user, 40, target = src) && !d_state)
+ if(!MS.use(2))
+ to_chat(user, "You don't have enough plasteel for that!")
+ return
+ to_chat(user, "You add an additional layer of coating to the wall!")
+ ChangeTurf(/turf/simulated/wall/r_wall/coated)
+ update_icon()
+ smooth_icon_neighbors(src)
+ can_be_reinforced = 0
+ return
//APC
else if(istype(W,/obj/item/mounted))
@@ -293,4 +312,5 @@
clear_smooth_overlays()
else
smooth = SMOOTH_TRUE
- icon_state = ""
\ No newline at end of file
+ icon_state = ""
+
diff --git a/code/game/turfs/space/transit.dm b/code/game/turfs/space/transit.dm
index 1b7c9343ca2..9feda5d78a7 100644
--- a/code/game/turfs/space/transit.dm
+++ b/code/game/turfs/space/transit.dm
@@ -93,7 +93,8 @@
var/max = world.maxx-TRANSITIONEDGE
var/min = 1+TRANSITIONEDGE
- var/_z = rand(ZLEVEL_CENTCOMM+1,MAX_Z) //select a random space zlevel
+ var/datum/space_level/dest = pick(levels_by_trait(REACHABLE))
+ var/_z = dest.zpos //select a random space zlevel
//now select coordinates for a border turf
var/_x
diff --git a/code/modules/admin/topic.dm b/code/modules/admin/topic.dm
index b5a2de7a4a8..0cb74483a13 100644
--- a/code/modules/admin/topic.dm
+++ b/code/modules/admin/topic.dm
@@ -1980,8 +1980,7 @@
return
else
for(var/obj/machinery/photocopier/faxmachine/F in allfaxes)
- // TODO: Tie into space manager
- if((F.z in config.station_levels))
+ if(is_station_level(F.z))
spawn(0)
if(!F.receivefax(P))
to_chat(src.owner, "\red Message transmission to [F.department] failed.")
@@ -2328,8 +2327,7 @@
for(var/mob/living/carbon/human/H in mob_list)
var/turf/loc = find_loc(H)
var/security = 0
- // TODO: Tie into space manager
- if(!(loc.z in config.station_levels) || prisonwarped.Find(H))
+ if(!is_station_level(loc.z) || prisonwarped.Find(H))
//don't warp them if they aren't ready or are already there
continue
@@ -2566,8 +2564,7 @@
feedback_inc("admin_secrets_fun_used",1)
feedback_add_details("admin_secrets_fun_used","EgL")
for(var/obj/machinery/door/airlock/W in airlocks)
- // TODO: Tie into space manager
- if((W.z in config.station_levels) && !istype(get_area(W), /area/bridge) && !istype(get_area(W), /area/crew_quarters) && !istype(get_area(W), /area/security/prison))
+ if(is_station_level(W.z) && !istype(get_area(W), /area/bridge) && !istype(get_area(W), /area/crew_quarters) && !istype(get_area(W), /area/security/prison))
W.req_access = list()
message_admins("[key_name_admin(usr)] activated Egalitarian Station mode")
command_announcement.Announce("Centcomm airlock control override activated. Please take this time to get acquainted with your coworkers.", new_sound = 'sound/AI/commandreport.ogg')
diff --git a/code/modules/admin/verbs/debug.dm b/code/modules/admin/verbs/debug.dm
index 2c930080edc..db5296619c6 100644
--- a/code/modules/admin/verbs/debug.dm
+++ b/code/modules/admin/verbs/debug.dm
@@ -373,8 +373,7 @@ But you can call procs that are of type /mob/living/carbon/human/proc/ for that
for(var/I in singularities)
var/obj/singularity/S = I
- // TODO: Tie into space manager
- if(S.z == ZLEVEL_CENTCOMM || S.z >= MAX_Z)
+ if(!is_level_reachable(S.z))
continue
qdel(S)
log_admin("[key_name(src)] has deleted all Singularities and Tesla orbs.")
diff --git a/code/modules/admin/verbs/playsound.dm b/code/modules/admin/verbs/playsound.dm
index 660a1c8f199..957070eae8e 100644
--- a/code/modules/admin/verbs/playsound.dm
+++ b/code/modules/admin/verbs/playsound.dm
@@ -81,8 +81,7 @@ var/list/sounds_cache = list()
for(var/O in global_intercoms)
var/obj/item/device/radio/intercom/I = O
- // TODO: Tie into space manager
- if(I.z != ZLEVEL_STATION && !ignore_z)
+ if(!is_station_level(I.z) && !ignore_z)
continue
if(!I.on && !ignore_power)
continue
diff --git a/code/modules/awaymissions/zlevel.dm b/code/modules/awaymissions/zlevel.dm
index da6515a591d..b12ee063f2d 100644
--- a/code/modules/awaymissions/zlevel.dm
+++ b/code/modules/awaymissions/zlevel.dm
@@ -59,7 +59,7 @@ var/global/list/potentialRandomZlevels = generateMapList(filename = "config/away
var/map = pick(potentialRandomZlevels)
var/file = file(map)
if(isfile(file))
- var/zlev = space_manager.add_new_zlevel(AWAY_MISSION, linkage = UNAFFECTED)
+ var/zlev = space_manager.add_new_zlevel(AWAY_MISSION, linkage = UNAFFECTED, traits = list(AWAY_LEVEL,BLOCK_TELEPORT))
space_manager.add_dirt(zlev)
maploader.load_map(file, z_offset = zlev)
late_setup_level(block(locate(1, 1, zlev), locate(world.maxx, world.maxy, zlev)))
diff --git a/code/modules/clothing/gloves/miscellaneous.dm b/code/modules/clothing/gloves/miscellaneous.dm
index db9de4df740..2b932df2dc1 100644
--- a/code/modules/clothing/gloves/miscellaneous.dm
+++ b/code/modules/clothing/gloves/miscellaneous.dm
@@ -20,7 +20,7 @@
/obj/item/clothing/gloves/combat
desc = "These tactical gloves are somewhat fire and impact resistant."
name = "combat gloves"
- icon_state = "black"
+ icon_state = "combat"
item_state = "swat_gl"
siemens_coefficient = 0
permeability_coefficient = 0.05
diff --git a/code/modules/clothing/spacesuits/rig/modules/ninja.dm b/code/modules/clothing/spacesuits/rig/modules/ninja.dm
index c50e9b1c6d3..6f9b1589e5a 100644
--- a/code/modules/clothing/spacesuits/rig/modules/ninja.dm
+++ b/code/modules/clothing/spacesuits/rig/modules/ninja.dm
@@ -115,8 +115,7 @@
to_chat(H, "You cannot teleport into solid walls.")
return 0*///Who the fuck cares? Ninjas in walls are cool.
- // TODO: Tie into space manager
- if(T.z in config.admin_levels)
+ if(!is_teleport_allowed(T.z))
to_chat(H, "You cannot use your teleporter on this Z-level.")
return 0
diff --git a/code/modules/clothing/under/accessories/accessory.dm b/code/modules/clothing/under/accessories/accessory.dm
index 8e8e046ef1b..9482ee7d080 100644
--- a/code/modules/clothing/under/accessories/accessory.dm
+++ b/code/modules/clothing/under/accessories/accessory.dm
@@ -30,6 +30,9 @@
var/mob/M = has_suit.loc
A.Grant(M)
+ for(var/armor_type in armor)
+ has_suit.armor[armor_type] += armor[armor_type]
+
if(user)
to_chat(user, "You attach [src] to [has_suit].")
src.add_fingerprint(user)
@@ -46,6 +49,9 @@
var/mob/M = has_suit.loc
A.Remove(M)
+ for(var/armor_type in armor)
+ has_suit.armor[armor_type] -= armor[armor_type]
+
has_suit = null
usr.put_in_hands(src)
src.add_fingerprint(user)
diff --git a/code/modules/computer3/computers/camera.dm b/code/modules/computer3/computers/camera.dm
index 070015f4dc4..52001231647 100644
--- a/code/modules/computer3/computers/camera.dm
+++ b/code/modules/computer3/computers/camera.dm
@@ -181,8 +181,7 @@
//proc/camera_list(var/datum/file/camnet_key/key)
get_machines(var/datum/file/camnet_key/key)
- // TODO: Tie into space manager
- if(!computer || computer.z > ZLEVEL_DERELICT)
+ if(!computer || !is_away_level(computer.z))
return null
var/list/L = list()
diff --git a/code/modules/computer3/computers/communications.dm b/code/modules/computer3/computers/communications.dm
index d6575d3c143..5230a2c4953 100644
--- a/code/modules/computer3/computers/communications.dm
+++ b/code/modules/computer3/computers/communications.dm
@@ -59,8 +59,7 @@
Topic(var/href, var/list/href_list)
if(!interactable() || !computer.radio || ..(href,href_list) )
return
- // TODO: Tie into space manager
- if(!(computer.z in config.station_levels))
+ if(!is_station_level(computer.z))
to_chat(usr, "Unable to establish a connection: You're too far away from the station!")
return
diff --git a/code/modules/computer3/computers/law.dm b/code/modules/computer3/computers/law.dm
index 7534aa65932..533a600a4eb 100644
--- a/code/modules/computer3/computers/law.dm
+++ b/code/modules/computer3/computers/law.dm
@@ -24,8 +24,7 @@
attackby(obj/item/weapon/aiModule/module as obj, mob/user as mob, params)
- // TODO: Tie into space manager
- if(user.z > ZLEVEL_DERELICT)
+ if(is_away_level(user.z))
to_chat(user, "Unable to establish a connection: You're too far away from the station!")
return
if(istype(module, /obj/item/weapon/aiModule))
diff --git a/code/modules/computer3/computers/medical.dm b/code/modules/computer3/computers/medical.dm
index 6e96b6728e7..462f031a3f7 100644
--- a/code/modules/computer3/computers/medical.dm
+++ b/code/modules/computer3/computers/medical.dm
@@ -49,8 +49,7 @@
scan = computer.cardslot.reader
if(!interactable())
return
- // TODO: Tie into space manager
- if(computer.z > ZLEVEL_DERELICT)
+ if(is_away_level(computer.z))
to_chat(usr, "Unable to establish a connection: You're too far away from the station!")
return
var/dat
diff --git a/code/modules/computer3/computers/prisoner.dm b/code/modules/computer3/computers/prisoner.dm
index 75b2302991f..9ec6152a9e0 100644
--- a/code/modules/computer3/computers/prisoner.dm
+++ b/code/modules/computer3/computers/prisoner.dm
@@ -43,8 +43,7 @@
if(!T.implanted) continue
var/loc_display = "Unknown"
var/mob/living/carbon/M = T.imp_in
- // TODO: Tie into space manager
- if(M.z == ZLEVEL_STATION && !istype(M.loc, /turf/space))
+ if(is_station_level(M.z) && !istype(M.loc, /turf/space))
var/turf/mob_loc = get_turf(M)
loc_display = mob_loc.loc
dat += "ID: [T.id] | Location: [loc_display]
"
diff --git a/code/modules/computer3/computers/robot.dm b/code/modules/computer3/computers/robot.dm
index a728c8993bf..1f6bd0fa054 100644
--- a/code/modules/computer3/computers/robot.dm
+++ b/code/modules/computer3/computers/robot.dm
@@ -31,8 +31,7 @@
interact()
- // TODO: Tie into space manager
- if(!interactable() || computer.z > ZLEVEL_DERELICT)
+ if(!interactable() || is_away_level(computer.z))
return
var/dat
if(src.temp)
diff --git a/code/modules/computer3/computers/security.dm b/code/modules/computer3/computers/security.dm
index d974101b33f..9ae324d70ac 100644
--- a/code/modules/computer3/computers/security.dm
+++ b/code/modules/computer3/computers/security.dm
@@ -57,8 +57,7 @@
if(!interactable())
return
- // TODO: Tie into space manager
- if(computer.z > ZLEVEL_DERELICT)
+ if(is_away_level(computer.z))
to_chat(usr, "Unable to establish a connection: You're too far away from the station!")
return
var/dat
diff --git a/code/modules/computer3/networking.dm b/code/modules/computer3/networking.dm
index 0fc1c966d1c..f55a63b0718 100644
--- a/code/modules/computer3/networking.dm
+++ b/code/modules/computer3/networking.dm
@@ -105,7 +105,7 @@
for(var/obj/O in radio_connection.devices)
if(istype(O,typekey))
T = get_turf(O)
- // TODO: Tie into space manager
+ // TODO: Make the radio system cooperate with the space manager
if(istype(O) && (subspace || (O.z == z_level))) // radio does not work across z-levels
result |= O
return result
diff --git a/code/modules/customitems/item_defines.dm b/code/modules/customitems/item_defines.dm
index c7b9b3abdb6..24b97ef3fc2 100644
--- a/code/modules/customitems/item_defines.dm
+++ b/code/modules/customitems/item_defines.dm
@@ -306,6 +306,26 @@
icon_state = "beret_hos"
item_state = "beret_hos"
+/obj/item/clothing/head/pirate/fluff/stumpy //MrFroztee: Stumpy
+ name = "The Sobriety Skullcap"
+ desc = "A hat suited for the king of the pirates"
+ icon_state = "pirate"
+ item_state = "pirate"
+
+/obj/item/clothing/head/pirate/fluff/stumpy/New()
+ ..()
+ processing_objects.Add(src)
+
+/obj/item/clothing/head/pirate/fluff/stumpy/Destroy()
+ processing_objects.Remove(src)
+ return ..()
+
+/obj/item/clothing/head/pirate/fluff/stumpy/process()
+ if(ishuman(loc))
+ var/mob/living/carbon/human/H = loc
+ if(H.head == src)
+ H.slurring = max(3, H.slurring) //always slur
+
//////////// Suits ////////////
/obj/item/clothing/suit/storage/labcoat/fluff/aeneas_rinil //Socialsystem: Lynn Fea
name = "Robotics labcoat"
diff --git a/code/modules/events/alien_infestation.dm b/code/modules/events/alien_infestation.dm
index b6313a77a40..05054f468dd 100644
--- a/code/modules/events/alien_infestation.dm
+++ b/code/modules/events/alien_infestation.dm
@@ -17,8 +17,7 @@
/datum/event/alien_infestation/start()
var/list/vents = list()
for(var/obj/machinery/atmospherics/unary/vent_pump/temp_vent in world)
- // TODO: Tie into space manager
- if((temp_vent.loc.z in config.station_levels) && !temp_vent.welded)
+ if(is_station_level(temp_vent.loc.z) && !temp_vent.welded)
if(temp_vent.parent.other_atmosmch.len > 50) //Stops Aliens getting stuck in small networks. See: Security, Virology
vents += temp_vent
diff --git a/code/modules/events/anomaly_bluespace.dm b/code/modules/events/anomaly_bluespace.dm
index f7db50694d6..65b005c2538 100644
--- a/code/modules/events/anomaly_bluespace.dm
+++ b/code/modules/events/anomaly_bluespace.dm
@@ -19,8 +19,7 @@
var/obj/item/device/radio/beacon/chosen
var/list/possible = list()
for(var/obj/item/device/radio/beacon/W in world)
- // TODO: Tie into space manager
- if(!(W.z in config.station_levels))
+ if(!is_station_level(W.z))
continue
possible += W
diff --git a/code/modules/events/brand_intelligence.dm b/code/modules/events/brand_intelligence.dm
index e51ad46f61a..d640bca8641 100644
--- a/code/modules/events/brand_intelligence.dm
+++ b/code/modules/events/brand_intelligence.dm
@@ -18,8 +18,7 @@
/datum/event/brand_intelligence/start()
for(var/obj/machinery/vending/V in machines)
- // TODO: Tie into space manager
- if(V.z != ZLEVEL_STATION) continue
+ if(!is_station_level(V.z)) continue
vendingMachines.Add(V)
if(!vendingMachines.len)
diff --git a/code/modules/events/disease_outbreak.dm b/code/modules/events/disease_outbreak.dm
index 0f44bf586ee..cdcfb6d06e9 100644
--- a/code/modules/events/disease_outbreak.dm
+++ b/code/modules/events/disease_outbreak.dm
@@ -21,8 +21,7 @@
var/turf/T = get_turf(H)
if(!T)
continue
- // TODO: Tie into space manager
- if(T.z != ZLEVEL_STATION)
+ if(!is_station_level(T.z))
continue
var/foundAlready = 0 // don't infect someone that already has the virus
for(var/datum/disease/D in H.viruses)
diff --git a/code/modules/events/dust.dm b/code/modules/events/dust.dm
index 17b529f9bda..5ed631736dd 100644
--- a/code/modules/events/dust.dm
+++ b/code/modules/events/dust.dm
@@ -62,7 +62,7 @@
goal = locate(endx, endy, 1)
src.x = startx
src.y = starty
- src.z = ZLEVEL_STATION
+ src.z = level_name_to_num(MAIN_STATION)
spawn(0)
walk_towards(src, goal, 1)
return
diff --git a/code/modules/events/grid_check.dm b/code/modules/events/grid_check.dm
index 479a0ea162e..5a892efb691 100644
--- a/code/modules/events/grid_check.dm
+++ b/code/modules/events/grid_check.dm
@@ -22,8 +22,7 @@
for(var/obj/machinery/power/smes/S in machines)
var/area/current_area = get_area(S)
- // TODO: Tie into space manager
- if(current_area.type in skipped_areas || !(S.z in config.station_levels))
+ if(current_area.type in skipped_areas || !is_station_level(S.z))
continue
S.last_charge = S.charge
S.last_output_attempt = S.output_attempt
@@ -36,8 +35,7 @@
for(var/obj/machinery/power/apc/C in apcs)
var/area/current_area = get_area(C)
- // TODO: Tie into space manager
- if(current_area.type in skipped_areas_apc || !(C.z in config.station_levels))
+ if(current_area.type in skipped_areas_apc || !is_station_level(C.z))
continue
if(C.cell)
C.cell.charge = 0
@@ -50,15 +48,13 @@
command_announcement.Announce("Power has been restored to [station_name()]. We apologize for the inconvenience.", "Power Systems Nominal", new_sound = 'sound/AI/poweron.ogg')
for(var/obj/machinery/power/apc/C in apcs)
var/area/current_area = get_area(C)
- // TODO: Tie into space manager
- if(current_area.type in skipped_areas_apc || !(C.z in config.station_levels))
+ if(current_area.type in skipped_areas_apc || !is_station_level(C.z))
continue
if(C.cell)
C.cell.charge = C.cell.maxcharge
for(var/obj/machinery/power/smes/S in machines)
var/area/current_area = get_area(S)
- // TODO: Tie into space manager
- if(current_area.type in skipped_areas || !(S.z in config.station_levels))
+ if(current_area.type in skipped_areas || !is_station_level(S.z))
continue
S.charge = S.last_charge
S.output_attempt = S.last_output_attempt
@@ -70,8 +66,7 @@
if(announce)
command_announcement.Announce("All SMESs on [station_name()] have been recharged. We apologize for the inconvenience.", "Power Systems Nominal", new_sound = 'sound/AI/poweron.ogg')
for(var/obj/machinery/power/smes/S in machines)
- // TODO: Tie into space manager
- if(S.z != ZLEVEL_STATION)
+ if(!is_station_level(S.z))
continue
S.charge = S.capacity
S.output_level = S.output_level_max
diff --git a/code/modules/events/holidays/Christmas.dm b/code/modules/events/holidays/Christmas.dm
index 1d5a4d9e659..e3772fa78b5 100644
--- a/code/modules/events/holidays/Christmas.dm
+++ b/code/modules/events/holidays/Christmas.dm
@@ -1,7 +1,6 @@
/proc/Christmas_Game_Start()
for(var/obj/structure/flora/tree/pine/xmas in world)
- // TODO: Tie into space manager
- if(!(xmas.z in config.station_levels)) continue
+ if(!is_station_level(xmas.z)) continue
for(var/turf/simulated/floor/T in orange(1,xmas))
for(var/i=1,i<=rand(1,5),i++)
new /obj/item/weapon/a_gift(T)
diff --git a/code/modules/events/holidays/Holidays.dm b/code/modules/events/holidays/Holidays.dm
index 8b219e77d8a..107767455f6 100644
--- a/code/modules/events/holidays/Holidays.dm
+++ b/code/modules/events/holidays/Holidays.dm
@@ -171,7 +171,7 @@ var/global/Holiday = null
*/
/* var/list/obj/containers = list()
for(var/obj/item/weapon/storage/S in world)
- if(!(S.z in config.station_levels)) continue
+ if(!is_station_level(S.z)) continue
containers += S
message_admins("\blue DEBUG: Event: Egg spawned at [Egg.loc] ([Egg.x],[Egg.y],[Egg.z])")*/
diff --git a/code/modules/events/radiation_storm.dm b/code/modules/events/radiation_storm.dm
index 54a2bb41bb9..7968e2493cf 100644
--- a/code/modules/events/radiation_storm.dm
+++ b/code/modules/events/radiation_storm.dm
@@ -24,8 +24,7 @@
command_announcement.Announce("High levels of radiation detected near the station. Please evacuate into one of the shielded maintenance tunnels.", "Anomaly Alert", new_sound = 'sound/AI/radiation.ogg')
for(var/area/A in world)
- // TODO: Tie into space manager
- if(!(A.z in config.station_levels) || is_safe_zone(A))
+ if(!is_station_level(A.z) || is_safe_zone(A))
continue
A.radiation_alert()
@@ -43,8 +42,7 @@
var/turf/T = get_turf(H)
if(!T)
continue
- // TODO: Tie into space manager
- if(!(T.z in config.station_levels) || is_safe_zone(T.loc))
+ if(!is_station_level(T.z) || is_safe_zone(T.loc))
continue
if(istype(H,/mob/living/carbon/human))
@@ -63,8 +61,7 @@
command_announcement.Announce("The station has passed the radiation belt. Please report to medbay if you experience any unusual symptoms. Maintenance will lose all access again shortly.", "Anomaly Alert")
for(var/area/A in world)
- // TODO: Tie into space manager
- if(!(A.z in config.station_levels) || is_safe_zone(A))
+ if(!is_station_level(A.z) || is_safe_zone(A))
continue
A.reset_radiation_alert()
diff --git a/code/modules/events/rogue_drones.dm b/code/modules/events/rogue_drones.dm
index 455312baa99..9b7386fe470 100644
--- a/code/modules/events/rogue_drones.dm
+++ b/code/modules/events/rogue_drones.dm
@@ -41,7 +41,7 @@
var/datum/effect/system/spark_spread/sparks = new /datum/effect/system/spark_spread()
sparks.set_up(3, 0, D.loc)
sparks.start()
- D.z = ZLEVEL_CENTCOMM
+ D.z = level_name_to_num(CENTCOMM)
D.has_loot = 0
qdel(D)
diff --git a/code/modules/events/spider_infestation.dm b/code/modules/events/spider_infestation.dm
index 2c46fc8dffa..2b3ffb799df 100644
--- a/code/modules/events/spider_infestation.dm
+++ b/code/modules/events/spider_infestation.dm
@@ -16,8 +16,7 @@
var/list/vents = list()
for(var/obj/machinery/atmospherics/unary/vent_pump/temp_vent in world)
- // TODO: Tie into space manager
- if((temp_vent.loc.z in config.station_levels) && !temp_vent.welded)
+ if(is_station_level(temp_vent.loc.z) && !temp_vent.welded)
if(temp_vent.parent.other_atmosmch.len > 50)
vents += temp_vent
diff --git a/code/modules/events/undead.dm b/code/modules/events/undead.dm
index 3399c69c979..f705b63611c 100644
--- a/code/modules/events/undead.dm
+++ b/code/modules/events/undead.dm
@@ -9,8 +9,7 @@
RS.start()
RS.kill()
for(var/area/A)
- // TODO: Tie into space manager
- if(!(A.z in config.station_levels)) continue //Spook on main station only.
+ if(!is_station_level(A.z)) continue //Spook on main station only.
if(A.luminosity) continue
// if(A.lighting_space) continue
if(A.type == /area) continue
diff --git a/code/modules/events/vent_clog.dm b/code/modules/events/vent_clog.dm
index de4e62215a8..e5679764a39 100644
--- a/code/modules/events/vent_clog.dm
+++ b/code/modules/events/vent_clog.dm
@@ -11,8 +11,7 @@
/datum/event/vent_clog/setup()
endWhen = rand(25, 100)
for(var/obj/machinery/atmospherics/unary/vent_scrubber/temp_vent in machines)
- // TODO: Tie into space manager
- if((temp_vent.loc.z in config.station_levels))
+ if(is_station_level(temp_vent.loc.z))
if(temp_vent.parent.other_atmosmch.len > 50)
vents += temp_vent
diff --git a/code/modules/events/wormholes.dm b/code/modules/events/wormholes.dm
index 1f3aa1355cd..398994f972d 100644
--- a/code/modules/events/wormholes.dm
+++ b/code/modules/events/wormholes.dm
@@ -13,8 +13,7 @@
/datum/event/wormholes/start()
for(var/turf/simulated/floor/T in world)
- // TODO: Tie into space manager
- if((T.z in config.station_levels))
+ if(is_station_level(T.z))
pick_turfs += T
for(var/i in 1 to number_of_wormholes)
diff --git a/code/modules/holiday/christmas.dm b/code/modules/holiday/christmas.dm
index c90e97d60c1..f9fbaf81b1d 100644
--- a/code/modules/holiday/christmas.dm
+++ b/code/modules/holiday/christmas.dm
@@ -1,7 +1,6 @@
/datum/holiday/xmas/celebrate()
for(var/obj/structure/flora/tree/pine/xmas in world)
- // TODO: Tie into space manager
- if(!(xmas.z in config.station_levels)) continue
+ if(!is_station_level(xmas.z)) continue
for(var/turf/simulated/floor/T in orange(1,xmas))
for(var/i=1,i<=rand(1,5),i++)
new /obj/item/weapon/a_gift(T)
diff --git a/code/modules/hydroponics/seed.dm b/code/modules/hydroponics/seed.dm
index ec7a5aca25f..994f141d373 100644
--- a/code/modules/hydroponics/seed.dm
+++ b/code/modules/hydroponics/seed.dm
@@ -376,8 +376,7 @@
// Bluespace tomato code copied over from grown.dm.
if(get_trait(TRAIT_TELEPORTING))
- // TODO: Tie into space manager
- if(target.z in config.admin_levels)
+ if(!is_teleport_allowed(target.z))
return 1
//Plant potency determines radius of teleport.
diff --git a/code/modules/mining/equipment_locker.dm b/code/modules/mining/equipment_locker.dm
index 211914afcbb..203af7d7fb1 100644
--- a/code/modules/mining/equipment_locker.dm
+++ b/code/modules/mining/equipment_locker.dm
@@ -528,8 +528,7 @@
/obj/item/device/wormhole_jaunter/attack_self(mob/user as mob)
var/turf/device_turf = get_turf(user)
- // TODO: Tie into space manager
- if(!device_turf||device_turf.z==ZLEVEL_CENTCOMM||device_turf.z>=ZLEVEL_EMPTY)
+ if(!device_turf||is_teleport_allowed(device_turf.z))
to_chat(user, "You're having difficulties getting the [src.name] to work.")
return
else
@@ -537,14 +536,13 @@
var/list/L = list()
for(var/obj/item/device/radio/beacon/B in world)
var/turf/T = get_turf(B)
- // TODO: Tie into space manager
- if(T.z == ZLEVEL_STATION)
+ if(is_station_level(T.z))
L += B
if(!L.len)
to_chat(user, "The [src.name] failed to create a wormhole.")
return
var/chosen_beacon = pick(L)
- var/obj/effect/portal/wormhole/jaunt_tunnel/J = new /obj/effect/portal/wormhole/jaunt_tunnel(get_turf(src), chosen_beacon)
+ var/obj/effect/portal/wormhole/jaunt_tunnel/J = new /obj/effect/portal/wormhole/jaunt_tunnel(get_turf(src), chosen_beacon, lifespan=100)
try_move_adjacent(J)
playsound(src,'sound/effects/sparks4.ogg',50,1)
qdel(src)
diff --git a/code/modules/mining/ore.dm b/code/modules/mining/ore.dm
index 2a6f5555555..ec36988cb20 100644
--- a/code/modules/mining/ore.dm
+++ b/code/modules/mining/ore.dm
@@ -240,8 +240,7 @@
/obj/item/weapon/ore/New()
pixel_x = rand(0,16)-8
pixel_y = rand(0,8)-8
- // TODO: Tie into space manager
- if(src.z == ZLEVEL_ASTEROID)
+ if(is_mining_level(src.z))
score_oremined++ //When ore spawns, increment score. Only include ore spawned on mining asteroid (No Clown Planet)
/obj/item/weapon/ore/ex_act()
diff --git a/code/modules/mob/living/living.dm b/code/modules/mob/living/living.dm
index 60c26dc4a50..7905c8f06fc 100644
--- a/code/modules/mob/living/living.dm
+++ b/code/modules/mob/living/living.dm
@@ -18,10 +18,7 @@
var/turf/T = get_turf(src)
if(!T)
return 0
- // TODO: Tie into space manager
- if(T.z == ZLEVEL_CENTCOMM) //dont detect mobs on centcomm
- return 0
- if(T.z >= MAX_Z)
+ if(!is_level_reachable(T.z))
return 0
if(user != null && src == user)
return 0
diff --git a/code/modules/mob/living/silicon/ai/ai.dm b/code/modules/mob/living/silicon/ai/ai.dm
index 9bef16daf77..26221311a03 100644
--- a/code/modules/mob/living/silicon/ai/ai.dm
+++ b/code/modules/mob/living/silicon/ai/ai.dm
@@ -62,7 +62,6 @@ var/list/ai_verbs_default = list(
var/datum/module_picker/malf_picker
var/processing_time = 100
var/list/datum/AI_Module/current_modules = list()
- var/fire_res_on_core = 0
var/can_dominate_mechs = 0
var/control_disabled = 0 // Set to 1 to stop AI from interacting via Click() -- TLE
var/malfhacking = 0 // More or less a copy of the above var, so that malf AIs can hack and still get new cyborgs -- NeoFite
@@ -640,15 +639,13 @@ var/list/ai_verbs_default = list(
if(check_unable(AI_CHECK_WIRELESS | AI_CHECK_RADIO))
return
- var/ai_allowed_Zlevel = list(ZLEVEL_STATION,ZLEVEL_TELECOMMS,ZLEVEL_ASTEROID)
var/d
var/area/bot_area
d += "Query network status
"
d += "Name | Status | Location | Control |
"
for(var/mob/living/simple_animal/bot/Bot in simple_animal_list)
- // TODO: Tie into space manager
- if((Bot.z in ai_allowed_Zlevel) && !Bot.remote_disabled) //Only non-emagged bots on the allowed Z-level are detected!
+ if(is_ai_allowed(Bot.z) && !Bot.remote_disabled) //Only non-emagged bots on the allowed Z-level are detected!
bot_area = get_area(Bot)
d += "| [Bot.hacked ? "(!) [Bot.name]" : Bot.name] ([Bot.model]) | "
//If the bot is on, it will display the bot's current mode status. If the bot is not mode, it will just report "Idle". "Inactive if it is not on at all.
@@ -1136,3 +1133,18 @@ var/list/ai_verbs_default = list(
eyeobj.setLoc(get_turf(C))
client.eye = eyeobj
return 1
+
+/mob/living/silicon/ai/proc/relay_speech(mob/living/M, text, verb, datum/language/speaking)
+ if(!say_understands(M, speaking))//The AI will be able to understand most mobs talking through the holopad.
+ if(speaking)
+ text = speaking.scramble(text)
+ else
+ text = stars(text)
+ var/name_used = M.GetVoice()
+ //This communication is imperfect because the holopad "filters" voices and is only designed to connect to the master only.
+ var/rendered
+ if(speaking)
+ rendered = "Relayed Speech: [name_used] [speaking.format_message(text, verb)]"
+ else
+ rendered = "Relayed Speech: [name_used] [verb], \"[text]\""
+ show_message(rendered, 2)
diff --git a/code/modules/mob/living/silicon/ai/freelook/eye.dm b/code/modules/mob/living/silicon/ai/freelook/eye.dm
index 00435fdd17a..71a2e6cba36 100644
--- a/code/modules/mob/living/silicon/ai/freelook/eye.dm
+++ b/code/modules/mob/living/silicon/ai/freelook/eye.dm
@@ -116,3 +116,7 @@
return //won't work if dead
acceleration = !acceleration
to_chat(usr, "Camera acceleration has been toggled [acceleration ? "on" : "off"].")
+
+/mob/camera/aiEye/hear_say(var/message, var/verb = "says", var/datum/language/language = null, var/alt_name = "", var/italics = 0, var/mob/speaker = null, var/sound/speech_sound, var/sound_vol)
+ if(relay_speech)
+ ai.relay_speech(speaker, message, verb, language)
diff --git a/code/modules/mob/living/silicon/ai/life.dm b/code/modules/mob/living/silicon/ai/life.dm
index f82db9b4662..6599c31c5ce 100644
--- a/code/modules/mob/living/silicon/ai/life.dm
+++ b/code/modules/mob/living/silicon/ai/life.dm
@@ -152,10 +152,7 @@
health = 100
stat = CONSCIOUS
else
- if(fire_res_on_core)
- health = 100 - getOxyLoss() - getToxLoss() - getBruteLoss()
- else
- health = 100 - getOxyLoss() - getToxLoss() - getFireLoss() - getBruteLoss()
+ health = 100 - getOxyLoss() - getToxLoss() - getFireLoss() - getBruteLoss()
diag_hud_set_status()
diag_hud_set_health()
diff --git a/code/modules/mob/living/silicon/pai/software_modules.dm b/code/modules/mob/living/silicon/pai/software_modules.dm
index 6d4c3a45150..adc0e54e661 100644
--- a/code/modules/mob/living/silicon/pai/software_modules.dm
+++ b/code/modules/mob/living/silicon/pai/software_modules.dm
@@ -123,6 +123,7 @@
on_ui_interact(mob/living/silicon/pai/user, datum/nanoui/ui=null, force_open=1)
var/data[0]
+ data_core.get_manifest_json()
data["manifest"] = PDA_Manifest
ui = nanomanager.try_update_ui(user, user, id, ui, data, force_open)
@@ -499,8 +500,7 @@
/mob/living/silicon/pai/proc/hackloop()
var/turf/T = get_turf_or_move(src.loc)
for(var/mob/living/silicon/ai/AI in player_list)
- // TODO: Tie into space manager
- if(!T || !(T.z in config.contact_levels))
+ if(!T || !is_station_contact(T.z))
break
if(T.loc)
to_chat(AI, "Network Alert: Brute-force encryption crack in progress in [T.loc].")
diff --git a/code/modules/mob/living/simple_animal/hostile/illusion.dm b/code/modules/mob/living/simple_animal/hostile/illusion.dm
index a770f6b1c32..b6cda2e0e3c 100644
--- a/code/modules/mob/living/simple_animal/hostile/illusion.dm
+++ b/code/modules/mob/living/simple_animal/hostile/illusion.dm
@@ -53,6 +53,7 @@
return
var/mob/living/simple_animal/hostile/illusion/M = new(loc)
M.faction = faction.Copy()
+ M.attack_sound = attack_sound
M.Copy_Parent(parent_mob, 80, health/2, melee_damage_upper, multiply_chance/2)
M.GiveTarget(L)
diff --git a/code/modules/mob/living/simple_animal/hostile/mimic.dm b/code/modules/mob/living/simple_animal/hostile/mimic.dm
index c0616bc5eea..ac9b8562681 100644
--- a/code/modules/mob/living/simple_animal/hostile/mimic.dm
+++ b/code/modules/mob/living/simple_animal/hostile/mimic.dm
@@ -127,11 +127,12 @@ var/global/list/protected_objects = list(/obj/structure/table, /obj/structure/ca
/mob/living/simple_animal/hostile/mimic/copy/Life()
..()
+ if(!target && !ckey) //Objects eventually revert to normal if no one is around to terrorize
+ adjustBruteLoss(1)
for(var/mob/living/M in contents) //a fix for animated statues from the flesh to stone spell
death()
/mob/living/simple_animal/hostile/mimic/copy/death(gibbed)
-
for(var/atom/movable/M in src)
M.loc = get_turf(src)
..()
@@ -186,7 +187,6 @@ var/global/list/protected_objects = list(/obj/structure/table, /obj/structure/ca
if(destroy_original)
qdel(O)
return 1
- return
/mob/living/simple_animal/hostile/mimic/copy/DestroySurroundings()
if(destroy_objects)
diff --git a/code/modules/mob/new_player/preferences_setup.dm b/code/modules/mob/new_player/preferences_setup.dm
index dc0916ee344..cf8a7f05574 100644
--- a/code/modules/mob/new_player/preferences_setup.dm
+++ b/code/modules/mob/new_player/preferences_setup.dm
@@ -211,6 +211,7 @@
icobase = H.species.icobase
if(H.species.bodyflags & HAS_TAIL)
coloured_tail = H.species.tail
+ qdel(H)
else
icobase = current_species.icobase
else
diff --git a/code/modules/nano/interaction/default.dm b/code/modules/nano/interaction/default.dm
index 50c2bd79143..cb00e6a12b3 100644
--- a/code/modules/nano/interaction/default.dm
+++ b/code/modules/nano/interaction/default.dm
@@ -41,8 +41,7 @@
// Prevents the AI from using Topic on admin levels (by for example viewing through the court/thunderdome cameras)
// unless it's on the same level as the object it's interacting with.
var/turf/T = get_turf(src_object)
- // TODO: Tie into space manager
- if(!T || !(z == T.z || (T.z in config.player_levels)))
+ if(!T || !(atoms_share_level(src,T) || is_level_reachable(T.z)))
return STATUS_CLOSE
// If an object is in view then we can interact with it
diff --git a/code/modules/nano/modules/crew_monitor.dm b/code/modules/nano/modules/crew_monitor.dm
index 65f5a9299ee..ce89f59947b 100644
--- a/code/modules/nano/modules/crew_monitor.dm
+++ b/code/modules/nano/modules/crew_monitor.dm
@@ -5,8 +5,7 @@
if(..())
return 1
var/turf/T = get_turf(nano_host())
- // TODO: Tie into space manager
- if(!T || !(T.z in config.player_levels))
+ if(!T || !is_level_reachable(T.z))
to_chat(usr, "Unable to establish a connection: You're too far away from the station!")
return 0
if(href_list["track"])
diff --git a/code/modules/pda/cart_apps.dm b/code/modules/pda/cart_apps.dm
index 1c407bd223c..30f732f48ae 100644
--- a/code/modules/pda/cart_apps.dm
+++ b/code/modules/pda/cart_apps.dm
@@ -316,8 +316,7 @@
if(shuttle_master.supply.mode == SHUTTLE_CALL)
supplyData["shuttle_moving"] = 1
- // TODO: Tie into space manager
- if(shuttle_master.supply.z != ZLEVEL_STATION)
+ if(!is_station_level(shuttle_master.supply.z))
supplyData["shuttle_loc"] = "station"
else
supplyData["shuttle_loc"] = "centcom"
diff --git a/code/modules/pda/messenger.dm b/code/modules/pda/messenger.dm
index 2a8ca83b218..6d7bbc90bd3 100644
--- a/code/modules/pda/messenger.dm
+++ b/code/modules/pda/messenger.dm
@@ -158,7 +158,7 @@
if(signal.data["done"])
useTC = 1
var/turf/pos = get_turf(P)
- // TODO: Tie into space manager
+ // TODO: Make the radio system cooperate with the space manager
if(pos.z in signal.data["level"])
useTC = 2
//Let's make this barely readable
diff --git a/code/modules/power/apc.dm b/code/modules/power/apc.dm
index b6eb99eb958..5800747d367 100644
--- a/code/modules/power/apc.dm
+++ b/code/modules/power/apc.dm
@@ -170,8 +170,7 @@
apcs -= src
if(malfai && operating)
if(ticker.mode.config_tag == "malfunction")
- // TODO: Tie into space manager
- if(src.z == ZLEVEL_STATION)
+ if(is_station_level(src.z))
ticker.mode:apcs--
area.power_light = 0
area.power_equip = 0
@@ -996,8 +995,7 @@
malfai.malfhacking = 0
locked = 1
if(ticker.mode.config_tag == "malfunction")
- // TODO: Tie into space manager
- if((src.z in config.station_levels)) //if(is_type_in_list(get_area(src), the_station_areas))
+ if(is_station_level(src.z)) //if(is_type_in_list(get_area(src), the_station_areas))
ticker.mode:apcs++
if(usr:parent)
src.malfai = usr:parent
@@ -1029,8 +1027,7 @@
if(malfai)
if(ticker.mode.config_tag == "malfunction")
- // TODO: Tie into space manager
- if((src.z in config.station_levels)) //if(is_type_in_list(get_area(src), the_station_areas))
+ if(is_station_level(src.z)) //if(is_type_in_list(get_area(src), the_station_areas))
operating ? ticker.mode:apcs++ : ticker.mode:apcs--
src.update()
@@ -1045,8 +1042,7 @@
if(!malf.can_shunt)
to_chat(malf, "You cannot shunt.")
return
- // TODO: Tie into space manager
- if(!(src.z in config.station_levels))
+ if(!is_station_level(src.z))
return
src.occupier = new /mob/living/silicon/ai(src,malf.laws,null,1)
src.occupier.adjustOxyLoss(malf.getOxyLoss())
@@ -1095,8 +1091,7 @@
/obj/machinery/power/apc/proc/ion_act()
//intended to be exactly the same as an AI malf attack
- // TODO: Tie into space manager
- if(!src.malfhack && (src.z in config.station_levels))
+ if(!src.malfhack && is_station_level(src.z))
if(prob(3))
src.locked = 1
if(src.cell.charge > 0)
@@ -1371,8 +1366,7 @@
/obj/machinery/power/apc/proc/set_broken()
if(malfai && operating)
if(ticker.mode.config_tag == "malfunction")
- // TODO: Tie into space manager
- if((src.z in config.station_levels)) //if(is_type_in_list(get_area(src), the_station_areas))
+ if(is_station_level(src.z)) //if(is_type_in_list(get_area(src), the_station_areas))
ticker.mode:apcs--
stat |= BROKEN
operating = 0
diff --git a/code/modules/power/gravitygenerator.dm b/code/modules/power/gravitygenerator.dm
index ea633c7e78f..6468f813fa6 100644
--- a/code/modules/power/gravitygenerator.dm
+++ b/code/modules/power/gravitygenerator.dm
@@ -124,8 +124,7 @@ var/const/GRAV_NEEDS_WRENCH = 3
O.main_part = null
qdel(O)
for(var/area/A in world)
- // TODO: Tie into space manager
- if(!(A.z in config.station_levels)) continue
+ if(!is_station_level(A.z)) continue
A.gravitychange(0,A)
shake_everyone()
return ..()
@@ -302,8 +301,7 @@ var/const/GRAV_NEEDS_WRENCH = 3
investigate_log("was brought online and is now producing gravity for this level.", "gravity")
message_admins("The gravity generator was brought online. ([area.name])")
for(var/area/A in world)
- // TODO: Tie into space manager
- if(!(A.z in config.station_levels)) continue
+ if(!is_station_level(A.z)) continue
A.gravitychange(1,A)
else
if(gravity_in_level() == 1)
@@ -311,8 +309,7 @@ var/const/GRAV_NEEDS_WRENCH = 3
investigate_log("was brought offline and there is now no gravity for this level.", "gravity")
message_admins("The gravity generator was brought offline with no backup generator. ([area.name])")
for(var/area/A in world)
- // TODO: Tie into space manager
- if(!(A.z in config.station_levels)) continue
+ if(!is_station_level(A.z)) continue
A.gravitychange(0,A)
update_icon()
@@ -380,7 +377,7 @@ var/const/GRAV_NEEDS_WRENCH = 3
shake_camera(M, 15, 1)
M.playsound_local(our_turf, 'sound/effects/alert.ogg', 100, 1, 0.5)
-// TODO: Tie into space manager
+// TODO: Make the gravity generator cooperate with the space manager
/obj/machinery/gravity_generator/main/proc/gravity_in_level()
var/turf/T = get_turf(src)
if(!T)
@@ -389,7 +386,6 @@ var/const/GRAV_NEEDS_WRENCH = 3
return length(gravity_generators["[T.z]"])
return 0
-// TODO: Tie into space manager
/obj/machinery/gravity_generator/main/proc/update_list()
var/turf/T = get_turf(src.loc)
if(T)
diff --git a/code/modules/power/smes.dm b/code/modules/power/smes.dm
index 75f88f9b751..4af4ccaeee4 100644
--- a/code/modules/power/smes.dm
+++ b/code/modules/power/smes.dm
@@ -433,8 +433,7 @@
return 1
/obj/machinery/power/smes/proc/ion_act()
- // TODO: Tie into space manager
- if(src.z in config.station_levels)
+ if(is_station_level(src.z))
if(prob(1)) //explosion
for(var/mob/M in viewers(src))
M.show_message("\red The [src.name] is making strange noises!", 3, "\red You hear sizzling electronics.", 2)
diff --git a/code/modules/projectiles/guns/energy/telegun.dm b/code/modules/projectiles/guns/energy/telegun.dm
index c280fe59903..7b94698f0e9 100644
--- a/code/modules/projectiles/guns/energy/telegun.dm
+++ b/code/modules/projectiles/guns/energy/telegun.dm
@@ -23,8 +23,7 @@
var/turf/T = get_turf(R)
if(!T)
continue
- // TODO: Tie into space manager
- if((T.z in config.admin_levels) || T.z > ZLEVEL_EMPTY)
+ if(!is_teleport_allowed(T.z))
continue
if(R.syndicate == 1)
continue
diff --git a/code/modules/projectiles/projectile/special.dm b/code/modules/projectiles/projectile/special.dm
index cd562e00a48..0e1b7478cc8 100644
--- a/code/modules/projectiles/projectile/special.dm
+++ b/code/modules/projectiles/projectile/special.dm
@@ -276,17 +276,9 @@ obj/item/projectile/kinetic/New()
/obj/item/projectile/beam/wormhole/on_hit(atom/target)
if(ismob(target))
- var/turf/portal_destination = pick(orange(6, src))
- do_teleport(target, portal_destination)
- return ..()
- if(!gun)
- qdel(src)
- gun.create_portal(src)
-
-/obj/item/projectile/beam/wormhole/on_hit(atom/target)
- if(ismob(target))
- var/turf/portal_destination = pick(orange(6, src))
- do_teleport(target, portal_destination)
+ if(is_teleport_allowed(target.z))
+ var/turf/portal_destination = pick(orange(6, src))
+ do_teleport(target, portal_destination)
return ..()
if(!gun)
qdel(src)
diff --git a/code/modules/reagents/newchem/drinks.dm b/code/modules/reagents/newchem/drinks.dm
index 5f4dc5b0018..b1f789b7f22 100644
--- a/code/modules/reagents/newchem/drinks.dm
+++ b/code/modules/reagents/newchem/drinks.dm
@@ -201,6 +201,7 @@
result = "uplink"
required_reagents = list("rum" = 1, "vodka" = 1, "tequila" = 1, "whiskey" = 1, "synthanol" = 1)
result_amount = 5
+ mix_message = "The chemicals mix to create a shiny, orange substance."
/datum/reagent/ethanol/synthanol/synthnsoda
name = "Synth 'n Soda"
@@ -216,6 +217,7 @@
result = "synthnsoda"
required_reagents = list("synthanol" = 1, "cola" = 1)
result_amount = 2
+ mix_message = "The chemicals mix to create a smooth, fizzy substance."
/datum/reagent/ethanol/synthanol/synthignon
name = "Synthignon"
@@ -231,5 +233,6 @@
result = "synthignon"
required_reagents = list("synthanol" = 1, "wine" = 1)
result_amount = 2
+ mix_message = "The chemicals mix to create a fine, red substance."
// ROBOT ALCOHOL ENDS
diff --git a/code/modules/research/experimentor.dm b/code/modules/research/experimentor.dm
index 262820990c2..a0f1aecb520 100644
--- a/code/modules/research/experimentor.dm
+++ b/code/modules/research/experimentor.dm
@@ -729,7 +729,7 @@
to_chat(user, "The [src] begins to vibrate!")
spawn(rand(10,30))
var/turf/userturf = get_turf(user)
- if(src.loc == user && userturf.z != ZLEVEL_CENTCOMM) //Because Nuke Ops bringing this back on their shuttle, then looting the ERT area is 2fun4you!
+ if(src.loc == user && is_teleport_allowed(userturf.z)) //Because Nuke Ops bringing this back on their shuttle, then looting the ERT area is 2fun4you!
visible_message("The [src] twists and bends, relocating itself!")
throwSmoke(userturf)
do_teleport(user, userturf, 8, asoundin = 'sound/effects/phasein.ogg')
diff --git a/code/modules/security_levels/security levels.dm b/code/modules/security_levels/security levels.dm
index 328a19ac034..a7a5162c231 100644
--- a/code/modules/security_levels/security levels.dm
+++ b/code/modules/security_levels/security levels.dm
@@ -37,8 +37,7 @@
CC.post_status("alert", "outline")
for(var/obj/machinery/firealarm/FA in world)
- // TODO: Tie into space manager
- if((FA.z in config.contact_levels))
+ if(is_station_contact(FA.z))
FA.overlays = list()
FA.overlays += image('icons/obj/monitors.dmi', "overlay_green")
@@ -54,8 +53,7 @@
CC.post_status("alert", "outline")
for(var/obj/machinery/firealarm/FA in world)
- // TODO: Tie into space manager
- if((FA.z in config.contact_levels))
+ if(is_station_contact(FA.z))
FA.overlays = list()
FA.overlays += image('icons/obj/monitors.dmi', "overlay_blue")
@@ -67,8 +65,7 @@
security_level = SEC_LEVEL_RED
var/obj/machinery/door/airlock/highsecurity/red/R = locate(/obj/machinery/door/airlock/highsecurity/red) in world
- // TODO: Tie into space manager
- if(R && (R.z in config.station_levels))
+ if(R && is_station_level(R.z))
R.locked = 0
R.update_icon()
@@ -77,8 +74,7 @@
CC.post_status("alert", "redalert")
for(var/obj/machinery/firealarm/FA in world)
- // TODO: Tie into space manager
- if((FA.z in config.contact_levels))
+ if(is_station_contact(FA.z))
FA.overlays = list()
FA.overlays += image('icons/obj/monitors.dmi', "overlay_red")
@@ -90,14 +86,12 @@
if(security_level < SEC_LEVEL_RED)
for(var/obj/machinery/door/airlock/highsecurity/red/R in airlocks)
- // TODO: Tie into space manager
- if((R.z in config.station_levels))
+ if(is_station_level(R.z))
R.locked = 0
R.update_icon()
for(var/obj/machinery/door/airlock/hatch/gamma/H in airlocks)
- // TODO: Tie into space manager
- if((H.z in config.station_levels))
+ if(is_station_level(H.z))
H.locked = 0
H.update_icon()
@@ -106,8 +100,7 @@
CC.post_status("alert", "gammaalert")
for(var/obj/machinery/firealarm/FA in world)
- // TODO: Tie into space manager
- if((FA.z in config.contact_levels))
+ if(is_station_contact(FA.z))
FA.overlays = list()
FA.overlays += image('icons/obj/monitors.dmi', "overlay_gamma")
FA.update_icon()
@@ -121,8 +114,7 @@
CC.post_status("alert", "epsilonalert")
for(var/obj/machinery/firealarm/FA in world)
- // TODO: Tie into space manager
- if((FA.z in config.contact_levels))
+ if(is_station_contact(FA.z))
FA.overlays = list()
FA.overlays += image('icons/obj/monitors.dmi', "overlay_epsilon")
@@ -135,8 +127,7 @@
CC.post_status("alert", "deltaalert")
for(var/obj/machinery/firealarm/FA in world)
- // TODO: Tie into space manager
- if((FA.z in config.contact_levels))
+ if(is_station_contact(FA.z))
FA.overlays = list()
FA.overlays += image('icons/obj/monitors.dmi', "overlay_delta")
diff --git a/code/modules/shuttle/assault_pod.dm b/code/modules/shuttle/assault_pod.dm
index 40e7aa05aa0..fe3d059a08a 100644
--- a/code/modules/shuttle/assault_pod.dm
+++ b/code/modules/shuttle/assault_pod.dm
@@ -6,7 +6,6 @@
height = 7
/obj/docking_port/mobile/assault_pod/request()
- // TODO: Tie into space manager
if(z == initial(src.z)) //No launching pods that have already launched
return ..()
diff --git a/code/modules/shuttle/emergency.dm b/code/modules/shuttle/emergency.dm
index 1224f5719b9..89aeb978cdf 100644
--- a/code/modules/shuttle/emergency.dm
+++ b/code/modules/shuttle/emergency.dm
@@ -202,8 +202,7 @@
if(time_left <= 0 && !shuttle_master.emergencyNoEscape)
//move each escape pod to its corresponding transit dock
for(var/obj/docking_port/mobile/pod/M in shuttle_master.mobile)
- // TODO: Tie into space manager
- if(M.z == ZLEVEL_STATION) //Will not launch from the mine/planet
+ if(is_station_level(M.z)) //Will not launch from the mine/planet
M.enterTransit()
//now move the actual emergency shuttle to its transit dock
for(var/area/shuttle/escape/E in world)
diff --git a/code/modules/shuttle/supply.dm b/code/modules/shuttle/supply.dm
index f076c7ee977..3451f7fbe08 100644
--- a/code/modules/shuttle/supply.dm
+++ b/code/modules/shuttle/supply.dm
@@ -28,7 +28,7 @@
return 1
/obj/docking_port/mobile/supply/canMove()
- if(z == ZLEVEL_STATION)
+ if(is_station_level(z))
return forbidden_atoms_check(areaInstance)
return ..()
@@ -45,7 +45,7 @@
sell()
/obj/docking_port/mobile/supply/proc/buy()
- if(z != ZLEVEL_STATION) //we only buy when we are -at- the station
+ if(!is_station_level(z)) //we only buy when we are -at- the station
return 1
if(!shuttle_master.shoppinglist.len)
@@ -93,7 +93,7 @@
shuttle_master.shoppinglist.Cut()
/obj/docking_port/mobile/supply/proc/sell()
- if(z != ZLEVEL_CENTCOMM) //we only sell when we are -at- centcomm
+ if(z != level_name_to_num(CENTCOMM)) //we only sell when we are -at- centcomm
return 1
var/plasma_count = 0
diff --git a/code/modules/shuttle/syndicate.dm b/code/modules/shuttle/syndicate.dm
index b1afd14bcf5..1c03c3f7039 100644
--- a/code/modules/shuttle/syndicate.dm
+++ b/code/modules/shuttle/syndicate.dm
@@ -30,9 +30,9 @@
/obj/machinery/computer/shuttle/syndicate/drop_pod/Topic(href, href_list)
if(href_list["move"])
- if(z != ZLEVEL_CENTCOMM)
+ if(z != level_name_to_num(CENTCOMM))
to_chat(usr, "Pods are one way!")
return 0
..()
-#undef SYNDICATE_CHALLENGE_TIMER
\ No newline at end of file
+#undef SYNDICATE_CHALLENGE_TIMER
diff --git a/code/modules/space_management/level_check.dm b/code/modules/space_management/level_check.dm
new file mode 100644
index 00000000000..391f5968c22
--- /dev/null
+++ b/code/modules/space_management/level_check.dm
@@ -0,0 +1,7 @@
+/proc/is_on_level_name(atom/A,name)
+ var/datum/space_level/S = space_manager.get_zlev_by_name(name)
+ return A.z == S.zpos
+
+// For expansion later
+/proc/atoms_share_level(atom/A, atom/B)
+ return A.z == B.z
diff --git a/code/modules/space_management/level_traits.dm b/code/modules/space_management/level_traits.dm
new file mode 100644
index 00000000000..83309c3764f
--- /dev/null
+++ b/code/modules/space_management/level_traits.dm
@@ -0,0 +1,62 @@
+/proc/is_level_reachable(z)
+ return check_level_trait(z, REACHABLE)
+
+/proc/is_station_level(z)
+ return check_level_trait(z, STATION_LEVEL)
+
+/proc/is_station_contact(z)
+ return check_level_trait(z, STATION_CONTACT)
+
+/proc/is_teleport_allowed(z)
+ return !check_level_trait(z, BLOCK_TELEPORT)
+
+/proc/is_admin_level(z)
+ return check_level_trait(z, ADMIN_LEVEL)
+
+/proc/is_away_level(z)
+ return check_level_trait(z, AWAY_LEVEL)
+
+/proc/is_mining_level(z)
+ return check_level_trait(z, ORE_LEVEL)
+
+/proc/is_ai_allowed(z)
+ return check_level_trait(z, AI_OK)
+
+/proc/level_blocks_magic(z)
+ return check_level_trait(z, IMPEDES_MAGIC)
+
+/proc/level_boosts_signal(z)
+ return check_level_trait(z, BOOSTS_SIGNAL)
+
+// Used for the nuke disk, or for checking if players survived through xenos
+/proc/is_secure_level(z)
+ var/secure = check_level_trait(z, STATION_LEVEL)
+ if(!secure)
+ // This is to allow further admin levels later, other than centcomm
+ secure = (z == level_name_to_num(CENTCOMM))
+ return secure
+
+var/list/default_map_traits = MAP_TRANSITION_CONFIG
+/proc/check_level_trait(z, trait)
+ if(z == 0)
+ return 0 // If you're nowhere, you have no traits
+ var/list/trait_list
+ if(space_manager.initialized)
+ var/datum/space_level/S = space_manager.get_zlev(z)
+ trait_list = S.flags
+ else
+ trait_list = default_map_traits[z]
+ trait_list = trait_list["attributes"]
+ return (trait in trait_list)
+
+/proc/levels_by_trait(trait)
+ var/list/result = list()
+ for(var/A in space_manager.z_list)
+ var/datum/space_level/S = space_manager.z_list[A]
+ if(trait in S.flags)
+ result |= S
+ return result
+
+/proc/level_name_to_num(name)
+ var/datum/space_level/S = space_manager.get_zlev_by_name(name)
+ return S.zpos
diff --git a/code/modules/space_management/space_level.dm b/code/modules/space_management/space_level.dm
index 6b7654cd504..085bd89f44b 100644
--- a/code/modules/space_management/space_level.dm
+++ b/code/modules/space_management/space_level.dm
@@ -1,7 +1,7 @@
/datum/space_level
var/name = "Your config settings failed, you need to fix this for the datum space levels to work"
var/zpos = 1
- var/flags = 0 // We'll use this to keep track of whether you can teleport/etc
+ var/flags = list() // We'll use this to keep track of whether you can teleport/etc
// Map transition stuff
var/list/neighbors = list()
@@ -19,8 +19,9 @@
var/dirt_count = 0
var/list/init_list = list()
-/datum/space_level/New(z, name, transition_type = SELFLOOPING)
+/datum/space_level/New(z, name, transition_type = SELFLOOPING, traits = list(BLOCK_TELEPORT))
zpos = z
+ flags = traits
set_linkage(transition_type)
build_space_destination_arrays()
@@ -57,7 +58,8 @@
linkage = transition_type
if(transition_type == SELFLOOPING)
link_to_self() // `link_to_self` is defined in space_transitions.dm
-
+ if(transition_type == UNAFFECTED)
+ reset_connections()
/datum/space_level/proc/resume_init()
if(dirt_count > 0)
diff --git a/code/modules/space_management/space_transition.dm b/code/modules/space_management/space_transition.dm
index 469365e4023..bd254a37b8b 100644
--- a/code/modules/space_management/space_transition.dm
+++ b/code/modules/space_management/space_transition.dm
@@ -20,6 +20,7 @@
var/list/direction_cache = list()
/datum/space_level/proc/link_to_self()
+ reset_connections()
neighbors = list()
var/list/L = list(Z_LEVEL_NORTH,Z_LEVEL_SOUTH,Z_LEVEL_EAST,Z_LEVEL_WEST)
for(var/A in L)
@@ -279,7 +280,7 @@
/datum/spacewalk_grid/proc/get_height()
return 1 + max_y - min_y
-// This function is called repeatedly to build the map
+// This function chooses an available point next to any node in the grid
/datum/spacewalk_grid/proc/get_empty_node()
var/datum/point/P = pick(available_nodes)
if(isnull(P))
@@ -287,6 +288,12 @@
consume_node(P)
return P
+// This function is called repeatedly to build the map
+/datum/spacewalk_grid/proc/add_level(datum/space_level/S)
+ var/datum/point/P = get_empty_node()
+ P.set_space_level(S)
+
+
// This proc substantiates the grid of points used to determine routes between levels
// Separating this from initialization gives us time in which we can add more crosslink z levels
// before we bake in all our connections
@@ -310,7 +317,6 @@
var/datum/spacewalk_grid/point_grid = new
// We do this so we can display the way the levels connect later
linkage_map = point_grid
- var/datum/point/P
// Now, we pop entries in a random order from our list of space levels
// and assign its connections based on the grid
@@ -318,16 +324,10 @@
D = pick(crosslinks)
crosslinks.Remove(D)
// We now choose a point in our imaginary grid adjacent to our current location
- P = point_grid.get_empty_node()
- // Let our z level know where in the imaginary grid it is
- // This will also handle establishing neighborship with other z levels
- P.set_space_level(D)
+ point_grid.add_level(D)
-// A heavy proc - loops through all space turfs and sets its destination
+// Loops through border space turfs and sets its destination
// based on its space level's linkage
-// Takes 0.6 seconds per call on my machine - could have each z level
-// have its own space turf cache, but I don't want to complicate this more
-// than is necessary
/datum/zlev_manager/proc/setup_space_destinations()
var/timer = start_watch()
log_debug("Assigning space turf destinations...")
diff --git a/code/modules/space_management/zlevel_manager.dm b/code/modules/space_management/zlevel_manager.dm
index 8f83c0ab5e4..26607380a37 100644
--- a/code/modules/space_management/zlevel_manager.dm
+++ b/code/modules/space_management/zlevel_manager.dm
@@ -3,9 +3,11 @@ var/global/datum/zlev_manager/space_manager = new
/datum/zlev_manager
// A list of z-levels
var/list/z_list = list()
+ var/list/levels_by_name = list()
var/list/heaps = list()
var/datum/spacewalk_grid/linkage_map
+ var/initialized = 0
// Populate our space level list
// and prepare space transitions
@@ -14,18 +16,24 @@ var/global/datum/zlev_manager/space_manager = new
var/k = 1
// First take care of "Official" z levels, without visiting levels outside of the list
- for(var/A in map_transition_config)
- // `A` is the name
- // `map_transition_config[A]` is the transition type
- z_list["[k]"] = new /datum/space_level(k, A, transition_type = map_transition_config[A])
+ for(var/list/features in map_transition_config)
if(k > world.maxz)
- CRASH("More map transitions defined than existent z levels - [num_official_z_levels]")
+ CRASH("More map attributes pre-defined than existent z levels - [num_official_z_levels]")
+ var/name = features["name"]
+ var/linking = features["linkage"]
+ var/list/attributes = features["attributes"]
+ attributes = attributes.Copy() // Clone the list so it can't be changed on accident
+
+ var/datum/space_level/S = new /datum/space_level(k, name, transition_type = linking, traits = attributes)
+ z_list["[k]"] = S
+ levels_by_name[name] = S
k++
// Then, we take care of unmanaged z levels
// They get the default linkage of SELFLOOPING
for(var/i = k, i <= world.maxz, i++)
z_list["[i]"] = new /datum/space_level(i)
+ initialized = 1
/datum/zlev_manager/proc/get_zlev(z)
@@ -34,6 +42,11 @@ var/global/datum/zlev_manager/space_manager = new
else
return z_list["[z]"]
+/datum/zlev_manager/proc/get_zlev_by_name(A)
+ if(!(A in levels_by_name))
+ throw EXCEPTION("Non-existent z level: '[A]'")
+ return levels_by_name[A]
+
/*
* "Dirt" management
* "Dirt" is used to keep track of whether a z level should automatically have
@@ -88,10 +101,14 @@ var/global/datum/zlev_manager/space_manager = new
// Increments the max z-level by one
// For convenience's sake returns the z-level added
-/datum/zlev_manager/proc/add_new_zlevel(name, linkage = SELFLOOPING)
+/datum/zlev_manager/proc/add_new_zlevel(name, linkage = SELFLOOPING, traits = list(BLOCK_TELEPORT))
+ if(name in levels_by_name)
+ throw EXCEPTION("Name already in use: [name]")
world.maxz++
var/our_z = world.maxz
- z_list["[our_z]"] = new /datum/space_level(our_z,name, transition_type = linkage)
+ var/datum/space_level/S = new /datum/space_level(our_z, name, transition_type = linkage, traits = traits)
+ levels_by_name[name] = S
+ z_list["[our_z]"] = S
return our_z
/datum/zlev_manager/proc/cut_levels_downto(new_maxz)
diff --git a/code/modules/store/store.dm b/code/modules/store/store.dm
index 7d5fc1e527d..d93d56acc41 100644
--- a/code/modules/store/store.dm
+++ b/code/modules/store/store.dm
@@ -48,8 +48,7 @@ var/global/datum/store/centcomm_store=new
/datum/store/proc/reconnect_database()
for(var/obj/machinery/computer/account_database/DB in world)
- // TODO: Tie into space manager
- if((DB.z in config.station_levels))
+ if(is_station_level(DB.z))
linked_db = DB
break
diff --git a/code/modules/telesci/bscrystal.dm b/code/modules/telesci/bscrystal.dm
index 8b86a3082d8..a2ee8cc85ca 100644
--- a/code/modules/telesci/bscrystal.dm
+++ b/code/modules/telesci/bscrystal.dm
@@ -22,8 +22,7 @@
qdel(src)
/obj/item/weapon/ore/bluespace_crystal/proc/blink_mob(var/mob/living/L)
- // TODO: Tie into space manager
- if(L.z in config.admin_levels)
+ if(!is_teleport_allowed(L.z))
src.visible_message("[src]'s fragments begin rapidly vibrating and blink out of existence.")
qdel(src)
return
diff --git a/config/example/config.txt b/config/example/config.txt
index eb44c6d828a..97c979b77f7 100644
--- a/config/example/config.txt
+++ b/config/example/config.txt
@@ -260,18 +260,6 @@ GHOST_INTERACTION
## Default is "python" on Windows, "/usr/bin/env python2" on UNIX.
#PYTHON_PATH pythonw
-## Defines which Z-levels the station exists on.
-STATION_LEVELS 1
-
-## Defines which Z-levels are used for admin functionality, such as Central Command and the Syndicate Shuttle
-ADMIN_LEVELS 2
-
-## Defines which Z-levels which, for example, a Code Red announcement may affect
-CONTACT_LEVELS 1;5
-
-## Defines all Z-levels a character can typically reach
-PLAYER_LEVELS 1;3;4;5;6;7
-
## Expected round length in minutes
EXPECTED_ROUND_LENGTH 120
diff --git a/config/example/space_levels.txt b/config/example/space_levels.txt
deleted file mode 100644
index d40624bb64d..00000000000
--- a/config/example/space_levels.txt
+++ /dev/null
@@ -1,13 +0,0 @@
-Main Station;1;linked
-
-Central Command;2;unlinked
-
-Telecommunications Satellite;3;linked
-
-Engineering Outpost;4;linked
-
-Mining Asteroid;5;linked
-
-Derelicted Station;6;linked
-
-Empty Area;7;linked
\ No newline at end of file
diff --git a/goon/browserassets/css/browserOutput.css b/goon/browserassets/css/browserOutput.css
index dab174587ec..e299fa5a5c5 100644
--- a/goon/browserassets/css/browserOutput.css
+++ b/goon/browserassets/css/browserOutput.css
@@ -283,7 +283,7 @@ h1.alert, h2.alert {color: #000000;}
.bnotice {color: #000099; font-weight: bold;}
.boldnotice {color: #000099; font-weight: bold;}
.suicide {color: #ff5050; font-style: italic;}
-.green {color: #03ff39;}
+.green {color: #03bb39;}
.announce {color: #228b22; font-weight: bold;}
.boldannounce {color: #ff0000; font-weight: bold;}
.greenannounce {color: #00ff00; font-weight: bold;}
diff --git a/html/changelog.html b/html/changelog.html
index c1482dc15da..5214279f440 100644
--- a/html/changelog.html
+++ b/html/changelog.html
@@ -55,6 +55,86 @@
-->
+
08 August 2016
+
Ar3nn updated:
+
+ - Telekinesis no longer is subject to meatspace problems
+
+
Chakirski updated:
+
+ - Added animal AI holograms.
+ - .45 Magazine sprites for the M1911 are now longer invisible.
+ - Hoodies no longer look like labcoats while in hand.
+ - Ectoplasm spawns in cult mining rooms instead of an invisible "weapon".
+ - Duffel bag descriptions and names no longer contain "duffle".
+ - Syndicate medical duffel bags can now be seen while in hand.
+
+
Crazylemon64 updated:
+
+ - Adds a "Save" buildmode for admins to preserve their creations for later. This is currently in an early stage, so don't be surprised by errors!
+
+
FlattestGuitar updated:
+
+ - Holy Water will no longer make you stutter for ages if you're not a cultist
+
+
Fox McCloud updated:
+
+ - Fixes Orion Ship message being unheard when held in-hand
+ - Adds headphones into the game as a loadout item
+ - Removes fireproof core malf AI power
+ - upgrade turrets malf AI power CPU reduced from 50 to to 30
+ - Overload machine cost increased from 15 to 20
+ - Override machine cost increased from 15 to 30
+ - can override/overload field generators again
+ - Machine uprisers will slowly die if they aren't attacking someone
+ - Adds in Hostile lockdown malf AI power for 30 CPU
+ - Adds break air and fire alarms malf AI powers for 50 and 25 CPU respectively
+ - AI's no longer have flood mode on air alarms by default
+ - Adds in lip reading malf AI power for 30 CPU
+ - Allows accessories to hypothetically grant armor to their wearer
+ - Greytide spear illusions actually have an attack sound now
+ - fixes the wormhole event being much shorter than intended
+
+
FreeStylaLT updated:
+
+ - Walls now melt when hot
+ - Added actual coated rwalls - you can make them by clicking on an existing rwall with at least 2 plasteel in hand. Has infinite temp resistance.
+ - Replaced all fake coated rwalls with new rwalls in both metastation (where they should be) and boxstation
+ - Bandaging someone no longer stabs your eyes with bright green
+ - Fixed repainted-to-wood metal flooring in courtroom - it's now actually wood
+ - Fixed windoor in witness stand facing the wrong way
+
+
KasparoVy updated:
+
+ - Traitors with the Maroon objective will no longer succeed if their target is in a locker on the shuttle.
+ - Traitors with the Assassination objective will no longer fail if their target is assassinated/borged/debrained but on a Z-level greater than the derelict.
+
+
Krausus updated:
+
+ - Fire will now totally consume you, rather than timidly hiding under your clothes.
+ - Admin freeze overlays should no longer disappear from humans until they're actually unfrozen.
+
+
LittleBigKid2000 updated:
+
+ - Adds cheap sunglasses. They provide no flash protection, but are available in the loadout and clothesmate.
+
+
Pinatacolada updated:
+
+ - Makes the swedish gene spit out weird swedish chars and sounds
+
+
Ty-Omaha updated:
+
+ - Fixes "is too cumbersome to carry in one hand" from showing up to other players.
+
+
Yurivw updated:
+
+ - Condimaster now actually makes bottles. Removed: Unused options in admin secret menu are now removed.
+
+
chopchop1614 updated:
+
+ - fix bluespace crystals exploit
+
+
03 August 2016
Fox McCloud updated:
diff --git a/html/changelogs/.all_changelog.yml b/html/changelogs/.all_changelog.yml
index 5d754fc7ddf..49c48046292 100644
--- a/html/changelogs/.all_changelog.yml
+++ b/html/changelogs/.all_changelog.yml
@@ -2618,3 +2618,67 @@ DO NOT EDIT THIS FILE BY HAND! AUTOMATICALLY GENERATED BY ss13_genchangelog.py.
- rscadd: Missing limbs will now be grayed out on your health doll.
chopchop1614:
- bugfix: Fixed the C4 labcoat exploding bug
+2016-08-08:
+ Ar3nn:
+ - bugfix: Telekinesis no longer is subject to meatspace problems
+ Chakirski:
+ - rscadd: Added animal AI holograms.
+ - tweak: .45 Magazine sprites for the M1911 are now longer invisible.
+ - tweak: Hoodies no longer look like labcoats while in hand.
+ - tweak: Ectoplasm spawns in cult mining rooms instead of an invisible "weapon".
+ - tweak: Duffel bag descriptions and names no longer contain "duffle".
+ - tweak: Syndicate medical duffel bags can now be seen while in hand.
+ Crazylemon64:
+ - rscadd: Adds a "Save" buildmode for admins to preserve their creations for later.
+ This is currently in an early stage, so don't be surprised by errors!
+ FlattestGuitar:
+ - tweak: Holy Water will no longer make you stutter for ages if you're not a cultist
+ Fox McCloud:
+ - bugfix: Fixes Orion Ship message being unheard when held in-hand
+ - rscadd: Adds headphones into the game as a loadout item
+ - tweak: Removes fireproof core malf AI power
+ - tweak: upgrade turrets malf AI power CPU reduced from 50 to to 30
+ - tweak: Overload machine cost increased from 15 to 20
+ - tweak: Override machine cost increased from 15 to 30
+ - tweak: can override/overload field generators again
+ - tweak: Machine uprisers will slowly die if they aren't attacking someone
+ - rscadd: Adds in Hostile lockdown malf AI power for 30 CPU
+ - rscadd: Adds break air and fire alarms malf AI powers for 50 and 25 CPU respectively
+ - tweak: AI's no longer have flood mode on air alarms by default
+ - rscadd: Adds in lip reading malf AI power for 30 CPU
+ - tweak: Allows accessories to hypothetically grant armor to their wearer
+ - bugfix: Greytide spear illusions actually have an attack sound now
+ - bugfix: fixes the wormhole event being much shorter than intended
+ FreeStylaLT:
+ - rscadd: Walls now melt when hot
+ - rscadd: Added actual coated rwalls - you can make them by clicking on an existing
+ rwall with at least 2 plasteel in hand. Has infinite temp resistance.
+ - tweak: Replaced all fake coated rwalls with new rwalls in both metastation (where
+ they should be) and boxstation
+ - tweak: Bandaging someone no longer stabs your eyes with bright green
+ - bugfix: Fixed repainted-to-wood metal flooring in courtroom - it's now actually
+ wood
+ - bugfix: Fixed windoor in witness stand facing the wrong way
+ KasparoVy:
+ - bugfix: Traitors with the Maroon objective will no longer succeed if their target
+ is in a locker on the shuttle.
+ - bugfix: Traitors with the Assassination objective will no longer fail if their
+ target is assassinated/borged/debrained but on a Z-level greater than the derelict.
+ Krausus:
+ - bugfix: Fire will now totally consume you, rather than timidly hiding under your
+ clothes.
+ - bugfix: Admin freeze overlays should no longer disappear from humans until they're
+ actually unfrozen.
+ LittleBigKid2000:
+ - rscadd: Adds cheap sunglasses. They provide no flash protection, but are available
+ in the loadout and clothesmate.
+ Pinatacolada:
+ - rscadd: Makes the swedish gene spit out weird swedish chars and sounds
+ Ty-Omaha:
+ - tweak: Fixes "is too cumbersome to carry in one hand" from showing up to other
+ players.
+ Yurivw:
+ - bugfix: 'Condimaster now actually makes bottles. Removed: Unused options in admin
+ secret menu are now removed.'
+ chopchop1614:
+ - bugfix: fix bluespace crystals exploit
diff --git a/html/changelogs/AutoChangeLog-pr-5268.yml b/html/changelogs/AutoChangeLog-pr-5268.yml
new file mode 100644
index 00000000000..776b50c2bd3
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-5268.yml
@@ -0,0 +1,5 @@
+author: Crazylemon64
+delete-after: True
+changes:
+ - bugfix: "Makes teleportation checks more consistent, which will ensure that teleporting in the away mission no longer works."
+ - bugfix: "People on the space ruins level no longer count as dead for assassinate objectives."
diff --git a/html/changelogs/AutoChangeLog-pr-5294.yml b/html/changelogs/AutoChangeLog-pr-5294.yml
deleted file mode 100644
index 0b65b93fabf..00000000000
--- a/html/changelogs/AutoChangeLog-pr-5294.yml
+++ /dev/null
@@ -1,5 +0,0 @@
-author: Yurivw
-delete-after: True
-changes:
- - bugfix: "Condimaster now actually makes bottles.
-Removed: Unused options in admin secret menu are now removed."
diff --git a/html/changelogs/AutoChangeLog-pr-5304.yml b/html/changelogs/AutoChangeLog-pr-5304.yml
deleted file mode 100644
index e069a221019..00000000000
--- a/html/changelogs/AutoChangeLog-pr-5304.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: Ar3nn
-delete-after: True
-changes:
- - bugfix: "Telekinesis no longer is subject to meatspace problems"
diff --git a/html/changelogs/AutoChangeLog-pr-5307.yml b/html/changelogs/AutoChangeLog-pr-5307.yml
deleted file mode 100644
index ab4ae44c5ab..00000000000
--- a/html/changelogs/AutoChangeLog-pr-5307.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: chopchop1614
-delete-after: True
-changes:
- - bugfix: "fix bluespace crystals exploit"
diff --git a/html/changelogs/AutoChangeLog-pr-5314.yml b/html/changelogs/AutoChangeLog-pr-5314.yml
deleted file mode 100644
index 008c0e991a4..00000000000
--- a/html/changelogs/AutoChangeLog-pr-5314.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: Chakirski
-delete-after: True
-changes:
- - rscadd: "Added animal AI holograms."
diff --git a/html/changelogs/AutoChangeLog-pr-5316.yml b/html/changelogs/AutoChangeLog-pr-5316.yml
deleted file mode 100644
index ce7347d2416..00000000000
--- a/html/changelogs/AutoChangeLog-pr-5316.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: Crazylemon64
-delete-after: True
-changes:
- - rscadd: "Adds a \"Save\" buildmode for admins to preserve their creations for later. This is currently in an early stage, so don't be surprised by errors!"
diff --git a/html/changelogs/AutoChangeLog-pr-5318.yml b/html/changelogs/AutoChangeLog-pr-5318.yml
deleted file mode 100644
index b5e8a6672af..00000000000
--- a/html/changelogs/AutoChangeLog-pr-5318.yml
+++ /dev/null
@@ -1,6 +0,0 @@
-author: Chakirski
-delete-after: True
-changes:
- - tweak: ".45 Magazine sprites for the M1911 are now longer invisible."
- - tweak: "Hoodies no longer look like labcoats while in hand."
- - tweak: "Ectoplasm spawns in cult mining rooms instead of an invisible \"weapon\"."
diff --git a/html/changelogs/AutoChangeLog-pr-5324.yml b/html/changelogs/AutoChangeLog-pr-5324.yml
deleted file mode 100644
index 787066361ff..00000000000
--- a/html/changelogs/AutoChangeLog-pr-5324.yml
+++ /dev/null
@@ -1,5 +0,0 @@
-author: Krausus
-delete-after: True
-changes:
- - bugfix: "Fire will now totally consume you, rather than timidly hiding under your clothes."
- - bugfix: "Admin freeze overlays should no longer disappear from humans until they're actually unfrozen."
diff --git a/html/changelogs/AutoChangeLog-pr-5325.yml b/html/changelogs/AutoChangeLog-pr-5325.yml
new file mode 100644
index 00000000000..e7c5b3292b4
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-5325.yml
@@ -0,0 +1,4 @@
+author: DaveTheHeadcrab
+delete-after: True
+changes:
+ - tweak: "ERT gloves reverted to how they used to be."
diff --git a/html/changelogs/AutoChangeLog-pr-5327.yml b/html/changelogs/AutoChangeLog-pr-5327.yml
deleted file mode 100644
index 31acf5637ac..00000000000
--- a/html/changelogs/AutoChangeLog-pr-5327.yml
+++ /dev/null
@@ -1,5 +0,0 @@
-author: Chakirski
-delete-after: True
-changes:
- - tweak: "Duffel bag descriptions and names no longer contain \"duffle\"."
- - tweak: "Syndicate medical duffel bags can now be seen while in hand."
diff --git a/html/changelogs/AutoChangeLog-pr-5328.yml b/html/changelogs/AutoChangeLog-pr-5328.yml
deleted file mode 100644
index a1a05400981..00000000000
--- a/html/changelogs/AutoChangeLog-pr-5328.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: Pinatacolada
-delete-after: True
-changes:
- - rscadd: "Makes the swedish gene spit out weird swedish chars and sounds"
diff --git a/html/changelogs/AutoChangeLog-pr-5334.yml b/html/changelogs/AutoChangeLog-pr-5334.yml
deleted file mode 100644
index 70d782a6495..00000000000
--- a/html/changelogs/AutoChangeLog-pr-5334.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: FlattestGuitar
-delete-after: True
-changes:
- - tweak: "Holy Water will no longer make you stutter for ages if you're not a cultist"
diff --git a/html/changelogs/AutoChangeLog-pr-5335.yml b/html/changelogs/AutoChangeLog-pr-5335.yml
deleted file mode 100644
index 966191626e5..00000000000
--- a/html/changelogs/AutoChangeLog-pr-5335.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: Ty-Omaha
-delete-after: True
-changes:
- - tweak: "Fixes \"is too cumbersome to carry in one hand\" from showing up to other players."
diff --git a/html/changelogs/AutoChangeLog-pr-5344.yml b/html/changelogs/AutoChangeLog-pr-5344.yml
deleted file mode 100644
index 502d5b7841a..00000000000
--- a/html/changelogs/AutoChangeLog-pr-5344.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: Fox McCloud
-delete-after: True
-changes:
- - bugfix: "Fixes Orion Ship message being unheard when held in-hand"
diff --git a/html/changelogs/AutoChangeLog-pr-5346.yml b/html/changelogs/AutoChangeLog-pr-5346.yml
deleted file mode 100644
index b629893f0c1..00000000000
--- a/html/changelogs/AutoChangeLog-pr-5346.yml
+++ /dev/null
@@ -1,5 +0,0 @@
-author: KasparoVy
-delete-after: True
-changes:
- - bugfix: "Traitors with the Maroon objective will no longer succeed if their target is in a locker on the shuttle."
- - bugfix: "Traitors with the Assassination objective will no longer fail if their target is assassinated/borged/debrained but on a Z-level greater than the derelict."
diff --git a/html/changelogs/AutoChangeLog-pr-5348.yml b/html/changelogs/AutoChangeLog-pr-5348.yml
deleted file mode 100644
index 2ab1d83f483..00000000000
--- a/html/changelogs/AutoChangeLog-pr-5348.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: LittleBigKid2000
-delete-after: True
-changes:
- - rscadd: "Adds cheap sunglasses. They provide no flash protection, but are available in the loadout and clothesmate."
diff --git a/html/changelogs/AutoChangeLog-pr-5349.yml b/html/changelogs/AutoChangeLog-pr-5349.yml
deleted file mode 100644
index 276d4ac6ad6..00000000000
--- a/html/changelogs/AutoChangeLog-pr-5349.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: Fox McCloud
-delete-after: True
-changes:
- - rscadd: "Adds headphones into the game as a loadout item"
diff --git a/html/changelogs/AutoChangeLog-pr-5387.yml b/html/changelogs/AutoChangeLog-pr-5387.yml
new file mode 100644
index 00000000000..c7f5aeeea9d
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-5387.yml
@@ -0,0 +1,4 @@
+author: Alexshreds
+delete-after: True
+changes:
+ - tweak: "pAIs can see the crew manifest again."
diff --git a/html/changelogs/AutoChangeLog-pr-5399.yml b/html/changelogs/AutoChangeLog-pr-5399.yml
new file mode 100644
index 00000000000..a1c8ac36b2c
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-5399.yml
@@ -0,0 +1,4 @@
+author: taukausanake
+delete-after: True
+changes:
+ - bugfix: "Gives proper mix_messages for Uplink, Synthignon, and Synth 'n Soda drinks"
diff --git a/html/changelogs/AutoChangeLog-pr-5405.yml b/html/changelogs/AutoChangeLog-pr-5405.yml
new file mode 100644
index 00000000000..7a71aa7179e
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-5405.yml
@@ -0,0 +1,4 @@
+author: Fethas
+delete-after: True
+changes:
+ - bugfix: "The whitelist will respect addons better, didn't even have to make a ban appeal.."
diff --git a/icons/obj/clothing/gloves.dmi b/icons/obj/clothing/gloves.dmi
index 4a41556989a..48d253c16cb 100644
Binary files a/icons/obj/clothing/gloves.dmi and b/icons/obj/clothing/gloves.dmi differ
diff --git a/icons/obj/clothing/hats.dmi b/icons/obj/clothing/hats.dmi
index 25ec0162866..9300bec995d 100644
Binary files a/icons/obj/clothing/hats.dmi and b/icons/obj/clothing/hats.dmi differ
diff --git a/nano/templates/pai_manifest.tmpl b/nano/templates/pai_manifest.tmpl
index 447f7ede7c5..d6827594e35 100644
--- a/nano/templates/pai_manifest.tmpl
+++ b/nano/templates/pai_manifest.tmpl
@@ -4,95 +4,95 @@ code/modules/mob/living/silicon/pai/software_modules.dm
Copy-pasted from pda.tmpl
-->
-
-
- {{if data.manifest.heads}}
- | Command |
- {{for data.manifest["heads"]}}
- {{if value.rank == "Captain"}}
- | {{:value.name}} | {{:value.rank}} | {{:value.active}} |
- {{else}}
- | {{:value.name}} | {{:value.rank}} | {{:value.active}} |
- {{/if}}
- {{/for}}
- {{/if}}
- {{if data.manifest.sec}}
- | Security |
- {{for data.manifest["sec"]}}
- {{if value.rank == "Head of Security"}}
- | {{:value.name}} | {{:value.rank}} | {{:value.active}} |
- {{else}}
- | {{:value.name}} | {{:value.rank}} | {{:value.active}} |
- {{/if}}
- {{/for}}
- {{/if}}
- {{if data.manifest.eng}}
- | Engineering |
- {{for data.manifest["eng"]}}
- {{if value.rank == "Chief Engineer"}}
- | {{:value.name}} | {{:value.rank}} | {{:value.active}} |
- {{else}}
- | {{:value.name}} | {{:value.rank}} | {{:value.active}} |
- {{/if}}
- {{/for}}
- {{/if}}
- {{if data.manifest.med}}
- | Medical |
- {{for data.manifest["med"]}}
- {{if value.rank == "Chief Medical Officer"}}
- | {{:value.name}} | {{:value.rank}} | {{:value.active}} |
- {{else}}
- | {{:value.name}} | {{:value.rank}} | {{:value.active}} |
- {{/if}}
- {{/for}}
- {{/if}}
- {{if data.manifest.sci}}
- | Science |
- {{for data.manifest["sci"]}}
- {{if value.rank == "Research Director"}}
- | {{:value.name}} | {{:value.rank}} | {{:value.active}} |
- {{else}}
- | {{:value.name}} | {{:value.rank}} | {{:value.active}} |
- {{/if}}
- {{/for}}
- {{/if}}
- {{if data.manifest.ser}}
- | Service |
- {{for data.manifest["ser"]}}
- {{if value.rank == "Head of Personnel"}}
- | {{:value.name}} | {{:value.rank}} | {{:value.active}} |
- {{else}}
- | {{:value.name}} | {{:value.rank}} | {{:value.active}} |
- {{/if}}
- {{/for}}
- {{/if}}
- {{if data.manifest.sup}}
- | Supply |
- {{for data.manifest["sup"]}}
- {{if value.rank == "Head of Personnel"}}
- | {{:value.name}} | {{:value.rank}} | {{:value.active}} |
- {{else value.rank == "Quartermaster"}}
- | {{:value.name}} | {{:value.rank}} | {{:value.active}} |
- {{else}}
- | {{:value.name}} | {{:value.rank}} | {{:value.active}} |
- {{/if}}
- {{/for}}
- {{/if}}
- {{if data.manifest.civ}}
- | Civilian |
- {{for data.manifest["civ"]}}
- {{if value.rank == "Head of Personnel"}}
- | {{:value.name}} | {{:value.rank}} | {{:value.active}} |
- {{else}}
- | {{:value.name}} | {{:value.rank}} | {{:value.active}} |
- {{/if}}
- {{/for}}
- {{/if}}
- {{if data.manifest.misc}}
- | Misc |
- {{for data.manifest["misc"]}}
- | {{:value.name}} | {{:value.rank}} | {{:value.active}} |
- {{/for}}
- {{/if}}
-
-
\ No newline at end of file
+
+
+ {{if data.manifest.heads}}
+ | Command |
+ {{for data.manifest["heads"]}}
+ {{if value.rank == "Captain"}}
+ | {{:value.name}} | {{:value.rank}} | {{:value.active}} |
+ {{else}}
+ | {{:value.name}} | {{:value.rank}} | {{:value.active}} |
+ {{/if}}
+ {{/for}}
+ {{/if}}
+ {{if data.manifest.sec}}
+ | Security |
+ {{for data.manifest["sec"]}}
+ {{if value.rank == "Head of Security"}}
+ | {{:value.name}} | {{:value.rank}} | {{:value.active}} |
+ {{else}}
+ | {{:value.name}} | {{:value.rank}} | {{:value.active}} |
+ {{/if}}
+ {{/for}}
+ {{/if}}
+ {{if data.manifest.eng}}
+ | Engineering |
+ {{for data.manifest["eng"]}}
+ {{if value.rank == "Chief Engineer"}}
+ | {{:value.name}} | {{:value.rank}} | {{:value.active}} |
+ {{else}}
+ | {{:value.name}} | {{:value.rank}} | {{:value.active}} |
+ {{/if}}
+ {{/for}}
+ {{/if}}
+ {{if data.manifest.med}}
+ | Medical |
+ {{for data.manifest["med"]}}
+ {{if value.rank == "Chief Medical Officer"}}
+ | {{:value.name}} | {{:value.rank}} | {{:value.active}} |
+ {{else}}
+ | {{:value.name}} | {{:value.rank}} | {{:value.active}} |
+ {{/if}}
+ {{/for}}
+ {{/if}}
+ {{if data.manifest.sci}}
+ | Science |
+ {{for data.manifest["sci"]}}
+ {{if value.rank == "Research Director"}}
+ | {{:value.name}} | {{:value.rank}} | {{:value.active}} |
+ {{else}}
+ | {{:value.name}} | {{:value.rank}} | {{:value.active}} |
+ {{/if}}
+ {{/for}}
+ {{/if}}
+ {{if data.manifest.ser}}
+ | Service |
+ {{for data.manifest["ser"]}}
+ {{if value.rank == "Head of Personnel"}}
+ | {{:value.name}} | {{:value.rank}} | {{:value.active}} |
+ {{else}}
+ | {{:value.name}} | {{:value.rank}} | {{:value.active}} |
+ {{/if}}
+ {{/for}}
+ {{/if}}
+ {{if data.manifest.sup}}
+ | Supply |
+ {{for data.manifest["sup"]}}
+ {{if value.rank == "Head of Personnel"}}
+ | {{:value.name}} | {{:value.rank}} | {{:value.active}} |
+ {{else value.rank == "Quartermaster"}}
+ | {{:value.name}} | {{:value.rank}} | {{:value.active}} |
+ {{else}}
+ | {{:value.name}} | {{:value.rank}} | {{:value.active}} |
+ {{/if}}
+ {{/for}}
+ {{/if}}
+ {{if data.manifest.civ}}
+ | Civilian |
+ {{for data.manifest["civ"]}}
+ {{if value.rank == "Head of Personnel"}}
+ | {{:value.name}} | {{:value.rank}} | {{:value.active}} |
+ {{else}}
+ | {{:value.name}} | {{:value.rank}} | {{:value.active}} |
+ {{/if}}
+ {{/for}}
+ {{/if}}
+ {{if data.manifest.misc}}
+ | Misc |
+ {{for data.manifest["misc"]}}
+ | {{:value.name}} | {{:value.rank}} | {{:value.active}} |
+ {{/for}}
+ {{/if}}
+
+
diff --git a/paradise.dme b/paradise.dme
index ce23ebbe8a4..7801d64095f 100644
--- a/paradise.dme
+++ b/paradise.dme
@@ -2001,6 +2001,8 @@
#include "code\modules\shuttle\supply.dm"
#include "code\modules\shuttle\syndicate.dm"
#include "code\modules\space_management\heap_space_level.dm"
+#include "code\modules\space_management\level_check.dm"
+#include "code\modules\space_management\level_traits.dm"
#include "code\modules\space_management\space_chunk.dm"
#include "code\modules\space_management\space_level.dm"
#include "code\modules\space_management\space_transition.dm"